package ilarkesto.base.time; import ilarkesto.base.Tm; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.GregorianCalendar; import java.util.Locale; public class Time implements Comparable { public static final transient SimpleDateFormat FORMAT_HOUR_MINUTE_SECOND = new SimpleDateFormat("HH:mm:ss"); public static final transient SimpleDateFormat FORMAT_HOUR_MINUTE_SECOND_NOSEP = new SimpleDateFormat("HHmmss"); public static final transient SimpleDateFormat FORMAT_HOUR_MINUTE = new SimpleDateFormat("HH:mm"); private int hour; private int minute; private int second; public Time(int hour, int minute) { this(hour, minute, 0); } public Time(int hour, int minute, int second) { this.hour = hour; this.minute = minute; this.second = second; } public Time(String timeString) { int idx = timeString.indexOf(':'); if (idx >= 0) { hour = Integer.parseInt(timeString.substring(0, idx)); timeString = timeString.substring(idx + 1); } else { hour = Integer.parseInt(timeString); return; } idx = timeString.indexOf(':'); if (idx >= 0) { minute = Integer.parseInt(timeString.substring(0, idx)); timeString = timeString.substring(idx + 1); } else { minute = Integer.parseInt(timeString); return; } second = Integer.parseInt(timeString); } public Time(GregorianCalendar calendar) { this(calendar.get(GregorianCalendar.HOUR_OF_DAY), calendar.get(GregorianCalendar.MINUTE), calendar .get(GregorianCalendar.SECOND)); } public long toMillis() { return (second * Tm.SECOND) + (minute * Tm.MINUTE) + (hour * Tm.HOUR); } public int getHour() { return hour; } public int getMinute() { return minute; } public int getSecond() { return second; } public boolean isBefore(Time other) { return compareTo(other) < 0; } public boolean isBeforeOrSame(Time other) { return compareTo(other) <= 0; } public boolean isAfter(Time other) { return compareTo(other) > 0; } public boolean isAfterOrSame(Time other) { return compareTo(other) >= 0; } public TimePeriod getPeriodTo(Time other) { return new TimePeriod(other.toMillis() - toMillis()); } // --- Comparable --- public final int compareTo(Object o) { Time other = (Time) o; if (hour > other.hour) return 1; if (hour < other.hour) return -1; if (minute > other.minute) return 1; if (minute < other.minute) return -1; if (second > other.second) return 1; if (second < other.second) return -1; return 0; } public final java.util.Date toJavaDate(Date day) { return new java.util.Date(day.toMillis() + toMillis()); } public final String toString(DateFormat format) { return format.format(toJavaDate(Date.today())); } public final String toString(Locale locale) { StringBuilder sb = new StringBuilder(); if (hour < 10) sb.append("0"); sb.append(hour); sb.append(":"); if (minute < 10) sb.append("0"); sb.append(minute); return sb.toString(); } // --- Object --- private transient int hashCode; @Override public int hashCode() { if (hashCode == 0) { hashCode = 23; hashCode = hashCode * 37 + hour; hashCode = hashCode * 37 + minute; hashCode = hashCode * 37 + second; } return hashCode; } @Override public final boolean equals(Object obj) { if (obj == null) return false; Time other = (Time) obj; return hour == other.hour && minute == other.minute && second == other.second; } @Override public final String toString() { // TODO cache string StringBuilder sb = new StringBuilder(); if (hour < 10) sb.append("0"); sb.append(hour); sb.append(":"); if (minute < 10) sb.append("0"); sb.append(minute); if (second > 0) { sb.append(":"); if (second < 10) sb.append("0"); sb.append(second); } return sb.toString(); } // --- static --- public static String toStringBeginEnd(Time begin, Time end) { if (begin == null && end == null) return null; StringBuilder sb = new StringBuilder(); if (begin != null) { sb.append(begin); } if (end != null) { sb.append("-"); sb.append(end); } return sb.toString(); } public static Time now() { GregorianCalendar gc = new GregorianCalendar(); return new Time(gc.get(GregorianCalendar.HOUR_OF_DAY), gc.get(GregorianCalendar.MINUTE), gc .get(GregorianCalendar.SECOND)); } }