xref: /original-bsd/lib/libc/gen/ctime.3 (revision 792e4f5f)
Copyright (c) 1989 The Regents of the University of California.
All rights reserved.

This code is derived from software contributed to Berkeley by
Arthur Olson.

Redistribution and use in source and binary forms are permitted
provided that the above copyright notice and this paragraph are
duplicated in all such forms and that any documentation,
advertising materials, and other materials related to such
distribution and use acknowledge that the software was developed
by the University of California, Berkeley. The name of the
University may not be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

@(#)ctime.3 6.10 (Berkeley) 03/16/89

CTIME 3 ""
NAME
asctime, ctime, difftime, gmtime, localtime, mktime, tzset, tzsetwall - convert date and time to ASCII
SYNOPSIS
 extern char *tzname[2]; 

void tzset()

void tzsetwall()

#include <sys/types.h>

char *ctime(clock) time_t *clock;

double difftime(time1, time0) time_t time1; time_t time0;

#include <time.h>

char *asctime(tm) struct tm *tm;

struct tm *localtime(clock) long *clock;

struct tm *gmtime(clock) long *clock;

time_t mktime(tm) struct tm *tm;

DESCRIPTION
Tzset uses the value of the environment variable TZ to set time conversion information used by localtime . If TZ does not appear in the environment, the best available approximation to local wall clock time, as specified by the tzfile (5)-format file localtime in the system time conversion information directory, is used by localtime . If TZ appears in the environment but its value is a null string, Coordinated Universal Time (UTC) is used (without leap second correction). If TZ appears in the environment and its value is not a null string:
if the value begins with a colon, it is used as a pathname of a file from which to read the time conversion information;
if the value does not begin with a colon, it is first used as the pathname of a file from which to read the time conversion information, and, if that file cannot be read, is used directly as a specification of the time conversion information.

When TZ is used as a pathname, if it begins with a slash, it is used as an absolute pathname; otherwise, it is used as a pathname relative to a system time conversion information directory. The file must be in the format specified in tzfile (5).

When TZ is used directly as a specification of the time conversion information, it must have the following syntax (spaces inserted for clarity):

std\|offset[dst[offset][,rule]]

Where:

15 std " and " dst Three or more bytes that are the designation for the standard ( std ) or summer ( dst ) time zone. Only std is required; if dst is missing, then summer time does not apply in this locale. Upper- and lowercase letters are explicitly allowed. Any characters except a leading colon ( : ), digits, comma ( , ), minus ( - ), plus ( \(pl ), and ASCII NUL are allowed.

offset Indicates the value one must add to the local time to arrive at Coordinated Universal Time. The 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 , summer 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 zero and 24, and the minutes (and seconds) \(em if present \(em between zero and 59. If preceded by a `` - '', the time zone shall be east of the Prime Meridian; otherwise it shall be west (which may be indicated by an optional preceding `` \(pl '').

rule Indicates when to change to and back from summer time. The rule has the form:

date/time,date/time
where the first date describes when the change from standard to summer time occurs and the second date describes when the change back happens. Each time field describes when, in current local time, the change to the other time is made.
The format of date is one of the following:

10 J n The Julian day n "(1 \(<=" " n " "\(<= 365). Leap days are not counted; that is, in all years \(em including leap years \(em February 28 is day 59 and March 1 is day 60. It is impossible to explicitly refer to the occasional February 29.

n The zero-based Julian day "(0 \(<=" " n " "\(<= 365). Leap days are counted, and it is possible to refer to February 29.

M m . n . d The 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 ``the 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.

"" 15
The time has the same format as offset except that no leading sign (`` - '' or `` \(pl '') is allowed. The default, if time is not given, is 02:00:00 .

If no rule is present in TZ , the rules specified by the tzfile (5)-format file posixrules in the system time conversion information directory are used, with the standard and summer time offsets from UTC replaced by those specified by the offset values in TZ .

For compatibility with System V Release 3.1, a semicolon ( ; ) may be used to separate the rule from the rest of the specification.

If the TZ environment variable does not specify a tzfile (5)-format and cannot be interpreted as a direct specification, UTC is used with the standard time abbreviation set to the value of the TZ environment variable (or to the leading characters of its value if it is lengthy).

Tzsetwall sets things up so that localtime returns the best available approximation of local wall clock time.

Ctime\^ converts a long integer, pointed to by clock , representing the time in seconds since 00:00:00 UTC, January 1, 1970, and returns a pointer to a 26-character string of the form

.eo Thu Nov 24 18:22:48 1986\n\0 .ec

All the fields have constant width.

Localtime\^ and gmtime\^ return pointers to ``tm'' structures, described below. Localtime\^ corrects for the time zone and any time zone adjustments (such as Daylight Saving Time in the U.S.A.). Before doing so, localtime\^ calls tzset\^ (if tzset\^ has not been called in the current process). After filling in the ``tm'' structure, localtime sets the tm_isdst 'th element of tzname to a pointer to an ASCII string that's the time zone abbreviation to be used with localtime 's return value.

Gmtime\^ converts to Coordinated Universal Time.

Asctime\^ converts a time value contained in a ``tm'' structure to a 26-character string, as shown in the above example, and returns a pointer to the string.

Mktime\^ converts the broken-down time, expressed as local time, in the structure pointed to by tm into a calendar time value with the same encoding as that of the values returned by the time function. 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 their normal ranges. (A positive or zero value for tm_isdst causes mktime to presume initially that summer time (for example, Daylight Saving Time in the U.S.A.) respectively, is or is not in effect for the specified time. A negative value for tm_isdst causes the mktime function to attempt to divine whether summer time is in effect for the specified time.) On successful completion, the values of the tm_wday and tm_yday components of the structure are set appropriately, and the other components are set to represent the specified calendar time, but with their values forced to their normal ranges; the final value of tm_mday is not set until tm_mon and tm_year are determined. Mktime\^ returns the specified calendar time; If the calendar time cannot be represented, it returns -1 .

Difftime\^ returns the difference between two calendar times, time1 - time0, expressed in seconds.

Declarations of all the functions and externals, and the ``tm'' structure, are in the <time.h>\^ header file. The structure (of type) struct tm includes the following fields:

 int tm_sec; /\(** seconds (0 - 60) \(**/
 int tm_min; /\(** minutes (0 - 59) \(**/
 int tm_hour; /\(** hours (0 - 23) \(**/
 int tm_mday; /\(** day of month (1 - 31) \(**/
 int tm_mon; /\(** month of year (0 - 11) \(**/
 int tm_year; /\(** year - 1900 \(**/
 int tm_wday; /\(** day of week (Sunday = 0) \(**/
 int tm_yday; /\(** day of year (0 - 365) \(**/
 int tm_isdst; /\(** is summer time in effect? \(**/
 char \(**tm_zone; /\(** abbreviation of timezone name \(**/
 long tm_gmtoff; /\(** offset from UTC in seconds \(**/

The tm_zone and tm_gmtoff fields exist, and are filled in, only if arrangements to do so were made when the library containing these functions was created. There is no guarantee that these fields will continue to exist in this form in future releases of this code.

Tm_isdst\^ is non-zero if summer time is in effect.

Tm_gmtoff is the offset (in seconds) of the time represented from UTC, with positive values indicating east of the Prime Meridian.

FILES
/etc/zoneinfo time zone information directory

/etc/zoneinfo/localtime local time zone file

/etc/zoneinfo/posixrules used in converting POSIX-style TZ's

/etc/zoneinfo/GMT for UTC leap seconds If /etc/zoneinfo/GMT is absent, UTC leap seconds are loaded from /etc/zoneinfo/posixrules .

SEE ALSO
time(2), getenv(3), tzfile(5)
NOTES
The return values point to static data whose content is overwritten by each call. The tm_zone field of a returned "struct tm" points to a static array of characters, which will also be overwritten at the next call (and by calls to tzset or tzsetwall ).

Avoid using out-of-range values with mktime when setting up lunch with promptness sticklers in Riyadh.