package ilarkesto.gwt.client; import java.io.Serializable; import com.google.gwt.user.client.rpc.IsSerializable; public class TimePeriod implements Comparable<TimePeriod>, Serializable, IsSerializable { public static final transient long SECOND = 1000; public static final transient long MINUTE = SECOND * 60; public static final transient long HOUR = MINUTE * 60; public static final transient long DAY = HOUR * 24; public static final transient long WEEK = DAY * 7; public static final transient long MONTH = DAY * 30; public static final transient long YEAR = DAY * 360; private long millis; TimePeriod() { this(0); } public TimePeriod(long millis) { this.millis = millis; } public TimePeriod(String s) { this.millis = Long.parseLong(s); } public TimePeriod subtract(TimePeriod difference) { return new TimePeriod(millis - difference.millis); } public TimePeriod add(TimePeriod summand) { return new TimePeriod(millis + summand.millis); } public TimePeriod multiplyBy(int factor) { return new TimePeriod(millis * factor); } public TimePeriod abs() { return millis < 0 ? new TimePeriod(-millis) : this; } public TimePeriod getPeriodTo(Time other) { return new TimePeriod(other.toMillis() - toMillis()); } public String toShortestString() { StringBuilder sb = new StringBuilder(); long m = millis >= 0 ? millis : -millis; if (m >= (MONTH * 2)) { int i = toMonths(); sb.append(i); sb.append(i == 1 ? " month" : " months"); } else if (m >= (WEEK * 2)) { int i = toWeeks(); sb.append(i); sb.append(i == 1 ? " week" : " weeks"); } else if (m >= DAY) { int i = toDays(); sb.append(i); sb.append(i == 1 ? " day" : " days"); } else if (m >= ((HOUR * 2) - (MINUTE - 20))) { long l = toHours(); sb.append(l); sb.append(l == 1 ? " hour" : " hours"); } else if (m >= MINUTE) { long l = toMinutes(); sb.append(l); sb.append(l == 1 ? " minute" : " minutes"); } else if (m >= SECOND) { long l = toSeconds(); sb.append(l); sb.append(l == 1 ? " second" : " seconds"); } else { sb.append(m); sb.append(" millis"); } return sb.toString(); } public long toMillis() { return millis; } public long toSeconds() { return millis / 1000; } public long toMinutes() { return toSeconds() / 60; } public long toHours() { return toMinutes() / 60; } public int toDays() { return (int) (toHours() / 24); } public boolean isNegative() { return millis < 0; } public boolean isPositive() { return millis > 0; } public int toWeeks() { return toDays() / 7; } public int toMonths() { return toDays() / 30; } public int toYears() { return toDays() / 360; } public String toHoursAndMinutes() { long hours = toHours(); long remainingMillis = millis - (hours * 3600000); long minutes = remainingMillis / 60000; return hours + (minutes > 9 ? ":" : ":0") + minutes; } @Override public int compareTo(TimePeriod o) { if (millis == o.millis) return 0; return millis > o.millis ? 1 : -1; } @Override public int hashCode() { return (int) millis; } @Override public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof TimePeriod)) return false; return ((TimePeriod) obj).millis == millis; } @Override public String toString() { return String.valueOf(millis); } public static TimePeriod seconds(int seconds) { return new TimePeriod(seconds * 1000); } public static TimePeriod minutes(int minutes) { return seconds(minutes * 60); } public static TimePeriod hours(int hours) { return minutes(hours * 60); } public static TimePeriod days(int days) { return hours(days * 24); } public static TimePeriod weeks(int weeks) { return days(weeks * 7); } }