public double makeOffsetFromRefDate( CalendarDate date) { if (isCalendarField) { if (date.equals(baseDate)) return 0.0; return date.getDifference(baseDate, periodField); } else { long msecs = date.getDifferenceInMsecs(baseDate); return msecs / period.getValueInMillisecs(); } }
assert end.getDifference(start, CalendarPeriod.Field.Day) == 31;
/** * Get difference between two calendar dates in given Field units * @param o other calendar date * @return (this minus o) difference in units of this Field */ public long getDifference(CalendarDate o, CalendarPeriod.Field fld) { switch (fld) { case Millisec: return getDifferenceInMsecs(o); case Second: return (long) (getDifferenceInMsecs(o) / MILLISECS_IN_SECOND); case Minute: return (long) (getDifferenceInMsecs(o) / MILLISECS_IN_MINUTE); case Hour: return (long) (getDifferenceInMsecs(o) / MILLISECS_IN_HOUR); case Day: return (long) (getDifferenceInMsecs(o) / MILLISECS_IN_DAY); case Month: int tmonth = getFieldValue(CalendarPeriod.Field.Month); int omonth = o.getFieldValue(CalendarPeriod.Field.Month); int years = (int) this.getDifference(o, CalendarPeriod.Field.Year); return tmonth-omonth + 12 * years; case Year: int tyear = getFieldValue(CalendarPeriod.Field.Year); int oyear = o.getFieldValue(CalendarPeriod.Field.Year); return tyear - oyear; } return dateTime.getMillis() - o.dateTime.getMillis(); }