Java examples for java.util:Calendar Calculation
Find the number of units, including a fraction, passed between two Calendar objects.
import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main{ /**/*from ww w . j a v a 2 s. c om*/ * Find the number of units, including a fraction, passed between two * {@link Calendar} objects. * * @param c1 * The first occurring {@link Calendar} * * @param c2 * The later occurring {@link Calendar} * * @param unit * The unit to calculate the difference in * * @return the number of units passed */ public static double exactDifference(Calendar c1, Calendar c2, Unit unit) { long unitDifference = difference(c1, c2, unit); Calendar mid = (Calendar) c1.clone(); CalendarUtils.add(mid, unit.calendarUnit, unitDifference); Calendar end = (Calendar) mid.clone(); end.add(unit.calendarUnit, 1); long millisPassed = CalendarUtils.difference(mid, c2, Unit.MILLISECOND); long millisTotal = CalendarUtils.difference(mid, end, Unit.MILLISECOND); double remainder = (double) millisPassed / (double) millisTotal; return unitDifference + remainder; } /** * Find the number of units passed between two {@link Calendar} objects. * * @param c1 * The first occurring {@link Calendar} * * @param c2 * The later occurring {@link Calendar} * * @param unit * The unit to calculate the difference in * * @return the number of units passed */ public static long difference(Calendar c1, Calendar c2, Unit unit) { Calendar first = (Calendar) c1.clone(); Calendar last = (Calendar) c2.clone(); long difference = c2.getTimeInMillis() - c1.getTimeInMillis(); long increment = (long) Math.floor((double) difference / (double) unit.estimate); increment = Math.max(increment, 1); long total = 0; while (increment > 0) { add(first, unit.calendarUnit, increment); if (first.after(last)) { add(first, unit.calendarUnit, increment * -1); increment = (long) Math.floor(increment / 2); } else { total += increment; } } return total; } /** * Find the number of units passed between two {@link Date} objects. * * @param d1 * The first occurring {@link Date} * * @param d2 * The later occurring {@link Date} * * @param unit * The unit to calculate the difference in * * @return the number of units passed */ public static long difference(Date d1, Date d2, Unit unit) { Calendar c1 = Calendar.getInstance(); c1.setTime(d1); Calendar c2 = Calendar.getInstance(); c2.setTime(d2); return difference(c1, c2, unit); } /** * Add a long amount to a calendar. Similar to calendar.add() but accepts a * long argument instead of limiting it to an int. * * @param c * the calendar * * @param unit * the unit to increment * * @param increment * the amount to increment */ public static void add(Calendar c, int unit, long increment) { while (increment > Integer.MAX_VALUE) { c.add(unit, Integer.MAX_VALUE); increment -= Integer.MAX_VALUE; } c.add(unit, (int) increment); } }