package ilarkesto.base.time; import ilarkesto.base.Str; import ilarkesto.base.Tm; import java.util.Locale; public final class TimePeriod implements Comparable<TimePeriod> { public static void main(String[] args) { System.out.println(new TimePeriod("03:0").toHoursAndMinutesString()); } public static final TimePeriod ZERO = new TimePeriod(0); private long millis; public TimePeriod(long millis) { this.millis = Math.abs(millis); } public TimePeriod(String s) { if (s.indexOf(':') >= 0) { millis = 0; String[] sa = Str.tokenize(s, ":"); if (sa.length != 2) throw new RuntimeException("Illegal TimePeriod: " + s); millis += Integer.parseInt(sa[0]) * Tm.HOUR; millis += Integer.parseInt(sa[1]) * Tm.MINUTE; } else { this.millis = Long.parseLong(s); } } public TimePeriod abs() { return millis < 0 ? new TimePeriod(-millis) : this; } 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 int toWeeks() { return toDays() / 7; } public boolean isGreaterThen(TimePeriod other) { return millis > other.millis; } public boolean isLessThen(TimePeriod other) { return millis < other.millis; } public TimePeriod divide(int divisor) { return new TimePeriod(millis / divisor); } public TimePeriod add(TimePeriod tp) { return new TimePeriod(millis + tp.millis); } public TimePeriod subtract(TimePeriod tp) { return new TimePeriod(millis - tp.millis); } public TimePeriod subtract(Time time) { return new TimePeriod(millis - time.toMillis()); } public TimePeriod multiplyBy(double factor) { return new TimePeriod(Math.round(millis * factor)); } public String toHoursAndMinutesString() { long hours = toHours(); long minutes = toMinutes() - (hours * 60); StringBuilder sb = new StringBuilder(); sb.append(hours); sb.append(':'); if (minutes < 10) sb.append('0'); sb.append(minutes); return sb.toString(); } public String toShortestString(Locale locale) { StringBuilder sb = new StringBuilder(); if (millis >= (Tm.WEEK * 2)) { int i = toWeeks(); sb.append(i); sb.append(" Wo."); } else if (millis >= Tm.DAY) { int i = toDays(); sb.append(i); sb.append(" Tag."); } else if (millis >= ((Tm.HOUR * 2) - (Tm.MINUTE - 20))) { long l = toHours(); sb.append(l); sb.append(" Std."); } else if (millis >= Tm.MINUTE) { long l = toMinutes(); sb.append(l); sb.append(" Min."); } else if (millis >= Tm.SECOND) { long l = toSeconds(); sb.append(l); sb.append(" Sek."); } else { sb.append(millis); sb.append(" ms."); } return sb.toString(); } // --- Comparable --- public int compareTo(TimePeriod o) { if (millis == o.millis) return 0; return millis > o.millis ? 1 : -1; } // --- Object --- private int hashCode; @Override public int hashCode() { if (hashCode == 0) { hashCode = 23 * 37 + (int) (millis ^ (millis >>> 32)); } return hashCode; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof TimePeriod)) return false; return millis == ((TimePeriod) obj).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); } }