package in.partake.base; import in.partake.resource.Constants; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; // Since java.util.Date is mutable, We prefer to use DateTime instead. // Keep DateTime immutable object. public final class DateTime implements Comparable<DateTime> { private long millis; public DateTime(long millis) { this.millis = millis; } public DateTime(Date date) { this.millis = date.getTime(); } public long getTime() { return millis; } public Date toDate() { return new Date(millis); } @Override public boolean equals(Object obj) { if (!(obj instanceof DateTime)) return false; DateTime lhs = this; DateTime rhs = (DateTime) obj; return lhs.millis == rhs.millis; } @Override public int hashCode() { return (int) millis; } @Override public String toString() { return millis + "[ms]"; } @Override public int compareTo(DateTime rhs) { DateTime lhs = this; if (lhs.millis < rhs.millis) return -1; else if (lhs.millis == rhs.millis) return 0; else return 1; } public boolean isBefore(DateTime dt) { return millis < dt.millis; } public boolean isAfter(DateTime dt) { return dt.millis < millis; } public DateTime adjustByMinutes() { long minutes = 1000L * 60; return new DateTime(getTime() - (getTime() % minutes)); } public DateTime nDayBefore(int n) { return new DateTime(Util.ensureMin(getTime() - 1000L * 3600 * 24 * n, 0L)); } public DateTime nDayAfter(int n) { return new DateTime(getTime() + 1000L * 3600 * 24 * n); } public DateTime nHourBefore(int n) { return new DateTime(Util.ensureMin(getTime() - 1000L * 3600 * n, 0L)); } public DateTime nHourAfter(int n) { return new DateTime(getTime() + 1000L * 3600 * n); } public DateTime nSecAfter(int n) { return new DateTime(getTime() + 1000L * n); } public DateTime nSecBefore(int n) { return new DateTime(getTime() - 1000L * n); } public String toHumanReadableFormat() { DateFormat format = new SimpleDateFormat(Constants.READABLE_DATE_FORMAT, Locale.getDefault()); return format.format(this.toDate()); } }