package bruce.lib; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import java.util.TreeSet; public class DateTime implements Serializable, Cloneable, Comparable<DateTime> { public static DateTime now() { return new DateTime(); } public static DateTime fromDate(Date date) { DateTime d = new DateTime(); d.c.setTime(date); return d; } public static DateTime fromTimestamp(long stamp) { DateTime d = new DateTime(); d.c.setTimeInMillis(stamp); return d; } public static DateTime fromCalendar(Calendar c) { DateTime d = new DateTime(); d.c = c; return d; } public static DateTime fromString(String date, String format) throws ParseException { DateTime d = new DateTime(); d.c.setTime(new SimpleDateFormat(format).parse(date)); return d; } public static DateTime fromString(String date, String format, Locale locale) throws ParseException { DateTime d = new DateTime(); d.c.setTime(new SimpleDateFormat(format, locale).parse(date)); return d; } public static DateTime latest(DateTime... dates) { TreeSet<DateTime> set = new TreeSet<DateTime>(); set.addAll(Arrays.asList(dates)); return set.last(); } public static DateTime oldest(DateTime... dates) { TreeSet<DateTime> set = new TreeSet<DateTime>(); set.addAll(Arrays.asList(dates)); return set.first(); } private Calendar c; public enum Field { ERA, // AD/BC YEAR, // MONTH, // WEEK_OF_YEAR, // WEEK_OF_MONTH, // AM_PM_MARKER, // AM/PM DATE, // DAY_OF_MONTH, // DAY_OF_WEEK, // DAY_OF_WEEK_IN_MONTH, // DAY_OF_YEAR, // HOUR, // MINUTE, // SECOND, // MILLISECOND, // TIMEZONE } public class Month { public static final int JANUARY = 0; public static final int FEBRUARY = 1; public static final int MARCH = 2; public static final int APRIL = 3; public static final int MAY = 4; public static final int JUNE = 5; public static final int JULY = 6; public static final int AUGUST = 7; public static final int SEPTEMBER = 8; public static final int OCTOBER = 9; public static final int NOVEMBER = 10; public static final int DECEMBER = 11; public static final int UNDECIMBER = 12; } public class Day { public static final int SUNDAY = 1; public static final int MONDAY = 2; public static final int TUESDAY = 3; public static final int WEDNESDAY = 4; public static final int THURSDAY = 5; public static final int FRIDAY = 6; public static final int SATURDAY = 7; } private DateTime() { this.c = Calendar.getInstance(); } public boolean after(DateTime datetime) { return this.toTimeInMillis() > datetime.toTimeInMillis(); } public boolean before(DateTime datetime) { return this.toTimeInMillis() < datetime.toTimeInMillis(); } public DateTime add(Field field, int amount) { switch (field) { case YEAR: this.c.add(Calendar.YEAR, amount); return this; case MONTH: this.c.add(Calendar.MONTH, amount); return this; case WEEK_OF_YEAR: case WEEK_OF_MONTH: this.c.add(Calendar.DATE, amount * 7); return this; case DATE: case DAY_OF_MONTH: case DAY_OF_WEEK: case DAY_OF_WEEK_IN_MONTH: case DAY_OF_YEAR: this.c.add(Calendar.DATE, amount); return this; case MINUTE: this.c.add(Calendar.MINUTE, amount); return this; case SECOND: this.c.add(Calendar.SECOND, amount); return this; case HOUR: this.c.add(Calendar.HOUR, amount); return this; case MILLISECOND: this.c.add(Calendar.MILLISECOND, amount); return this; default: throw new IllegalArgumentException("Unaccepted field."); } } public DateTime addYear(int amount) { return this.add(Field.YEAR, amount); } public DateTime addMonth(int amount) { return this.add(Field.MONTH, amount); } public DateTime addWeek(int amount) { return this.add(Field.WEEK_OF_YEAR, amount); } public DateTime addDay(int amount) { return this.add(Field.DAY_OF_YEAR, amount); } public DateTime addMinute(int amount) { return this.add(Field.MINUTE, amount); } public DateTime addSecond(int amount) { return this.add(Field.SECOND, amount); } public DateTime addHour(int amount) { return this.add(Field.HOUR, amount); } public DateTime addMilliSecond(int amount) { return this.add(Field.MILLISECOND, amount); } public DateTime set(Field field, int value) { switch (field) { // case ERA: case YEAR: this.c.set(Calendar.YEAR, value); return this; case MONTH: this.c.set(Calendar.MONTH, value); return this; // case WEEK_OF_YEAR: // case WEEK_OF_MONTH: // case AM_PM_MARKER: case DATE: this.c.set(Calendar.DATE, value); return this; // case DAY_OF_MONTH: // case DAY_OF_WEEK: // case DAY_OF_WEEK_IN_MONTH: // case DAY_OF_YEAR: case HOUR: this.c.set(Calendar.HOUR, value); return this; case MINUTE: this.c.set(Calendar.MINUTE, value); return this; case SECOND: this.c.set(Calendar.SECOND, value); return this; case MILLISECOND: this.c.set(Calendar.MILLISECOND, value); return this; // case TIMEZONE: default: throw new IllegalArgumentException("Unaccepted field."); } } public DateTime setYear(int value) { return this.set(Field.YEAR, value); } public DateTime setMonth(int value) { return this.set(Field.MONTH, value); } public DateTime setDate(int value) { return this.set(Field.DATE, value); } public DateTime setHour(int value) { return this.set(Field.HOUR, value); } public DateTime setMinute(int value) { return this.set(Field.MINUTE, value); } public DateTime setSecond(int value) { return this.set(Field.SECOND, value); } public DateTime setMilliSecond(int value) { return this.set(Field.MILLISECOND, value); } public int get(Field field) { switch (field) { case YEAR: return this.c.get(Calendar.YEAR); case MONTH: return this.c.get(Calendar.MONTH); case WEEK_OF_YEAR: return this.c.get(Calendar.WEEK_OF_YEAR); case WEEK_OF_MONTH: return this.c.get(Calendar.WEEK_OF_MONTH); case DATE: return this.c.get(Calendar.DATE); case DAY_OF_MONTH: return this.c.get(Calendar.DAY_OF_MONTH); case DAY_OF_WEEK: return this.c.get(Calendar.DAY_OF_WEEK); case DAY_OF_WEEK_IN_MONTH: return this.c.get(Calendar.DAY_OF_WEEK_IN_MONTH); case DAY_OF_YEAR: return this.c.get(Calendar.DAY_OF_YEAR); case MINUTE: return this.c.get(Calendar.MINUTE); case SECOND: return this.c.get(Calendar.SECOND); case HOUR: return this.c.get(Calendar.HOUR); case MILLISECOND: return this.c.get(Calendar.MILLISECOND); default: throw new IllegalArgumentException("Unaccepted field."); } } public int getYear() { return this.get(Field.YEAR); } public int getMonth() { return this.get(Field.MONTH); } public int getWeekOfYear() { return this.get(Field.WEEK_OF_YEAR); } public int getWeekOfMonth() { return this.get(Field.WEEK_OF_MONTH); } public int getDate() { return this.get(Field.DATE); } public int getDayOfMonth() { return this.get(Field.DAY_OF_MONTH); } public int getDayOfWeek() { return this.get(Field.DAY_OF_WEEK); } public int getDayOfWeekInMonth() { return this.get(Field.DAY_OF_WEEK_IN_MONTH); } public int getDayOfYear() { return this.get(Field.DAY_OF_YEAR); } public int getHour() { return this.get(Field.HOUR); } public int getMinute() { return this.get(Field.MINUTE); } public int getSecond() { return this.get(Field.SECOND); } public int getMilliSecond() { return this.get(Field.MILLISECOND); } public TimeZone getTimeZone() { return this.c.getTimeZone(); } public DateTime setTimeZone(TimeZone zone) { this.c.setTimeZone(zone); return this; } public long toTimeInMillis() { return this.c.getTimeInMillis(); } public Date toDate() { return this.c.getTime(); } public Calendar toCalendar() { return this.c; } @Override public String toString() { return this.c.getTime().toString(); } public String toString(String format) { SimpleDateFormat f = new SimpleDateFormat(format); return f.format(this.c.getTime()); } public String toString(String format, Locale locale) { SimpleDateFormat f = new SimpleDateFormat(format, locale); return f.format(this.c.getTime()); } @Override public int hashCode() { return c.getTime().hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DateTime other = (DateTime) obj; return this.c.getTimeInMillis() == other.toTimeInMillis(); } @Override public int compareTo(DateTime o) { return (int) (this.toTimeInMillis() - o.toTimeInMillis()); } }