2 * caljulian - determine the Julian date from an NTP time.
7 #include "ntp_calendar.h"
8 #include "ntp_stdlib.h"
11 * calmonthtab - days-in-the-month table
13 static u_short calmonthtab[11] = {
30 register struct calendar *jt
36 * Absolute, zero-adjusted Christian era day, starting from the
37 * mythical day 12/1/1 BC
41 u_long d400; /* Days into a Gregorian cycle */
42 u_long d100; /* Days into a normal century */
43 u_long d4; /* Days into a 4-year cycle */
44 u_long n400; /* # of Gregorian cycles */
45 u_long n100; /* # of normal centuries */
46 u_long n4; /* # of 4-year cycles */
47 u_long n1; /* # of years into a leap year */
51 * Do the easy stuff first: take care of hh:mm:ss, ignoring leap
54 jt->second = (u_char)(ntptime % SECSPERMIN);
55 minutes = ntptime / SECSPERMIN;
56 jt->minute = (u_char)(minutes % MINSPERHR);
57 jt->hour = (u_char)((minutes / MINSPERHR) % HRSPERDAY);
60 * Find the day past 1900/01/01 00:00 UTC
62 ntp_day = ntptime / SECSPERDAY;
63 acez_day = DAY_NTP_STARTS + ntp_day - 1;
64 n400 = acez_day/GREGORIAN_CYCLE_DAYS;
65 d400 = acez_day%GREGORIAN_CYCLE_DAYS;
66 n100 = d400 / GREGORIAN_NORMAL_CENTURY_DAYS;
67 d100 = d400 % GREGORIAN_NORMAL_CENTURY_DAYS;
68 n4 = d100 / GREGORIAN_NORMAL_LEAP_CYCLE_DAYS;
69 d4 = d100 % GREGORIAN_NORMAL_LEAP_CYCLE_DAYS;
70 n1 = d4 / DAYSPERYEAR;
73 * Calculate the year and year-of-day
75 jt->yearday = (u_short)(1 + d4%DAYSPERYEAR);
76 jt->year = (u_short)(400*n400 + 100*n100 + n4*4 + n1);
78 if (n100 == 4 || n1 == 4)
81 * If the cycle year ever comes out to 4, it must be December 31st
91 * Else, search forwards through the months to get the right month
97 monthday = jt->yearday;
99 for (jt->month=0;jt->month<11; jt->month++)
103 t = monthday - calmonthtab[jt->month];
104 if (jt->month == 1 && is_leapyear(jt->year))
113 jt->monthday = (u_char) monthday;