static LongRange dateStructureToTimestampRange(DateStructures.SomeDate d) { ret dateStructureToTimestampRange(d, localTimeZone(), now(), true); } static LongRange dateStructureToTimestampRange(DateStructures.SomeDate d, TimeZone tz, long now, bool assumeFuture) { new DateStructureToTimestampRange x; x.tz = tz; x.now = now; x.assumeFuture = assumeFuture; ret x.getRange(d); } sclass DateStructureToTimestampRange { TimeZone tz; long now; bool assumeFuture; delegate SomeDate to DateStructures. delegate Day to DateStructures. delegate Month to DateStructures. delegate Year to DateStructures. delegate CurrentWeekPlus to DateStructures. delegate CurrentMonthPlus to DateStructures. delegate CurrentYearPlus to DateStructures. delegate Weekday to DateStructures. delegate TodayPlus to DateStructures. Year currentYear() { ret new Year(year(now)); } Month currentMonth() { ret new Month(month(now), new Year(year(now))); } LongRange getRange(SomeDate d) { // year if (d cast CurrentYearPlus) d = new Year(year(now) + d.nYears); if (d cast Year) ret longRange(yearToTimestamp(d.year, tz), yearToTimestamp(d.year+1, tz)); // month if (d cast CurrentMonthPlus) d = new Month(month(now) + d.nMonths, currentYear()); if (d cast Month) { int year = d.year.year; ret longRange( yearAndMonthToTimestamp(year, d.month, tz), yearAndMonthToTimestamp(year, d.month+1, tz)); } // week if (d cast CurrentWeekPlus) d = new Week(weekInYear(now, tz) + d.nWeeks, currentYear()); if (d cast Week) { int year = d.year.year; ret longRange( yearAndWeekToTimestamp(year, d.week, tz), yearAndWeekToTimestamp(year, d.week+1, tz)); } // day if (d cast TodayPlus) d = new Day(dayOfMonth(now) + d.nDays, currentMonth()); if (d cast Day) { int month = d.month.month; int year = d.month.year.year; ret longRange( ymdToTimestamp(year, month, d.day, tz), ymdToTimestamp(year, month, d.day+1, tz)); } fail("dateStructureToTimestampRange: unknown type" + d); } }