📄 caljulian.c
字号:
/* * caljulian - determine the Julian date from an NTP time. */#include <sys/types.h>#include "ntp_types.h"#include "ntp_calendar.h"#include "ntp_stdlib.h"#include "ntp_fp.h"#if 0/* * calmonthtab - days-in-the-month table */static u_short calmonthtab[11] = { JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV};voidcaljulian( u_long ntptime, register struct calendar *jt ){ u_long ntp_day; u_long minutes; /* * Absolute, zero-adjusted Christian era day, starting from the * mythical day 12/1/1 BC */ u_long acez_day; u_long d400; /* Days into a Gregorian cycle */ u_long d100; /* Days into a normal century */ u_long d4; /* Days into a 4-year cycle */ u_long n400; /* # of Gregorian cycles */ u_long n100; /* # of normal centuries */ u_long n4; /* # of 4-year cycles */ u_long n1; /* # of years into a leap year */ /* cycle */ /* * Do the easy stuff first: take care of hh:mm:ss, ignoring leap * seconds */ jt->second = (u_char)(ntptime % SECSPERMIN); minutes = ntptime / SECSPERMIN; jt->minute = (u_char)(minutes % MINSPERHR); jt->hour = (u_char)((minutes / MINSPERHR) % HRSPERDAY); /* * Find the day past 1900/01/01 00:00 UTC */ ntp_day = ntptime / SECSPERDAY; acez_day = DAY_NTP_STARTS + ntp_day - 1; n400 = acez_day/GREGORIAN_CYCLE_DAYS; d400 = acez_day%GREGORIAN_CYCLE_DAYS; n100 = d400 / GREGORIAN_NORMAL_CENTURY_DAYS; d100 = d400 % GREGORIAN_NORMAL_CENTURY_DAYS; n4 = d100 / GREGORIAN_NORMAL_LEAP_CYCLE_DAYS; d4 = d100 % GREGORIAN_NORMAL_LEAP_CYCLE_DAYS; n1 = d4 / DAYSPERYEAR; /* * Calculate the year and year-of-day */ jt->yearday = (u_short)(1 + d4%DAYSPERYEAR); jt->year = (u_short)(400*n400 + 100*n100 + n4*4 + n1); if (n100 == 4 || n1 == 4) { /* * If the cycle year ever comes out to 4, it must be December 31st * of a leap year. */ jt->month = 12; jt->monthday = 31; jt->yearday = 366; } else { /* * Else, search forwards through the months to get the right month * and date. */ int monthday; jt->year++; monthday = jt->yearday; for (jt->month=0;jt->month<11; jt->month++) { int t; t = monthday - calmonthtab[jt->month]; if (jt->month == 1 && is_leapyear(jt->year)) t--; if (t > 0) monthday = t; else break; } jt->month++; jt->monthday = (u_char) monthday; }}#else/* Updated 2003-12-30 TMa Uses common code with the *prettydate functions to convert an ntp seconds count into a calendar date. Will handle ntp epoch wraparound as long as the underlying os/library does so for the unix epoch, i.e. works after 2038.*/voidcaljulian( u_long ntptime, register struct calendar *jt ){ struct tm *tm; tm = ntp2unix_tm(ntptime, 0); jt->hour = (u_char) tm->tm_hour; jt->minute = (u_char) tm->tm_min; jt->month = (u_char) (tm->tm_mon + 1); jt->monthday = (u_char) tm->tm_mday; jt->second = (u_char) tm->tm_sec; jt->year = (u_short) (tm->tm_year + 1900); jt->yearday = (u_short) (tm->tm_yday + 1); /* Assumes tm_yday starts with day 0! */}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -