package org.ripple.power.timer; import java.io.Serializable; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; public class Day extends RegularTimer implements Serializable { /** * */ private static final long serialVersionUID = 1L; protected static final DateFormat DATE_FORMAT = new SimpleDateFormat( "yyyy-MM-dd"); protected static final DateFormat DATE_FORMAT_SHORT = DateFormat .getDateInstance(DateFormat.SHORT); protected static final DateFormat DATE_FORMAT_MEDIUM = DateFormat .getDateInstance(DateFormat.MEDIUM); protected static final DateFormat DATE_FORMAT_LONG = DateFormat .getDateInstance(DateFormat.LONG); private SerialDate serialDate; private long firstMillisecond; private long lastMillisecond; public Day() { this(new Date()); } public Day(int day, int month, int year) { this.serialDate = SerialDate.createInstance(day, month, year); peg(Calendar.getInstance()); } public Day(SerialDate serialDate) { this.serialDate = serialDate; peg(Calendar.getInstance()); } public Day(Date time) { this(time, TimeZone.getDefault(), Locale.getDefault()); } public Day(Date time, TimeZone zone) { this(time, zone, Locale.getDefault()); } public Day(Date time, TimeZone zone, Locale locale) { Calendar calendar = Calendar.getInstance(zone, locale); calendar.setTime(time); int d = calendar.get(Calendar.DAY_OF_MONTH); int m = calendar.get(Calendar.MONTH) + 1; int y = calendar.get(Calendar.YEAR); this.serialDate = SerialDate.createInstance(d, m, y); peg(calendar); } public SerialDate getSerialDate() { return this.serialDate; } public int getYear() { return this.serialDate.getYYYY(); } public int getMonth() { return this.serialDate.getMonth(); } public int getDayOfMonth() { return this.serialDate.getDayOfMonth(); } @Override public long getFirstMillisecond() { return this.firstMillisecond; } @Override public long getLastMillisecond() { return this.lastMillisecond; } @Override public void peg(Calendar calendar) { this.firstMillisecond = getFirstMillisecond(calendar); this.lastMillisecond = getLastMillisecond(calendar); } @Override public RegularTimer previous() { Day result; int serial = this.serialDate.toSerial(); if (serial > SerialDate.SERIAL_LOWER_BOUND) { SerialDate yesterday = SerialDate.createInstance(serial - 1); return new Day(yesterday); } else { result = null; } return result; } @Override public RegularTimer next() { Day result; int serial = this.serialDate.toSerial(); if (serial < SerialDate.SERIAL_UPPER_BOUND) { SerialDate tomorrow = SerialDate.createInstance(serial + 1); return new Day(tomorrow); } else { result = null; } return result; } @Override public long getSerialIndex() { return this.serialDate.toSerial(); } @Override public long getFirstMillisecond(Calendar calendar) { int year = this.serialDate.getYYYY(); int month = this.serialDate.getMonth(); int day = this.serialDate.getDayOfMonth(); calendar.clear(); calendar.set(year, month - 1, day, 0, 0, 0); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTimeInMillis(); } @Override public long getLastMillisecond(Calendar calendar) { int year = this.serialDate.getYYYY(); int month = this.serialDate.getMonth(); int day = this.serialDate.getDayOfMonth(); calendar.clear(); calendar.set(year, month - 1, day, 23, 59, 59); calendar.set(Calendar.MILLISECOND, 999); return calendar.getTimeInMillis(); } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (!(obj instanceof Day)) { return false; } Day that = (Day) obj; if (!this.serialDate.equals(that.getSerialDate())) { return false; } return true; } @Override public int hashCode() { return this.serialDate.hashCode(); } @Override public int compareTo(Object o1) { int result; if (o1 instanceof Day) { Day d = (Day) o1; result = -d.getSerialDate().compare(this.serialDate); } else if (o1 instanceof RegularTimer) { result = 0; } else { result = 1; } return result; } @Override public String toString() { return this.serialDate.toString(); } public static Day parseDay(String s) { try { return new Day(Day.DATE_FORMAT.parse(s)); } catch (ParseException e1) { try { return new Day(Day.DATE_FORMAT_SHORT.parse(s)); } catch (ParseException e2) { } } return null; } }