gp_mktime
-converts a tm structure to a calendar time
#include <time.h>
time_t gp_mktime (struct tm *timeptr);
gp_mktime
() converts the time represented by the tm structure pointed to by timeptr
into a calendar time (the number of seconds since 00:00:00 UTC, January 1, 1970).
The tm structure has the following format.
struct tm {
int tm_sec; /* seconds after the minute [0, 61] */
int tm_min; /* minutes after the hour [0, 59] */
int tm_hour; /* hour since midnight [0, 23] */
int tm_mday; /* day of the month [1, 31] */
int tm_mon; /* months since January [0, 11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday [0, 6] */
int tm_yday; /* days since January 1 [0, 365] */
int tm_isdst; /* flag for daylight savings time */
};
In addition to computing the calendar time, gp_mktime
normalizes the supplied tm structure. The original values of the tm_wday
and tm_yday
components of the structure are ignored, and the original values of the other components are not restricted to the ranges indicated in the definition of the structure. On successful completion, the values of the tm_wday
and tm_yday
components are set appropriately, and the other components are set to represent the specified calendar time, but with their values forced to be within the appropriate ranges. The final value of tm_mday
is not set until tm_mon
and tm_year
are determined.
The original values of the components may be either greater than or less than the specified range. For example, a tm_hour
of -1 means 1 hour before midnight, tm_mday
of 0 means the day preceding the current month, and tm_mon
of -2 means 2 months before January of tm_year
.
If tm_isdst
is positive, the original values are assumed to be in the alternate timezone. If it turns out that the alternate timezone is not valid for the computed calendar time, then the components are adjusted to the main timezone. Likewise, if tm_isdst is zero, the original values are assumed to be in the main timezone and are converted to the alternate timezone if the main timezone is not valid. If tm_isdst
is negative, the correct timezone is determined and the components are not adjusted.
Local timezone information is used as if gp_mktime
had called tzset
.
gp_mktime
returns the specified calendar time. If the calendar time cannot be represented, the function returns the value (time_t)-1.
What day of the week is July 4, 2001?
#include <stdio.h>
#include <time.h>
static char *const wday[] = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "-unknown-"
};
struct tm time_str;
/*...*/
time_str.tm_year = 2001 - 1900;
time_str.tm_mon = 7 - 1;
time_str.tm_mday = 4;
time_str.tm_hour = 0;
time_str.tm_min = 0;
time_str.tm_sec = 1;
time_str.tm_isdst = -1;
if (gp_mktime(time_str) == -1)
time_str.tm_wday=7;
printf("%s\en", wday[time_str.tm_wday]);
ctime
(3C), getenv
(3C), timezone
(4)
tm_year
of the tm structure must be for year 1970 or later. Calendar times before 00:00:00 UTC, January 1, 1970 or after 03:14:07 UTC, January 19, 2038 cannot be represented.
On systems where the C compilation system already provides the ANSI C mktime
function, gp_mktime
simply calls mktime
to do the conversion. Otherwise, the conversion is provided directly in gp_mktime
.
In the later case, the TZ environment variable must be set. Note that in many installations, TZ is set to the correct value by default when the user logs on. The default value for TZ, if not set, is GMT0. The format for TZ is the following. stdoffset[dst[offset],[start[time],end[time]]]
std
and dst
std
) and daylight savings time (dst
) timezones. Only std
is required, if dst
is missing, then daylight savings time does not apply in this locale. Upper- and lower-case letters are allowed. Any characters except a leading colon (:), digits, a comma (,), a minus (-) or a plus (+) are allowed.
offset
offset
has the form: hh
[:mm
[:ss
]] The minutes (mm
) and seconds (ss
) are optional. The hour (hh
) is required and may be a single digit. The offset
following std
is required. If no offset
follows dst
, daylight savings time is assumed to be one hour ahead of standard time. One or more digits may be used; the value is always interpreted as a decimal number. The hour must be between 0 and 24, and the minutes (and seconds) if present between 0 and 59. Out of range values may cause unpredictable behavior. If preceded by a \Q\Q-'', the timezone is east of the Prime Meridian; otherwise it is west (which may be indicated by an optional preceding \Q\Q+'' sign).
start
/time
,end
/time
start
/time describes when the change from standard time to daylight savings time occurs, and end
/time
describes when the change back happens. Each time
field describes when, in current local time, the change is made.
start
and end
are one of the following:
n
n
(1 n
365). Leap days are not counted. That is, in all years, February 28 is day 59 and March 1 is day 60. It is impossible to refer to the occasional February 29.
n
n
365). Leap days are counted, and it is possible to refer to February 29.
m.n.d
d
th day, (0 d
6) of week n
of month m
of the year (1 n
5, 1 m
12), where week 5 means \Q\Qthe last d
-day in month m
'' which may occur in either the fourth or the fifth week). Week 1 is the first week in which the d
th day occurs. Day zero is Sunday.
Implementation specific defaults are used for start
and end
if these optional fields are not given.
The time
has the same format as offset
except that no leading sign (\Q\Q-'' or \Q\Q+'') is allowed. The default, if time
is not given is 02:00:00.