📄 sfldate.c
字号:
unpack_time (word packtime)
{
return (MAKE_TIME ((word) (packtime & 0xf800) >> 11,
(word) (packtime & 0x07e0) >> 5,
(word) (packtime & 0x001f) << 1, 0));
}
/* ---------------------------------------------------------------------[<]-
Function: date_to_days
Synopsis: Converts the date into a number of days since a distant but
unspecified epoch. You can use this function to calculate differences
between dates, and forward dates. Use days_to_date() to calculate the
reverse function. Author: Robert G. Tantzen, translated from the Algol
original in Collected Algorithms of the CACM (algorithm 199). Original
translation into C by Nat Howard, posted to Usenet 5 Jul 1985.
---------------------------------------------------------------------[>]-*/
long
date_to_days (long date)
{
long
year = GET_YEAR (date),
century = GET_CENTURY (date),
month = GET_MONTH (date),
day = GET_DAY (date);
if (month > 2)
month -= 3;
else
{
month += 9;
if (year)
year--;
else
{
year = 99;
century--;
}
}
return ((146097L * century) / 4L +
(1461L * year) / 4L +
(153L * month + 2L) / 5L +
day + 1721119L);
}
/* ---------------------------------------------------------------------[<]-
Function: days_to_date
Synopsis: Converts a number of days since some distant but unspecified
epoch into a date. You can use this function to calculate differences
between dates, and forward dates. Use date_to_days() to calculate the
reverse function. Author: Robert G. Tantzen, translated from the Algol
original in Collected Algorithms of the CACM (algorithm 199). Original
translation into C by Nat Howard, posted to Usenet 5 Jul 1985.
---------------------------------------------------------------------[>]-*/
long
days_to_date (long days)
{
long
century,
year,
month,
day;
days -= 1721119L;
century = (4L * days - 1L) / 146097L;
days = 4L * days - 1L - 146097L * century;
day = days / 4L;
year = (4L * day + 3L) / 1461L;
day = 4L * day + 3L - 1461L * year;
day = (day + 4L) / 4L;
month = (5L * day - 3L) / 153L;
day = 5L * day - 3 - 153L * month;
day = (day + 5L) / 5L;
if (month < 10)
month += 3;
else
{
month -= 9;
if (year++ == 99)
{
year = 0;
century++;
}
}
return (MAKE_DATE (century, year, month, day));
}
/* ---------------------------------------------------------------------[<]-
Function: date_to_timer
Synopsis: Converts the supplied date and time into a time_t timer value.
This is the number of non-leap seconds since 00:00:00 GMT Jan 1, 1970.
Function was rewritten by Bruce Walter <walter@fortean.com>. If the
input date and time are invalid, returns 0.
---------------------------------------------------------------------[>]-*/
time_t
date_to_timer (long date, long time)
{
struct tm
time_struct;
time_t
timer;
time_struct.tm_sec = GET_SECOND (time);
time_struct.tm_min = GET_MINUTE (time);
time_struct.tm_hour = GET_HOUR (time);
time_struct.tm_mday = GET_DAY (date);
time_struct.tm_mon = GET_MONTH (date) - 1;
time_struct.tm_year = GET_CCYEAR (date) - 1900;
time_struct.tm_isdst = -1;
timer = mktime (&time_struct);
if (timer == -1)
return (0);
else
return (timer);
}
/* ---------------------------------------------------------------------[<]-
Function: timer_to_date
Synopsis: Converts the supplied timer value into a long date value.
Dates are stored as long values: CCYYMMDD. If the supplied value is
zero, returns zero. The timer value is assumed to be UTC (GMT).
---------------------------------------------------------------------[>]-*/
long
timer_to_date (time_t time_secs)
{
struct tm
*time_struct;
if (time_secs == 0)
return (0);
else
{
/* Convert into a long value CCYYMMDD */
time_struct = safe_localtime (&time_secs);
time_struct-> tm_year += 1900;
return (MAKE_DATE (time_struct-> tm_year / 100,
time_struct-> tm_year % 100,
time_struct-> tm_mon + 1,
time_struct-> tm_mday));
}
}
/* ---------------------------------------------------------------------[<]-
Function: timer_to_time
Synopsis: Converts the supplied timer value into a long time value.
Times are stored as long values: HHMMSS00. Since the timer value does
not hold centiseconds, these are set to zero. If the supplied value
was zero, returns zero. The timer value is assumed to be UTC (GMT).
---------------------------------------------------------------------[>]-*/
long
timer_to_time (time_t time_secs)
{
struct tm
*time_struct;
if (time_secs == 0)
return (0);
else
{
/* Convert into a long value HHMMSS00 */
time_struct = safe_localtime (&time_secs);
return (MAKE_TIME (time_struct-> tm_hour,
time_struct-> tm_min,
time_struct-> tm_sec,
0));
}
}
/* ---------------------------------------------------------------------[<]-
Function: timer_to_gmdate
Synopsis: Converts the supplied timer value into a long date value in
Greenwich Mean Time (GMT). Dates are stored as long values: CCYYMMDD.
If the supplied value is zero, returns zero.
---------------------------------------------------------------------[>]-*/
long
timer_to_gmdate (time_t time_secs)
{
struct tm
*time_struct;
if (time_secs == 0)
return (0);
else
{
/* Convert into a long value CCYYMMDD */
time_struct = safe_gmtime (&time_secs);
if (time_struct == NULL) /* If gmtime is not implemented */
time_struct = safe_localtime (&time_secs);
time_struct-> tm_year += 1900;
return (MAKE_DATE (time_struct-> tm_year / 100,
time_struct-> tm_year % 100,
time_struct-> tm_mon + 1,
time_struct-> tm_mday));
}
}
/* ---------------------------------------------------------------------[<]-
Function: timer_to_gmtime
Synopsis: Converts the supplied timer value into a long time value in
Greenwich Mean Time (GMT). Times are stored as long values: HHMMSS00.
On most systems the clock does not return centiseconds, so these are
set to zero. If the supplied value is zero, returns zero.
---------------------------------------------------------------------[>]-*/
long
timer_to_gmtime (time_t time_secs)
{
struct tm
*time_struct;
if (time_secs == 0)
return (0);
else
{
/* Convert into a long value HHMMSS00 */
time_struct = safe_gmtime (&time_secs);
if (time_struct == NULL) /* If gmtime is not implemented */
time_struct = safe_localtime (&time_secs);
return (MAKE_TIME (time_struct-> tm_hour,
time_struct-> tm_min,
time_struct-> tm_sec,
0));
}
}
/* ---------------------------------------------------------------------[<]-
Function: time_to_csecs
Synopsis: Converts a time (HHMMSSCC) into a number of centiseconds.
---------------------------------------------------------------------[>]-*/
long
time_to_csecs (long time)
{
return ((long) (GET_HOUR (time) * (long) INTERVAL_HOUR)
+ (long) (GET_MINUTE (time) * (long) INTERVAL_MIN)
+ (long) (GET_SECOND (time) * (long) INTERVAL_SEC)
+ (long) (GET_CENTI (time)));
}
/* ---------------------------------------------------------------------[<]-
Function: csecs_to_time
Synopsis: Converts a number of centiseconds (< INTERVAL_DAY) into a
time value (HHMMSSCC).
---------------------------------------------------------------------[>]-*/
long
csecs_to_time (long csecs)
{
long
hour,
min,
sec;
ASSERT (csecs < INTERVAL_DAY);
hour = csecs / INTERVAL_HOUR;
csecs = csecs % INTERVAL_HOUR;
min = csecs / INTERVAL_MIN;
csecs = csecs % INTERVAL_MIN;
sec = csecs / INTERVAL_SEC;
csecs = csecs % INTERVAL_SEC;
return (MAKE_TIME (hour, min, sec, csecs));
}
/* ---------------------------------------------------------------------[<]-
Function: future_date
Synopsis: Calculates a future date and time from the date and time
specified, plus an interval specified in days and 1/100th seconds.
The date can be any date since some distant epoch (around 1600).
If the date and time arguments are both zero, the current date and
time are used. Either date and time arguments may be null.
---------------------------------------------------------------------[>]-*/
void
future_date (long *date, long *time, long days, long csecs)
{
long
dummy_date = 0,
dummy_time = 0;
if (date == NULL)
date = &dummy_date;
if (time == NULL)
time = &dummy_time;
/* Set date and time to NOW if necessary */
if (*date == 0 && *time == 0)
{
*date = date_now ();
*time = time_now ();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -