static inline double ymdhmsToSeconds(int year, long mon, long day, long hour, long minute, double second) { int mday = firstDayOfMonth[isLeapYear(year)][mon - 1]; double ydays = daysFrom1970ToYear(year); return (second + minute * secondsPerMinute + hour * secondsPerHour + (mday + day - 1 + ydays) * secondsPerDay); }
int msToYear(double ms) { int approxYear = static_cast<int>(floor(ms / (msPerDay * 365.2425)) + 1970); double msFromApproxYearTo1970 = msPerDay * daysFrom1970ToYear(approxYear); if (msFromApproxYearTo1970 > ms) return approxYear - 1; if (msFromApproxYearTo1970 + msPerDay * daysInYear(approxYear) <= ms) return approxYear + 1; return approxYear; }
double dateToDaysFrom1970(int year, int month, int day) { year += month / 12; month %= 12; if (month < 0) { month += 12; --year; } double yearday = floor(daysFrom1970ToYear(year)); ASSERT((year >= 1970 && yearday >= 0) || (year < 1970 && yearday < 0)); return yearday + dayInYear(year, month, day); }
static int dateToDayInYear(int year, int month, int day) { year += month / 12; month %= 12; if (month < 0) { month += 12; --year; } int yearday = static_cast<int>(floor(daysFrom1970ToYear(year))); int monthday = monthToDayInYear(month, isLeapYear(year)); return yearday + monthday + day - 1; }
int dayInYear(double ms, int year) { return static_cast<int>(msToDays(ms) - daysFrom1970ToYear(year)); }
static inline double msFrom1970ToYear(int year) { return msPerDay * daysFrom1970ToYear(year); }