📄 sfldate.c
字号:
}
/* Get future date in days and centiseconds */
days = date_to_days (*date) + days;
csecs = time_to_csecs (*time) + csecs;
/* Normalise overflow in centiseconds */
while (csecs >= INTERVAL_DAY)
{
days++;
csecs -= INTERVAL_DAY;
}
/* Convert date and time back into organised values */
*date = days_to_date (days);
*time = csecs_to_time (csecs);
}
/* ---------------------------------------------------------------------[<]-
Function: past_date
Synopsis: Calculates a past date and time from the date and time
specified, minus 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
past_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 ();
}
/* Get past date in days and centiseconds */
days = date_to_days (*date) - days;
csecs = time_to_csecs (*time) - csecs;
/* Normalise underflow in centiseconds */
while (csecs < 0)
{
days--;
csecs += INTERVAL_DAY;
}
/* Convert date and time back into organised values */
*date = days_to_date (days);
*time = csecs_to_time (csecs);
}
/* ---------------------------------------------------------------------[<]-
Function: date_diff
Synopsis: Calculates the difference between two date/time values, and
returns the difference as a number of days and a number of centiseconds.
The date can be any date since some distant epoch (around 1600). The
calculation is date1:time1 - date2:time2. The returned values may be
negative.
---------------------------------------------------------------------[>]-*/
void
date_diff (
long date1, long time1, /* Date and time */
long date2, long time2, /* minus this date and time */
long *days, long *csecs /* Gives these values */
)
{
*days = date_to_days (date1) - date_to_days (date2);
*csecs = time_to_csecs (time1) - time_to_csecs (time2);
}
/* ---------------------------------------------------------------------[<]-
Function: valid_date
Synopsis: Returns TRUE if the date is valid or zero; returns FALSE if
the date is not valid.
---------------------------------------------------------------------[>]-*/
Bool
valid_date (long date)
{
int
month,
day;
Bool
feedback;
static byte
month_days [] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
month = GET_MONTH (date);
day = GET_DAY (date);
if (date == 0)
feedback = TRUE; /* Zero date is okay */
else
if (month < 1 || month > 12)
feedback = FALSE; /* Month out of range */
else
if ((day < 1 || day > month_days [month - 1])
|| (month == 2 && day == 29 && !leap_year (GET_YEAR (date))))
feedback = FALSE; /* Day out of range */
else
feedback = TRUE; /* Zero date is okay */
return (feedback);
}
/* ---------------------------------------------------------------------[<]-
Function: valid_time
Synopsis: Returns TRUE if the time is valid or zero; returns FALSE if
the time is not valid.
---------------------------------------------------------------------[>]-*/
Bool
valid_time (long time)
{
return (GET_SECOND (time) < 60
&& GET_MINUTE (time) < 60
&& GET_HOUR (time) < 24);
}
/* ---------------------------------------------------------------------[<]-
Function: date_is_future
Synopsis: Returns TRUE if the specified date and time are in the future.
Returns FALSE if the date and time are in the past, or the present (which
will be the past by the time you've read this). Date is specified as a
YYYYMMDD value; time as HHMMSSCC.
---------------------------------------------------------------------[>]-*/
Bool
date_is_future (long date, long time)
{
return (date > date_now ()
|| (date == date_now () && time > time_now ()));
}
/* ---------------------------------------------------------------------[<]-
Function: date_is_past
Synopsis: Returns TRUE if the specified date and time are in the past.
Returns FALSE if the date and time are in the future or present (which
despite any assertion to the contrary, is not the past. Although that
may change soon). Date is specified as YYYYMMDD; time as HHMMSSCC.
---------------------------------------------------------------------[>]-*/
Bool
date_is_past (long date, long time)
{
return (date < date_now ()
|| (date == date_now () && time < time_now ()));
}
/* ---------------------------------------------------------------------[<]-
Function: timezone_string
Synopsis: Returns a static string containing the time zone as a 4-digit
number, with a leading '+' or '-' character. GMT is represented as
"+0000"; Central European Time is "+1000". If the system does not support
the timezone, returns "+0000".
---------------------------------------------------------------------[>]-*/
char *
timezone_string (void)
{
#if (defined (TIMEZONE))
static char
formatted_string [10]; /* -nnnn plus null */
int
minutes; /* TIMEZONE is in seconds */
minutes = 0 - (int) (TIMEZONE / 60);
snprintf (formatted_string, sizeof (formatted_string),
"%03d%02d", minutes / 60, abs (minutes % 60));
if (*formatted_string == '0')
*formatted_string = '+';
return (formatted_string);
#else
return ("+0000");
#endif
}
/* ---------------------------------------------------------------------[<]-
Function: local_to_gmt
Synopsis: Converts the specified date and time to GMT. Returns the GMT
date and time in two arguments.
---------------------------------------------------------------------[>]-*/
void
local_to_gmt (long date, long time, long *gmt_date, long *gmt_time)
{
time_t
time_value;
time_value = date_to_timer (date, time);
*gmt_date = timer_to_gmdate (time_value);
*gmt_time = timer_to_gmtime (time_value);
}
/* ---------------------------------------------------------------------[<]-
Function: gmt_to_local
Synopsis: Converts the specified GMT date and time to the local time.
Returns the local date and time in two arguments. If the supplied value
is out of range, returns 00:00 on 1 January, 1970 (19700101).
---------------------------------------------------------------------[>]-*/
void
gmt_to_local (long gmt_date, long gmt_time, long *date, long *time)
{
time_t
time_value;
struct tm
*time_struct;
/* Convert from GMT */
time_value = date_to_timer (gmt_date, gmt_time) - TIMEZONE;
time_struct = safe_localtime (&time_value);
if (time_struct-> tm_isdst)
{
time_value += 3600; /* Adjust for daylight savings */
time_struct = localtime (&time_value);
}
time_struct-> tm_year += 1900;
*date = MAKE_DATE (time_struct-> tm_year / 100,
time_struct-> tm_year % 100,
time_struct-> tm_mon + 1,
time_struct-> tm_mday);
*time = MAKE_TIME (time_struct-> tm_hour,
time_struct-> tm_min,
time_struct-> tm_sec,
0);
}
/* ---------------------------------------------------------------------[<]-
Function: safe_localtime
Synopsis: Handles time_t values that exceed 2038. The standard C
localtime() function fails on most systems when the date passes 2038.
---------------------------------------------------------------------[>]-*/
struct tm
*safe_localtime (const time_t *time_secs)
{
qbyte
adjusted_time;
struct tm
*time_struct;
int
adjust_years = 0;
adjusted_time = (qbyte) *time_secs;
while (adjusted_time > LONG_MAX)
{
adjust_years += 20;
adjusted_time -= 631152000; /* Number of seconds in 20 years */
}
time_struct = localtime ((const time_t *) &adjusted_time);
ASSERT (time_struct); /* MUST be valid now... */
time_struct-> tm_year += adjust_years;
return (time_struct);
}
/* ---------------------------------------------------------------------[<]-
Function: safe_gmtime
Synopsis: Handles time_t values that exceed 2038. The standard C
gmtime() function fails on most systems when the date passes 2038.
---------------------------------------------------------------------[>]-*/
struct tm
*safe_gmtime (const time_t *time_secs)
{
qbyte
adjusted_time;
struct tm
*time_struct;
int
adjust_years = 0;
adjusted_time = (qbyte) *time_secs;
while (adjusted_time > LONG_MAX)
{
adjust_years += 20;
adjusted_time -= 631152000; /* Nbr seconds in 20 years */
}
time_struct = gmtime ((const time_t *) &adjusted_time);
if (time_struct) /* gmtime may be unimplemented */
time_struct-> tm_year += adjust_years;
return (time_struct);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -