package com.gmail.dpierron.calibre.datamodel; import java.sql.Time; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; public enum DateRange { ONEDAY(1), ONEWEEK(7), FORTNIGHT(14), MONTH(30), TWOMONTHS(60), THREEMONTHS(90), SIXMONTHS(182), YEAR(365), MORE(-1); private final int nbDays; private static final long milPerDay = 1000 * 60 * 60 * 24; private static long midnight = 0; DateRange(int nbDays) { this.nbDays = nbDays; } private int getNbDays() { return nbDays; } /** * Work out which date range a date falls into for Recent Books section * * @param d Date to be checked * @return Range into which date falls */ public static DateRange valueOf(Date d) { if (d == null) return MORE; if (midnight == 0) { GregorianCalendar gc = new GregorianCalendar(); // TODO Check if Timezone is automatically handled? gc.set(Calendar.HOUR_OF_DAY, 23); // Force time to just before midnight so that the gc.set(Calendar.MINUTE, 59); // day divisions align with calendar day boundaries gc.set(Calendar.SECOND, 59); midnight = gc.getTime().getTime(); } long days = (midnight - d.getTime()) / milPerDay; for (DateRange range : values()) { if (days < range.getNbDays()) return range; } return MORE; } }