|  | @node Date and Time, Resource Usage And Limitation, Arithmetic, Top | 
|  | @c %MENU% Functions for getting the date and time and formatting them nicely | 
|  | @chapter Date and Time | 
|  |  | 
|  | This chapter describes functions for manipulating dates and times, | 
|  | including functions for determining what time it is and conversion | 
|  | between different time representations. | 
|  |  | 
|  | @menu | 
|  | * Time Basics::                 Concepts and definitions. | 
|  | * Elapsed Time::                Data types to represent elapsed times | 
|  | * Processor And CPU Time::      Time a program has spent executing. | 
|  | * Calendar Time::               Manipulation of ``real'' dates and times. | 
|  | * Setting an Alarm::            Sending a signal after a specified time. | 
|  | * Sleeping::                    Waiting for a period of time. | 
|  | @end menu | 
|  |  | 
|  |  | 
|  | @node Time Basics | 
|  | @section Time Basics | 
|  | @cindex time | 
|  |  | 
|  | Discussing time in a technical manual can be difficult because the word | 
|  | ``time'' in English refers to lots of different things.  In this manual, | 
|  | we use a rigorous terminology to avoid confusion, and the only thing we | 
|  | use the simple word ``time'' for is to talk about the abstract concept. | 
|  |  | 
|  | A @dfn{calendar time} is a point in the time continuum, for example | 
|  | November 4, 1990 at 18:02.5 UTC.  Sometimes this is called ``absolute | 
|  | time''. | 
|  | @cindex calendar time | 
|  |  | 
|  | We don't speak of a ``date'', because that is inherent in a calendar | 
|  | time. | 
|  | @cindex date | 
|  |  | 
|  | An @dfn{interval} is a contiguous part of the time continuum between two | 
|  | calendar times, for example the hour between 9:00 and 10:00 on July 4, | 
|  | 1980. | 
|  | @cindex interval | 
|  |  | 
|  | An @dfn{elapsed time} is the length of an interval, for example, 35 | 
|  | minutes.  People sometimes sloppily use the word ``interval'' to refer | 
|  | to the elapsed time of some interval. | 
|  | @cindex elapsed time | 
|  | @cindex time, elapsed | 
|  |  | 
|  | An @dfn{amount of time} is a sum of elapsed times, which need not be of | 
|  | any specific intervals.  For example, the amount of time it takes to | 
|  | read a book might be 9 hours, independently of when and in how many | 
|  | sittings it is read. | 
|  |  | 
|  | A @dfn{period} is the elapsed time of an interval between two events, | 
|  | especially when they are part of a sequence of regularly repeating | 
|  | events. | 
|  | @cindex period of time | 
|  |  | 
|  | @dfn{CPU time} is like calendar time, except that it is based on the | 
|  | subset of the time continuum when a particular process is actively | 
|  | using a CPU.  CPU time is, therefore, relative to a process. | 
|  | @cindex CPU time | 
|  |  | 
|  | @dfn{Processor time} is an amount of time that a CPU is in use.  In | 
|  | fact, it's a basic system resource, since there's a limit to how much | 
|  | can exist in any given interval (that limit is the elapsed time of the | 
|  | interval times the number of CPUs in the processor).  People often call | 
|  | this CPU time, but we reserve the latter term in this manual for the | 
|  | definition above. | 
|  | @cindex processor time | 
|  |  | 
|  | @node Elapsed Time | 
|  | @section Elapsed Time | 
|  | @cindex elapsed time | 
|  |  | 
|  | One way to represent an elapsed time is with a simple arithmetic data | 
|  | type, as with the following function to compute the elapsed time between | 
|  | two calendar times.  This function is declared in @file{time.h}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun double difftime (time_t @var{time1}, time_t @var{time0}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | The @code{difftime} function returns the number of seconds of elapsed | 
|  | time between calendar time @var{time1} and calendar time @var{time0}, as | 
|  | a value of type @code{double}.  The difference ignores leap seconds | 
|  | unless leap second support is enabled. | 
|  |  | 
|  | In @theglibc{}, you can simply subtract @code{time_t} values.  But on | 
|  | other systems, the @code{time_t} data type might use some other encoding | 
|  | where subtraction doesn't work directly. | 
|  | @end deftypefun | 
|  |  | 
|  | @Theglibc{} provides two data types specifically for representing | 
|  | an elapsed time.  They are used by various @glibcadj{} functions, and | 
|  | you can use them for your own purposes too.  They're exactly the same | 
|  | except that one has a resolution in microseconds, and the other, newer | 
|  | one, is in nanoseconds. | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftp {Data Type} {struct timeval} | 
|  | @cindex timeval | 
|  | The @code{struct timeval} structure represents an elapsed time.  It is | 
|  | declared in @file{sys/time.h} and has the following members: | 
|  |  | 
|  | @table @code | 
|  | @item time_t tv_sec | 
|  | This represents the number of whole seconds of elapsed time. | 
|  |  | 
|  | @item long int tv_usec | 
|  | This is the rest of the elapsed time (a fraction of a second), | 
|  | represented as the number of microseconds.  It is always less than one | 
|  | million. | 
|  |  | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment POSIX.1 | 
|  | @deftp {Data Type} {struct timespec} | 
|  | @cindex timespec | 
|  | The @code{struct timespec} structure represents an elapsed time.  It is | 
|  | declared in @file{time.h} and has the following members: | 
|  |  | 
|  | @table @code | 
|  | @item time_t tv_sec | 
|  | This represents the number of whole seconds of elapsed time. | 
|  |  | 
|  | @item long int tv_nsec | 
|  | This is the rest of the elapsed time (a fraction of a second), | 
|  | represented as the number of nanoseconds.  It is always less than one | 
|  | billion. | 
|  |  | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | It is often necessary to subtract two values of type @w{@code{struct | 
|  | timeval}} or @w{@code{struct timespec}}.  Here is the best way to do | 
|  | this.  It works even on some peculiar operating systems where the | 
|  | @code{tv_sec} member has an unsigned type. | 
|  |  | 
|  | @smallexample | 
|  | @include timeval_subtract.c.texi | 
|  | @end smallexample | 
|  |  | 
|  | Common functions that use @code{struct timeval} are @code{gettimeofday} | 
|  | and @code{settimeofday}. | 
|  |  | 
|  |  | 
|  | There are no @glibcadj{} functions specifically oriented toward | 
|  | dealing with elapsed times, but the calendar time, processor time, and | 
|  | alarm and sleeping functions have a lot to do with them. | 
|  |  | 
|  |  | 
|  | @node Processor And CPU Time | 
|  | @section Processor And CPU Time | 
|  |  | 
|  | If you're trying to optimize your program or measure its efficiency, | 
|  | it's very useful to know how much processor time it uses.  For that, | 
|  | calendar time and elapsed times are useless because a process may spend | 
|  | time waiting for I/O or for other processes to use the CPU.  However, | 
|  | you can get the information with the functions in this section. | 
|  |  | 
|  | CPU time (@pxref{Time Basics}) is represented by the data type | 
|  | @code{clock_t}, which is a number of @dfn{clock ticks}.  It gives the | 
|  | total amount of time a process has actively used a CPU since some | 
|  | arbitrary event.  On @gnusystems{}, that event is the creation of the | 
|  | process.  While arbitrary in general, the event is always the same event | 
|  | for any particular process, so you can always measure how much time on | 
|  | the CPU a particular computation takes by examining the process' CPU | 
|  | time before and after the computation. | 
|  | @cindex CPU time | 
|  | @cindex clock ticks | 
|  | @cindex ticks, clock | 
|  |  | 
|  | On @gnulinuxhurdsystems{}, @code{clock_t} is equivalent to @code{long int} and | 
|  | @code{CLOCKS_PER_SEC} is an integer value.  But in other systems, both | 
|  | @code{clock_t} and the macro @code{CLOCKS_PER_SEC} can be either integer | 
|  | or floating-point types.  Casting CPU time values to @code{double}, as | 
|  | in the example above, makes sure that operations such as arithmetic and | 
|  | printing work properly and consistently no matter what the underlying | 
|  | representation is. | 
|  |  | 
|  | Note that the clock can wrap around.  On a 32bit system with | 
|  | @code{CLOCKS_PER_SEC} set to one million this function will return the | 
|  | same value approximately every 72 minutes. | 
|  |  | 
|  | For additional functions to examine a process' use of processor time, | 
|  | and to control it, see @ref{Resource Usage And Limitation}. | 
|  |  | 
|  |  | 
|  | @menu | 
|  | * CPU Time::                    The @code{clock} function. | 
|  | * Processor Time::              The @code{times} function. | 
|  | @end menu | 
|  |  | 
|  | @node CPU Time | 
|  | @subsection CPU Time Inquiry | 
|  |  | 
|  | To get a process' CPU time, you can use the @code{clock} function.  This | 
|  | facility is declared in the header file @file{time.h}. | 
|  | @pindex time.h | 
|  |  | 
|  | In typical usage, you call the @code{clock} function at the beginning | 
|  | and end of the interval you want to time, subtract the values, and then | 
|  | divide by @code{CLOCKS_PER_SEC} (the number of clock ticks per second) | 
|  | to get processor time, like this: | 
|  |  | 
|  | @smallexample | 
|  | @group | 
|  | #include <time.h> | 
|  |  | 
|  | clock_t start, end; | 
|  | double cpu_time_used; | 
|  |  | 
|  | start = clock(); | 
|  | @dots{} /* @r{Do the work.} */ | 
|  | end = clock(); | 
|  | cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; | 
|  | @end group | 
|  | @end smallexample | 
|  |  | 
|  | Do not use a single CPU time as an amount of time; it doesn't work that | 
|  | way.  Either do a subtraction as shown above or query processor time | 
|  | directly.  @xref{Processor Time}. | 
|  |  | 
|  | Different computers and operating systems vary wildly in how they keep | 
|  | track of CPU time.  It's common for the internal processor clock | 
|  | to have a resolution somewhere between a hundredth and millionth of a | 
|  | second. | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypevr Macro int CLOCKS_PER_SEC | 
|  | The value of this macro is the number of clock ticks per second measured | 
|  | by the @code{clock} function.  POSIX requires that this value be one | 
|  | million independent of the actual resolution. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftp {Data Type} clock_t | 
|  | This is the type of the value returned by the @code{clock} function. | 
|  | Values of type @code{clock_t} are numbers of clock ticks. | 
|  | @end deftp | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun clock_t clock (void) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On Hurd, this calls task_info twice and adds user and system time | 
|  | @c from both basic and thread time info structs.  On generic posix, | 
|  | @c calls times and adds utime and stime.  On bsd, calls getrusage and | 
|  | @c safely converts stime and utime to clock.  On linux, calls | 
|  | @c clock_gettime. | 
|  | This function returns the calling process' current CPU time.  If the CPU | 
|  | time is not available or cannot be represented, @code{clock} returns the | 
|  | value @code{(clock_t)(-1)}. | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @node Processor Time | 
|  | @subsection Processor Time Inquiry | 
|  |  | 
|  | The @code{times} function returns information about a process' | 
|  | consumption of processor time in a @w{@code{struct tms}} object, in | 
|  | addition to the process' CPU time.  @xref{Time Basics}.  You should | 
|  | include the header file @file{sys/times.h} to use this facility. | 
|  | @cindex processor time | 
|  | @cindex CPU time | 
|  | @pindex sys/times.h | 
|  |  | 
|  | @comment sys/times.h | 
|  | @comment POSIX.1 | 
|  | @deftp {Data Type} {struct tms} | 
|  | The @code{tms} structure is used to return information about process | 
|  | times.  It contains at least the following members: | 
|  |  | 
|  | @table @code | 
|  | @item clock_t tms_utime | 
|  | This is the total processor time the calling process has used in | 
|  | executing the instructions of its program. | 
|  |  | 
|  | @item clock_t tms_stime | 
|  | This is the processor time the system has used on behalf of the calling | 
|  | process. | 
|  |  | 
|  | @item clock_t tms_cutime | 
|  | This is the sum of the @code{tms_utime} values and the @code{tms_cutime} | 
|  | values of all terminated child processes of the calling process, whose | 
|  | status has been reported to the parent process by @code{wait} or | 
|  | @code{waitpid}; see @ref{Process Completion}.  In other words, it | 
|  | represents the total processor time used in executing the instructions | 
|  | of all the terminated child processes of the calling process, excluding | 
|  | child processes which have not yet been reported by @code{wait} or | 
|  | @code{waitpid}. | 
|  | @cindex child process | 
|  |  | 
|  | @item clock_t tms_cstime | 
|  | This is similar to @code{tms_cutime}, but represents the total processor | 
|  | time system has used on behalf of all the terminated child processes | 
|  | of the calling process. | 
|  | @end table | 
|  |  | 
|  | All of the times are given in numbers of clock ticks.  Unlike CPU time, | 
|  | these are the actual amounts of time; not relative to any event. | 
|  | @xref{Creating a Process}. | 
|  | @end deftp | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1 | 
|  | @deftypevr Macro int CLK_TCK | 
|  | This is an obsolete name for the number of clock ticks per second.  Use | 
|  | @code{sysconf (_SC_CLK_TCK)} instead. | 
|  | @end deftypevr | 
|  |  | 
|  | @comment sys/times.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun clock_t times (struct tms *@var{buffer}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On HURD, this calls task_info twice, for basic and thread times info, | 
|  | @c adding user and system times into tms, and then gettimeofday, to | 
|  | @c compute the real time.  On BSD, it calls getclktck, getrusage (twice) | 
|  | @c and time.  On Linux, it's a syscall with special handling to account | 
|  | @c for clock_t counts that look like error values. | 
|  | The @code{times} function stores the processor time information for | 
|  | the calling process in @var{buffer}. | 
|  |  | 
|  | The return value is the number of clock ticks since an arbitrary point | 
|  | in the past, e.g. since system start-up.  @code{times} returns | 
|  | @code{(clock_t)(-1)} to indicate failure. | 
|  | @end deftypefun | 
|  |  | 
|  | @strong{Portability Note:} The @code{clock} function described in | 
|  | @ref{CPU Time} is specified by the @w{ISO C} standard.  The | 
|  | @code{times} function is a feature of POSIX.1.  On @gnusystems{}, the | 
|  | CPU time is defined to be equivalent to the sum of the @code{tms_utime} | 
|  | and @code{tms_stime} fields returned by @code{times}. | 
|  |  | 
|  | @node Calendar Time | 
|  | @section Calendar Time | 
|  |  | 
|  | This section describes facilities for keeping track of calendar time. | 
|  | @xref{Time Basics}. | 
|  |  | 
|  | @Theglibc{} represents calendar time three ways: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | @dfn{Simple time} (the @code{time_t} data type) is a compact | 
|  | representation, typically giving the number of seconds of elapsed time | 
|  | since some implementation-specific base time. | 
|  | @cindex simple time | 
|  |  | 
|  | @item | 
|  | There is also a "high-resolution time" representation.  Like simple | 
|  | time, this represents a calendar time as an elapsed time since a base | 
|  | time, but instead of measuring in whole seconds, it uses a @code{struct | 
|  | timeval} data type, which includes fractions of a second.  Use this time | 
|  | representation instead of simple time when you need greater precision. | 
|  | @cindex high-resolution time | 
|  |  | 
|  | @item | 
|  | @dfn{Local time} or @dfn{broken-down time} (the @code{struct tm} data | 
|  | type) represents a calendar time as a set of components specifying the | 
|  | year, month, and so on in the Gregorian calendar, for a specific time | 
|  | zone.  This calendar time representation is usually used only to | 
|  | communicate with people. | 
|  | @cindex local time | 
|  | @cindex broken-down time | 
|  | @cindex Gregorian calendar | 
|  | @cindex calendar, Gregorian | 
|  | @end itemize | 
|  |  | 
|  | @menu | 
|  | * Simple Calendar Time::        Facilities for manipulating calendar time. | 
|  | * High-Resolution Calendar::    A time representation with greater precision. | 
|  | * Broken-down Time::            Facilities for manipulating local time. | 
|  | * High Accuracy Clock::         Maintaining a high accuracy system clock. | 
|  | * Formatting Calendar Time::    Converting times to strings. | 
|  | * Parsing Date and Time::       Convert textual time and date information back | 
|  | into broken-down time values. | 
|  | * TZ Variable::                 How users specify the time zone. | 
|  | * Time Zone Functions::         Functions to examine or specify the time zone. | 
|  | * Time Functions Example::      An example program showing use of some of | 
|  | the time functions. | 
|  | @end menu | 
|  |  | 
|  | @node Simple Calendar Time | 
|  | @subsection Simple Calendar Time | 
|  |  | 
|  | This section describes the @code{time_t} data type for representing calendar | 
|  | time as simple time, and the functions which operate on simple time objects. | 
|  | These facilities are declared in the header file @file{time.h}. | 
|  | @pindex time.h | 
|  |  | 
|  | @cindex epoch | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftp {Data Type} time_t | 
|  | This is the data type used to represent simple time.  Sometimes, it also | 
|  | represents an elapsed time.  When interpreted as a calendar time value, | 
|  | it represents the number of seconds elapsed since 00:00:00 on January 1, | 
|  | 1970, Coordinated Universal Time.  (This calendar time is sometimes | 
|  | referred to as the @dfn{epoch}.)  POSIX requires that this count not | 
|  | include leap seconds, but on some systems this count includes leap seconds | 
|  | if you set @code{TZ} to certain values (@pxref{TZ Variable}). | 
|  |  | 
|  | Note that a simple time has no concept of local time zone.  Calendar | 
|  | Time @var{T} is the same instant in time regardless of where on the | 
|  | globe the computer is. | 
|  |  | 
|  | In @theglibc{}, @code{time_t} is equivalent to @code{long int}. | 
|  | In other systems, @code{time_t} might be either an integer or | 
|  | floating-point type. | 
|  | @end deftp | 
|  |  | 
|  | The function @code{difftime} tells you the elapsed time between two | 
|  | simple calendar times, which is not always as easy to compute as just | 
|  | subtracting.  @xref{Elapsed Time}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun time_t time (time_t *@var{result}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | The @code{time} function returns the current calendar time as a value of | 
|  | type @code{time_t}.  If the argument @var{result} is not a null pointer, | 
|  | the calendar time value is also stored in @code{*@var{result}}.  If the | 
|  | current calendar time is not available, the value | 
|  | @w{@code{(time_t)(-1)}} is returned. | 
|  | @end deftypefun | 
|  |  | 
|  | @c The GNU C library implements stime() with a call to settimeofday() on | 
|  | @c Linux. | 
|  | @comment time.h | 
|  | @comment SVID, XPG | 
|  | @deftypefun int stime (const time_t *@var{newtime}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On unix, this is implemented in terms of settimeofday. | 
|  | @code{stime} sets the system clock, i.e., it tells the system that the | 
|  | current calendar time is @var{newtime}, where @code{newtime} is | 
|  | interpreted as described in the above definition of @code{time_t}. | 
|  |  | 
|  | @code{settimeofday} is a newer function which sets the system clock to | 
|  | better than one second precision.  @code{settimeofday} is generally a | 
|  | better choice than @code{stime}.  @xref{High-Resolution Calendar}. | 
|  |  | 
|  | Only the superuser can set the system clock. | 
|  |  | 
|  | If the function succeeds, the return value is zero.  Otherwise, it is | 
|  | @code{-1} and @code{errno} is set accordingly: | 
|  |  | 
|  | @table @code | 
|  | @item EPERM | 
|  | The process is not superuser. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  |  | 
|  | @node High-Resolution Calendar | 
|  | @subsection High-Resolution Calendar | 
|  |  | 
|  | The @code{time_t} data type used to represent simple times has a | 
|  | resolution of only one second.  Some applications need more precision. | 
|  |  | 
|  | So, @theglibc{} also contains functions which are capable of | 
|  | representing calendar times to a higher resolution than one second.  The | 
|  | functions and the associated data types described in this section are | 
|  | declared in @file{sys/time.h}. | 
|  | @pindex sys/time.h | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftp {Data Type} {struct timezone} | 
|  | The @code{struct timezone} structure is used to hold minimal information | 
|  | about the local time zone.  It has the following members: | 
|  |  | 
|  | @table @code | 
|  | @item int tz_minuteswest | 
|  | This is the number of minutes west of UTC. | 
|  |  | 
|  | @item int tz_dsttime | 
|  | If nonzero, Daylight Saving Time applies during some part of the year. | 
|  | @end table | 
|  |  | 
|  | The @code{struct timezone} type is obsolete and should never be used. | 
|  | Instead, use the facilities described in @ref{Time Zone Functions}. | 
|  | @end deftp | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftypefun int gettimeofday (struct timeval *@var{tp}, struct timezone *@var{tzp}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On most GNU/Linux systems this is a direct syscall, but the posix/ | 
|  | @c implementation (not used on GNU/Linux or GNU/Hurd) relies on time and | 
|  | @c localtime_r, saving and restoring tzname in an unsafe manner. | 
|  | @c On some GNU/Linux variants, ifunc resolvers are used in shared libc | 
|  | @c for vdso resolution.  ifunc-vdso-revisit. | 
|  | The @code{gettimeofday} function returns the current calendar time as | 
|  | the elapsed time since the epoch in the @code{struct timeval} structure | 
|  | indicated by @var{tp}.  (@pxref{Elapsed Time} for a description of | 
|  | @code{struct timeval}).  Information about the time zone is returned in | 
|  | the structure pointed at @var{tzp}.  If the @var{tzp} argument is a null | 
|  | pointer, time zone information is ignored. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure.  The | 
|  | following @code{errno} error condition is defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item ENOSYS | 
|  | The operating system does not support getting time zone information, and | 
|  | @var{tzp} is not a null pointer.  @gnusystems{} do not | 
|  | support using @w{@code{struct timezone}} to represent time zone | 
|  | information; that is an obsolete feature of 4.3 BSD. | 
|  | Instead, use the facilities described in @ref{Time Zone Functions}. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftypefun int settimeofday (const struct timeval *@var{tp}, const struct timezone *@var{tzp}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On HURD, it calls host_set_time with a privileged port.  On other | 
|  | @c unix systems, it's a syscall. | 
|  | The @code{settimeofday} function sets the current calendar time in the | 
|  | system clock according to the arguments.  As for @code{gettimeofday}, | 
|  | the calendar time is represented as the elapsed time since the epoch. | 
|  | As for @code{gettimeofday}, time zone information is ignored if | 
|  | @var{tzp} is a null pointer. | 
|  |  | 
|  | You must be a privileged user in order to use @code{settimeofday}. | 
|  |  | 
|  | Some kernels automatically set the system clock from some source such as | 
|  | a hardware clock when they start up.  Others, including Linux, place the | 
|  | system clock in an ``invalid'' state (in which attempts to read the clock | 
|  | fail).  A call of @code{stime} removes the system clock from an invalid | 
|  | state, and system startup scripts typically run a program that calls | 
|  | @code{stime}. | 
|  |  | 
|  | @code{settimeofday} causes a sudden jump forwards or backwards, which | 
|  | can cause a variety of problems in a system.  Use @code{adjtime} (below) | 
|  | to make a smooth transition from one time to another by temporarily | 
|  | speeding up or slowing down the clock. | 
|  |  | 
|  | With a Linux kernel, @code{adjtimex} does the same thing and can also | 
|  | make permanent changes to the speed of the system clock so it doesn't | 
|  | need to be corrected as often. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure.  The | 
|  | following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EPERM | 
|  | This process cannot set the clock because it is not privileged. | 
|  |  | 
|  | @item ENOSYS | 
|  | The operating system does not support setting time zone information, and | 
|  | @var{tzp} is not a null pointer. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @c On Linux, GNU libc implements adjtime() as a call to adjtimex(). | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftypefun int adjtime (const struct timeval *@var{delta}, struct timeval *@var{olddelta}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On hurd and mach, call host_adjust_time with a privileged port.  On | 
|  | @c Linux, it's implemented in terms of adjtimex.  On other unixen, it's | 
|  | @c a syscall. | 
|  | This function speeds up or slows down the system clock in order to make | 
|  | a gradual adjustment.  This ensures that the calendar time reported by | 
|  | the system clock is always monotonically increasing, which might not | 
|  | happen if you simply set the clock. | 
|  |  | 
|  | The @var{delta} argument specifies a relative adjustment to be made to | 
|  | the clock time.  If negative, the system clock is slowed down for a | 
|  | while until it has lost this much elapsed time.  If positive, the system | 
|  | clock is speeded up for a while. | 
|  |  | 
|  | If the @var{olddelta} argument is not a null pointer, the @code{adjtime} | 
|  | function returns information about any previous time adjustment that | 
|  | has not yet completed. | 
|  |  | 
|  | This function is typically used to synchronize the clocks of computers | 
|  | in a local network.  You must be a privileged user to use it. | 
|  |  | 
|  | With a Linux kernel, you can use the @code{adjtimex} function to | 
|  | permanently change the clock speed. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure.  The | 
|  | following @code{errno} error condition is defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EPERM | 
|  | You do not have privilege to set the time. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @strong{Portability Note:}  The @code{gettimeofday}, @code{settimeofday}, | 
|  | and @code{adjtime} functions are derived from BSD. | 
|  |  | 
|  |  | 
|  | Symbols for the following function are declared in @file{sys/timex.h}. | 
|  |  | 
|  | @comment sys/timex.h | 
|  | @comment GNU | 
|  | @deftypefun int adjtimex (struct timex *@var{timex}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c It's a syscall, only available on linux. | 
|  |  | 
|  | @code{adjtimex} is functionally identical to @code{ntp_adjtime}. | 
|  | @xref{High Accuracy Clock}. | 
|  |  | 
|  | This function is present only with a Linux kernel. | 
|  |  | 
|  | @end deftypefun | 
|  |  | 
|  | @node Broken-down Time | 
|  | @subsection Broken-down Time | 
|  | @cindex broken-down time | 
|  | @cindex calendar time and broken-down time | 
|  |  | 
|  | Calendar time is represented by the usual @glibcadj{} functions as an | 
|  | elapsed time since a fixed base calendar time.  This is convenient for | 
|  | computation, but has no relation to the way people normally think of | 
|  | calendar time.  By contrast, @dfn{broken-down time} is a binary | 
|  | representation of calendar time separated into year, month, day, and so | 
|  | on.  Broken-down time values are not useful for calculations, but they | 
|  | are useful for printing human readable time information. | 
|  |  | 
|  | A broken-down time value is always relative to a choice of time | 
|  | zone, and it also indicates which time zone that is. | 
|  |  | 
|  | The symbols in this section are declared in the header file @file{time.h}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftp {Data Type} {struct tm} | 
|  | This is the data type used to represent a broken-down time.  The structure | 
|  | contains at least the following members, which can appear in any order. | 
|  |  | 
|  | @table @code | 
|  | @item int tm_sec | 
|  | This is the number of full seconds since the top of the minute (normally | 
|  | in the range @code{0} through @code{59}, but the actual upper limit is | 
|  | @code{60}, to allow for leap seconds if leap second support is | 
|  | available). | 
|  | @cindex leap second | 
|  |  | 
|  | @item int tm_min | 
|  | This is the number of full minutes since the top of the hour (in the | 
|  | range @code{0} through @code{59}). | 
|  |  | 
|  | @item int tm_hour | 
|  | This is the number of full hours past midnight (in the range @code{0} through | 
|  | @code{23}). | 
|  |  | 
|  | @item int tm_mday | 
|  | This is the ordinal day of the month (in the range @code{1} through @code{31}). | 
|  | Watch out for this one!  As the only ordinal number in the structure, it is | 
|  | inconsistent with the rest of the structure. | 
|  |  | 
|  | @item int tm_mon | 
|  | This is the number of full calendar months since the beginning of the | 
|  | year (in the range @code{0} through @code{11}).  Watch out for this one! | 
|  | People usually use ordinal numbers for month-of-year (where January = 1). | 
|  |  | 
|  | @item int tm_year | 
|  | This is the number of full calendar years since 1900. | 
|  |  | 
|  | @item int tm_wday | 
|  | This is the number of full days since Sunday (in the range @code{0} through | 
|  | @code{6}). | 
|  |  | 
|  | @item int tm_yday | 
|  | This is the number of full days since the beginning of the year (in the | 
|  | range @code{0} through @code{365}). | 
|  |  | 
|  | @item int tm_isdst | 
|  | @cindex Daylight Saving Time | 
|  | @cindex summer time | 
|  | This is a flag that indicates whether Daylight Saving Time is (or was, or | 
|  | will be) in effect at the time described.  The value is positive if | 
|  | Daylight Saving Time is in effect, zero if it is not, and negative if the | 
|  | information is not available. | 
|  |  | 
|  | @item long int tm_gmtoff | 
|  | This field describes the time zone that was used to compute this | 
|  | broken-down time value, including any adjustment for daylight saving; it | 
|  | is the number of seconds that you must add to UTC to get local time. | 
|  | You can also think of this as the number of seconds east of UTC.  For | 
|  | example, for U.S. Eastern Standard Time, the value is @code{-5*60*60}. | 
|  | The @code{tm_gmtoff} field is derived from BSD and is a GNU library | 
|  | extension; it is not visible in a strict @w{ISO C} environment. | 
|  |  | 
|  | @item const char *tm_zone | 
|  | This field is the name for the time zone that was used to compute this | 
|  | broken-down time value.  Like @code{tm_gmtoff}, this field is a BSD and | 
|  | GNU extension, and is not visible in a strict @w{ISO C} environment. | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun {struct tm *} localtime (const time_t *@var{time}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c Calls tz_convert with a static buffer. | 
|  | @c localtime @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  tz_convert dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | The @code{localtime} function converts the simple time pointed to by | 
|  | @var{time} to broken-down time representation, expressed relative to the | 
|  | user's specified time zone. | 
|  |  | 
|  | The return value is a pointer to a static broken-down time structure, which | 
|  | might be overwritten by subsequent calls to @code{ctime}, @code{gmtime}, | 
|  | or @code{localtime}.  (But no other library function overwrites the contents | 
|  | of this object.) | 
|  |  | 
|  | The return value is the null pointer if @var{time} cannot be represented | 
|  | as a broken-down time; typically this is because the year cannot fit into | 
|  | an @code{int}. | 
|  |  | 
|  | Calling @code{localtime} also sets the current time zone as if | 
|  | @code{tzset} were called.  @xref{Time Zone Functions}. | 
|  | @end deftypefun | 
|  |  | 
|  | Using the @code{localtime} function is a big problem in multi-threaded | 
|  | programs.  The result is returned in a static buffer and this is used in | 
|  | all threads.  POSIX.1c introduced a variant of this function. | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1c | 
|  | @deftypefun {struct tm *} localtime_r (const time_t *@var{time}, struct tm *@var{resultp}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c localtime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  tz_convert(use_localtime) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   libc_lock_lock dup @asulock @aculock | 
|  | @c   tzset_internal @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c     always called with tzset_lock held | 
|  | @c     sets static is_initialized before initialization; | 
|  | @c     reads and sets old_tz; sets tz_rules. | 
|  | @c     some of the issues only apply on the first call. | 
|  | @c     subsequent calls only trigger these when called by localtime; | 
|  | @c     otherwise, they're ok. | 
|  | @c    getenv dup @mtsenv | 
|  | @c    strcmp dup ok | 
|  | @c    strdup @ascuheap | 
|  | @c    tzfile_read @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c     memcmp dup ok | 
|  | @c     strstr dup ok | 
|  | @c     getenv dup @mtsenv | 
|  | @c     asprintf dup @mtslocale @ascuheap @acsmem | 
|  | @c     stat64 dup ok | 
|  | @c     fopen dup @ascuheap @asulock @acsmem @acsfd @aculock | 
|  | @c     fileno dup ok | 
|  | @c     fstat64 dup ok | 
|  | @c     fclose dup @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c     free dup @ascuheap @acsmem | 
|  | @c     fsetlocking dup ok [no @mtasurace:stream @asulock, exclusive] | 
|  | @c     fread_unlocked dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] | 
|  | @c     memcpy dup ok | 
|  | @c     decode ok | 
|  | @c      bswap_32 dup ok | 
|  | @c     fseek dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] | 
|  | @c     ftello dup ok [no @mtasurace:stream @asucorrupt @acucorrupt] | 
|  | @c     malloc dup @ascuheap @acsmem | 
|  | @c     decode64 ok | 
|  | @c      bswap_64 dup ok | 
|  | @c     getc_unlocked ok [no @mtasurace:stream @asucorrupt @acucorrupt] | 
|  | @c     tzstring dup @ascuheap @acsmem | 
|  | @c     compute_tzname_max dup ok [guarded by tzset_lock] | 
|  | @c    memset dup ok | 
|  | @c    update_vars ok [guarded by tzset_lock] | 
|  | @c      sets daylight, timezone, tzname and tzname_cur_max; | 
|  | @c      called only with tzset_lock held, unless tzset_parse_tz | 
|  | @c      (internal, but not static) gets called by users; given the its | 
|  | @c      double-underscore-prefixed name, this interface violation could | 
|  | @c      be regarded as undefined behavior. | 
|  | @c     strlen ok | 
|  | @c    tzset_parse_tz @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c     sscanf dup @mtslocale @ascuheap @acsmem | 
|  | @c     isalnum dup @mtsenv | 
|  | @c     tzstring @ascuheap @acsmem | 
|  | @c       reads and changes tzstring_list without synchronization, but | 
|  | @c       only called with tzset_lock held (save for interface violations) | 
|  | @c      strlen dup ok | 
|  | @c      malloc dup @ascuheap @acsmem | 
|  | @c      strcpy dup ok | 
|  | @c     isdigit dup @mtslocale | 
|  | @c     compute_offset ok | 
|  | @c     tzfile_default @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c       sets tzname, timezone, types, zone_names, rule_*off, etc; no guards | 
|  | @c      strlen dup ok | 
|  | @c      tzfile_read dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c      mempcpy dup ok | 
|  | @c      compute_tzname_max ok [if guarded by tzset_lock] | 
|  | @c        iterates over zone_names; no guards | 
|  | @c     free dup @ascuheap @acsmem | 
|  | @c     strtoul dup @mtslocale | 
|  | @c     update_vars dup ok | 
|  | @c   tzfile_compute(use_localtime) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c     sets tzname; no guards.  with !use_localtime, as in gmtime, it's ok | 
|  | @c    tzstring dup @acsuheap @acsmem | 
|  | @c    tzset_parse_tz dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    offtime dup ok | 
|  | @c    tz_compute dup ok | 
|  | @c    strcmp dup ok | 
|  | @c   offtime ok | 
|  | @c    isleap dup ok | 
|  | @c   tz_compute ok | 
|  | @c    compute_change ok | 
|  | @c     isleap ok | 
|  | @c   libc_lock_unlock dup @aculock | 
|  |  | 
|  | The @code{localtime_r} function works just like the @code{localtime} | 
|  | function.  It takes a pointer to a variable containing a simple time | 
|  | and converts it to the broken-down time format. | 
|  |  | 
|  | But the result is not placed in a static buffer.  Instead it is placed | 
|  | in the object of type @code{struct tm} to which the parameter | 
|  | @var{resultp} points. | 
|  |  | 
|  | If the conversion is successful the function returns a pointer to the | 
|  | object the result was written into, i.e., it returns @var{resultp}. | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun {struct tm *} gmtime (const time_t *@var{time}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c gmtime @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  tz_convert dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | This function is similar to @code{localtime}, except that the broken-down | 
|  | time is expressed as Coordinated Universal Time (UTC) (formerly called | 
|  | Greenwich Mean Time (GMT)) rather than relative to a local time zone. | 
|  |  | 
|  | @end deftypefun | 
|  |  | 
|  | As for the @code{localtime} function we have the problem that the result | 
|  | is placed in a static variable.  POSIX.1c also provides a replacement for | 
|  | @code{gmtime}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1c | 
|  | @deftypefun {struct tm *} gmtime_r (const time_t *@var{time}, struct tm *@var{resultp}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c You'd think tz_convert could avoid some safety issues with | 
|  | @c !use_localtime, but no such luck: tzset_internal will always bring | 
|  | @c about all possible AS and AC problems when it's first called. | 
|  | @c Calling any of localtime,gmtime_r once would run the initialization | 
|  | @c and avoid the heap, mem and fd issues in gmtime* in subsequent calls, | 
|  | @c but the unsafe locking would remain. | 
|  | @c gmtime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  tz_convert(gmtime_r) dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | This function is similar to @code{localtime_r}, except that it converts | 
|  | just like @code{gmtime} the given time as Coordinated Universal Time. | 
|  |  | 
|  | If the conversion is successful the function returns a pointer to the | 
|  | object the result was written into, i.e., it returns @var{resultp}. | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun time_t mktime (struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c mktime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   passes a static localtime_offset to mktime_internal; it is read | 
|  | @c   once, used as an initial guess, and updated at the end, but not | 
|  | @c   used except as a guess for subsequent calls, so it should be safe. | 
|  | @c   Even though a compiler might delay the load and perform it multiple | 
|  | @c   times (bug 16346), there are at least two unconditional uses of the | 
|  | @c   auto variable in which the first load is stored, separated by a | 
|  | @c   call to an external function, and a conditional change of the | 
|  | @c   variable before the external call, so refraining from allocating a | 
|  | @c   local variable at the first load would be a very bad optimization. | 
|  | @c  tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  mktime_internal(localtime_r) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   ydhms_diff ok | 
|  | @c   ranged_convert(localtime_r) @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    *convert = localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    time_t_avg dup ok | 
|  | @c   guess_time_tm dup ok | 
|  | @c    ydhms_diff dup ok | 
|  | @c    time_t_add_ok ok | 
|  | @c     time_t_avg ok | 
|  | @c   isdst_differ ok | 
|  | @c   time_t_int_add_ok ok | 
|  | The @code{mktime} function converts a broken-down time structure to a | 
|  | simple time representation.  It also normalizes the contents of the | 
|  | broken-down time structure, and fills in some components based on the | 
|  | values of the others. | 
|  |  | 
|  | The @code{mktime} function ignores the specified contents of the | 
|  | @code{tm_wday}, @code{tm_yday}, @code{tm_gmtoff}, and @code{tm_zone} | 
|  | members of the broken-down time | 
|  | structure.  It uses the values of the other components to determine the | 
|  | calendar time; it's permissible for these components to have | 
|  | unnormalized values outside their normal ranges.  The last thing that | 
|  | @code{mktime} does is adjust the components of the @var{brokentime} | 
|  | structure, including the members that were initially ignored. | 
|  |  | 
|  | If the specified broken-down time cannot be represented as a simple time, | 
|  | @code{mktime} returns a value of @code{(time_t)(-1)} and does not modify | 
|  | the contents of @var{brokentime}. | 
|  |  | 
|  | Calling @code{mktime} also sets the current time zone as if | 
|  | @code{tzset} were called; @code{mktime} uses this information instead | 
|  | of @var{brokentime}'s initial @code{tm_gmtoff} and @code{tm_zone} | 
|  | members.  @xref{Time Zone Functions}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment ??? | 
|  | @deftypefun time_t timelocal (struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c Alias to mktime. | 
|  |  | 
|  | @code{timelocal} is functionally identical to @code{mktime}, but more | 
|  | mnemonically named.  Note that it is the inverse of the @code{localtime} | 
|  | function. | 
|  |  | 
|  | @strong{Portability note:}  @code{mktime} is essentially universally | 
|  | available.  @code{timelocal} is rather rare. | 
|  |  | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment ??? | 
|  | @deftypefun time_t timegm (struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c timegm @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   gmtime_offset triggers the same caveats as localtime_offset in mktime. | 
|  | @c   although gmtime_r, as called by mktime, might save some issues, | 
|  | @c   tzset calls tzset_internal with always, which forces | 
|  | @c   reinitialization, so all issues may arise. | 
|  | @c  tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  mktime_internal(gmtime_r) @asulock @aculock | 
|  | @c ..gmtime_r @asulock @aculock | 
|  | @c    ... dup ok | 
|  | @c    tz_convert(!use_localtime) @asulock @aculock | 
|  | @c     ... dup @asulock @aculock | 
|  | @c     tzfile_compute(!use_localtime) ok | 
|  |  | 
|  | @code{timegm} is functionally identical to @code{mktime} except it | 
|  | always takes the input values to be Coordinated Universal Time (UTC) | 
|  | regardless of any local time zone setting. | 
|  |  | 
|  | Note that @code{timegm} is the inverse of @code{gmtime}. | 
|  |  | 
|  | @strong{Portability note:}  @code{mktime} is essentially universally | 
|  | available.  @code{timegm} is rather rare.  For the most portable | 
|  | conversion from a UTC broken-down time to a simple time, set | 
|  | the @code{TZ} environment variable to UTC, call @code{mktime}, then set | 
|  | @code{TZ} back. | 
|  |  | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  |  | 
|  | @node High Accuracy Clock | 
|  | @subsection High Accuracy Clock | 
|  |  | 
|  | @cindex time, high precision | 
|  | @cindex clock, high accuracy | 
|  | @pindex sys/timex.h | 
|  | @c On Linux, GNU libc implements ntp_gettime() and npt_adjtime() as calls | 
|  | @c to adjtimex(). | 
|  | The @code{ntp_gettime} and @code{ntp_adjtime} functions provide an | 
|  | interface to monitor and manipulate the system clock to maintain high | 
|  | accuracy time.  For example, you can fine tune the speed of the clock | 
|  | or synchronize it with another time source. | 
|  |  | 
|  | A typical use of these functions is by a server implementing the Network | 
|  | Time Protocol to synchronize the clocks of multiple systems and high | 
|  | precision clocks. | 
|  |  | 
|  | These functions are declared in @file{sys/timex.h}. | 
|  |  | 
|  | @tindex struct ntptimeval | 
|  | @deftp {Data Type} {struct ntptimeval} | 
|  | This structure is used for information about the system clock.  It | 
|  | contains the following members: | 
|  | @table @code | 
|  | @item struct timeval time | 
|  | This is the current calendar time, expressed as the elapsed time since | 
|  | the epoch.  The @code{struct timeval} data type is described in | 
|  | @ref{Elapsed Time}. | 
|  |  | 
|  | @item long int maxerror | 
|  | This is the maximum error, measured in microseconds.  Unless updated | 
|  | via @code{ntp_adjtime} periodically, this value will reach some | 
|  | platform-specific maximum value. | 
|  |  | 
|  | @item long int esterror | 
|  | This is the estimated error, measured in microseconds.  This value can | 
|  | be set by @code{ntp_adjtime} to indicate the estimated offset of the | 
|  | system clock from the true calendar time. | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment sys/timex.h | 
|  | @comment GNU | 
|  | @deftypefun int ntp_gettime (struct ntptimeval *@var{tptr}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c Wrapper for adjtimex. | 
|  | The @code{ntp_gettime} function sets the structure pointed to by | 
|  | @var{tptr} to current values.  The elements of the structure afterwards | 
|  | contain the values the timer implementation in the kernel assumes.  They | 
|  | might or might not be correct.  If they are not a @code{ntp_adjtime} | 
|  | call is necessary. | 
|  |  | 
|  | The return value is @code{0} on success and other values on failure.  The | 
|  | following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item TIME_ERROR | 
|  | The precision clock model is not properly set up at the moment, thus the | 
|  | clock must be considered unsynchronized, and the values should be | 
|  | treated with care. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @tindex struct timex | 
|  | @deftp {Data Type} {struct timex} | 
|  | This structure is used to control and monitor the system clock.  It | 
|  | contains the following members: | 
|  | @table @code | 
|  | @item unsigned int modes | 
|  | This variable controls whether and which values are set.  Several | 
|  | symbolic constants have to be combined with @emph{binary or} to specify | 
|  | the effective mode.  These constants start with @code{MOD_}. | 
|  |  | 
|  | @item long int offset | 
|  | This value indicates the current offset of the system clock from the true | 
|  | calendar time.  The value is given in microseconds.  If bit | 
|  | @code{MOD_OFFSET} is set in @code{modes}, the offset (and possibly other | 
|  | dependent values) can be set.  The offset's absolute value must not | 
|  | exceed @code{MAXPHASE}. | 
|  |  | 
|  |  | 
|  | @item long int frequency | 
|  | This value indicates the difference in frequency between the true | 
|  | calendar time and the system clock.  The value is expressed as scaled | 
|  | PPM (parts per million, 0.0001%).  The scaling is @code{1 << | 
|  | SHIFT_USEC}.  The value can be set with bit @code{MOD_FREQUENCY}, but | 
|  | the absolute value must not exceed @code{MAXFREQ}. | 
|  |  | 
|  | @item long int maxerror | 
|  | This is the maximum error, measured in microseconds.  A new value can be | 
|  | set using bit @code{MOD_MAXERROR}.  Unless updated via | 
|  | @code{ntp_adjtime} periodically, this value will increase steadily | 
|  | and reach some platform-specific maximum value. | 
|  |  | 
|  | @item long int esterror | 
|  | This is the estimated error, measured in microseconds.  This value can | 
|  | be set using bit @code{MOD_ESTERROR}. | 
|  |  | 
|  | @item int status | 
|  | This variable reflects the various states of the clock machinery.  There | 
|  | are symbolic constants for the significant bits, starting with | 
|  | @code{STA_}.  Some of these flags can be updated using the | 
|  | @code{MOD_STATUS} bit. | 
|  |  | 
|  | @item long int constant | 
|  | This value represents the bandwidth or stiffness of the PLL (phase | 
|  | locked loop) implemented in the kernel.  The value can be changed using | 
|  | bit @code{MOD_TIMECONST}. | 
|  |  | 
|  | @item long int precision | 
|  | This value represents the accuracy or the maximum error when reading the | 
|  | system clock.  The value is expressed in microseconds. | 
|  |  | 
|  | @item long int tolerance | 
|  | This value represents the maximum frequency error of the system clock in | 
|  | scaled PPM.  This value is used to increase the @code{maxerror} every | 
|  | second. | 
|  |  | 
|  | @item struct timeval time | 
|  | The current calendar time. | 
|  |  | 
|  | @item long int tick | 
|  | The elapsed time between clock ticks in microseconds.  A clock tick is a | 
|  | periodic timer interrupt on which the system clock is based. | 
|  |  | 
|  | @item long int ppsfreq | 
|  | This is the first of a few optional variables that are present only if | 
|  | the system clock can use a PPS (pulse per second) signal to discipline | 
|  | the system clock.  The value is expressed in scaled PPM and it denotes | 
|  | the difference in frequency between the system clock and the PPS signal. | 
|  |  | 
|  | @item long int jitter | 
|  | This value expresses a median filtered average of the PPS signal's | 
|  | dispersion in microseconds. | 
|  |  | 
|  | @item int shift | 
|  | This value is a binary exponent for the duration of the PPS calibration | 
|  | interval, ranging from @code{PPS_SHIFT} to @code{PPS_SHIFTMAX}. | 
|  |  | 
|  | @item long int stabil | 
|  | This value represents the median filtered dispersion of the PPS | 
|  | frequency in scaled PPM. | 
|  |  | 
|  | @item long int jitcnt | 
|  | This counter represents the number of pulses where the jitter exceeded | 
|  | the allowed maximum @code{MAXTIME}. | 
|  |  | 
|  | @item long int calcnt | 
|  | This counter reflects the number of successful calibration intervals. | 
|  |  | 
|  | @item long int errcnt | 
|  | This counter represents the number of calibration errors (caused by | 
|  | large offsets or jitter). | 
|  |  | 
|  | @item long int stbcnt | 
|  | This counter denotes the number of calibrations where the stability | 
|  | exceeded the threshold. | 
|  | @end table | 
|  | @end deftp | 
|  |  | 
|  | @comment sys/timex.h | 
|  | @comment GNU | 
|  | @deftypefun int ntp_adjtime (struct timex *@var{tptr}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c Alias to adjtimex syscall. | 
|  | The @code{ntp_adjtime} function sets the structure specified by | 
|  | @var{tptr} to current values. | 
|  |  | 
|  | In addition, @code{ntp_adjtime} updates some settings to match what you | 
|  | pass to it in *@var{tptr}.  Use the @code{modes} element of *@var{tptr} | 
|  | to select what settings to update.  You can set @code{offset}, | 
|  | @code{freq}, @code{maxerror}, @code{esterror}, @code{status}, | 
|  | @code{constant}, and @code{tick}. | 
|  |  | 
|  | @code{modes} = zero means set nothing. | 
|  |  | 
|  | Only the superuser can update settings. | 
|  |  | 
|  | @c On Linux, ntp_adjtime() also does the adjtime() function if you set | 
|  | @c modes = ADJ_OFFSET_SINGLESHOT (in fact, that is how GNU libc implements | 
|  | @c adjtime()).  But this should be considered an internal function because | 
|  | @c it's so inconsistent with the rest of what ntp_adjtime() does and is | 
|  | @c forced in an ugly way into the struct timex.  So we don't document it | 
|  | @c and instead document adjtime() as the way to achieve the function. | 
|  |  | 
|  | The return value is @code{0} on success and other values on failure.  The | 
|  | following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item TIME_ERROR | 
|  | The high accuracy clock model is not properly set up at the moment, thus the | 
|  | clock must be considered unsynchronized, and the values should be | 
|  | treated with care.  Another reason could be that the specified new values | 
|  | are not allowed. | 
|  |  | 
|  | @item EPERM | 
|  | The process specified a settings update, but is not superuser. | 
|  |  | 
|  | @end table | 
|  |  | 
|  | For more details see RFC1305 (Network Time Protocol, Version 3) and | 
|  | related documents. | 
|  |  | 
|  | @strong{Portability note:} Early versions of @theglibc{} did not | 
|  | have this function but did have the synonymous @code{adjtimex}. | 
|  |  | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @node Formatting Calendar Time | 
|  | @subsection Formatting Calendar Time | 
|  |  | 
|  | The functions described in this section format calendar time values as | 
|  | strings.  These functions are declared in the header file @file{time.h}. | 
|  | @pindex time.h | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun {char *} asctime (const struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:asctime} @mtslocale{}}@asunsafe{}@acsafe{}} | 
|  | @c asctime @mtasurace:asctime @mtslocale | 
|  | @c   Uses a static buffer. | 
|  | @c  asctime_internal @mtslocale | 
|  | @c   snprintf dup @mtslocale [no @acsuheap @acsmem] | 
|  | @c   ab_day_name @mtslocale | 
|  | @c   ab_month_name @mtslocale | 
|  | The @code{asctime} function converts the broken-down time value that | 
|  | @var{brokentime} points to into a string in a standard format: | 
|  |  | 
|  | @smallexample | 
|  | "Tue May 21 13:46:22 1991\n" | 
|  | @end smallexample | 
|  |  | 
|  | The abbreviations for the days of week are: @samp{Sun}, @samp{Mon}, | 
|  | @samp{Tue}, @samp{Wed}, @samp{Thu}, @samp{Fri}, and @samp{Sat}. | 
|  |  | 
|  | The abbreviations for the months are: @samp{Jan}, @samp{Feb}, | 
|  | @samp{Mar}, @samp{Apr}, @samp{May}, @samp{Jun}, @samp{Jul}, @samp{Aug}, | 
|  | @samp{Sep}, @samp{Oct}, @samp{Nov}, and @samp{Dec}. | 
|  |  | 
|  | The return value points to a statically allocated string, which might be | 
|  | overwritten by subsequent calls to @code{asctime} or @code{ctime}. | 
|  | (But no other library function overwrites the contents of this | 
|  | string.) | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1c | 
|  | @deftypefun {char *} asctime_r (const struct tm *@var{brokentime}, char *@var{buffer}) | 
|  | @safety{@prelim{}@mtsafe{@mtslocale{}}@assafe{}@acsafe{}} | 
|  | @c asctime_r @mtslocale | 
|  | @c  asctime_internal dup @mtslocale | 
|  | This function is similar to @code{asctime} but instead of placing the | 
|  | result in a static buffer it writes the string in the buffer pointed to | 
|  | by the parameter @var{buffer}.  This buffer should have room | 
|  | for at least 26 bytes, including the terminating null. | 
|  |  | 
|  | If no error occurred the function returns a pointer to the string the | 
|  | result was written into, i.e., it returns @var{buffer}.  Otherwise | 
|  | return @code{NULL}. | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun {char *} ctime (const time_t *@var{time}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:tmbuf} @mtasurace{:asctime} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c ctime @mtasurace:tmbuf @mtasurace:asctime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  localtime dup @mtasurace:tmbuf @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  asctime dup @mtasurace:asctime @mtslocale | 
|  | The @code{ctime} function is similar to @code{asctime}, except that you | 
|  | specify the calendar time argument as a @code{time_t} simple time value | 
|  | rather than in broken-down local time format.  It is equivalent to | 
|  |  | 
|  | @smallexample | 
|  | asctime (localtime (@var{time})) | 
|  | @end smallexample | 
|  |  | 
|  | Calling @code{ctime} also sets the current time zone as if | 
|  | @code{tzset} were called.  @xref{Time Zone Functions}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1c | 
|  | @deftypefun {char *} ctime_r (const time_t *@var{time}, char *@var{buffer}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c ctime_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  asctime_r dup @mtslocale | 
|  | This function is similar to @code{ctime}, but places the result in the | 
|  | string pointed to by @var{buffer}.  It is equivalent to (written using | 
|  | gcc extensions, @pxref{Statement Exprs,,,gcc,Porting and Using gcc}): | 
|  |  | 
|  | @smallexample | 
|  | (@{ struct tm tm; asctime_r (localtime_r (time, &tm), buf); @}) | 
|  | @end smallexample | 
|  |  | 
|  | If no error occurred the function returns a pointer to the string the | 
|  | result was written into, i.e., it returns @var{buffer}.  Otherwise | 
|  | return @code{NULL}. | 
|  | @end deftypefun | 
|  |  | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO | 
|  | @deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} | 
|  | @c strftime @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c  strftime_l @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c   strftime_internal @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c    add ok | 
|  | @c     memset_zero dup ok | 
|  | @c     memset_space dup ok | 
|  | @c    strlen dup ok | 
|  | @c    mbrlen @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd [no @mtasurace:mbstate/!ps] | 
|  | @c    mbsinit dup ok | 
|  | @c    cpy ok | 
|  | @c     add dup ok | 
|  | @c     memcpy_lowcase ok | 
|  | @c      TOLOWER ok | 
|  | @c       tolower_l ok | 
|  | @c     memcpy_uppcase ok | 
|  | @c      TOUPPER ok | 
|  | @c       toupper_l ok | 
|  | @c     MEMCPY ok | 
|  | @c      memcpy dup ok | 
|  | @c    ISDIGIT ok | 
|  | @c    STRLEN ok | 
|  | @c     strlen dup ok | 
|  | @c    strftime_internal dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c    TOUPPER dup ok | 
|  | @c    nl_get_era_entry @ascuheap @asulock @acsmem @aculock | 
|  | @c     nl_init_era_entries @ascuheap @asulock @acsmem @aculock | 
|  | @c      libc_rwlock_wrlock dup @asulock @aculock | 
|  | @c      malloc dup @ascuheap @acsmem | 
|  | @c      memset dup ok | 
|  | @c      free dup @ascuheap @acsmem | 
|  | @c      realloc dup @ascuheap @acsmem | 
|  | @c      memcpy dup ok | 
|  | @c      strchr dup ok | 
|  | @c      wcschr dup ok | 
|  | @c      libc_rwlock_unlock dup @asulock @aculock | 
|  | @c     ERA_DATE_CMP ok | 
|  | @c    DO_NUMBER ok | 
|  | @c    DO_NUMBER_SPACEPAD ok | 
|  | @c    nl_get_alt_digit @ascuheap @asulock @acsmem @aculock | 
|  | @c     libc_rwlock_wrlock dup @asulock @aculock | 
|  | @c     nl_init_alt_digit @ascuheap @acsmem | 
|  | @c      malloc dup @ascuheap @acsmem | 
|  | @c      memset dup ok | 
|  | @c      strchr dup ok | 
|  | @c     libc_rwlock_unlock dup @aculock | 
|  | @c    memset_space ok | 
|  | @c     memset dup ok | 
|  | @c    memset_zero ok | 
|  | @c     memset dup ok | 
|  | @c    mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    iso_week_days ok | 
|  | @c    isleap ok | 
|  | @c    tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    gmtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    tm_diff ok | 
|  | This function is similar to the @code{sprintf} function (@pxref{Formatted | 
|  | Input}), but the conversion specifications that can appear in the format | 
|  | template @var{template} are specialized for printing components of the date | 
|  | and time @var{brokentime} according to the locale currently specified for | 
|  | time conversion (@pxref{Locales}) and the current time zone | 
|  | (@pxref{Time Zone Functions}). | 
|  |  | 
|  | Ordinary characters appearing in the @var{template} are copied to the | 
|  | output string @var{s}; this can include multibyte character sequences. | 
|  | Conversion specifiers are introduced by a @samp{%} character, followed | 
|  | by an optional flag which can be one of the following.  These flags | 
|  | are all GNU extensions.  The first three affect only the output of | 
|  | numbers: | 
|  |  | 
|  | @table @code | 
|  | @item _ | 
|  | The number is padded with spaces. | 
|  |  | 
|  | @item - | 
|  | The number is not padded at all. | 
|  |  | 
|  | @item 0 | 
|  | The number is padded with zeros even if the format specifies padding | 
|  | with spaces. | 
|  |  | 
|  | @item ^ | 
|  | The output uses uppercase characters, but only if this is possible | 
|  | (@pxref{Case Conversion}). | 
|  | @end table | 
|  |  | 
|  | The default action is to pad the number with zeros to keep it a constant | 
|  | width.  Numbers that do not have a range indicated below are never | 
|  | padded, since there is no natural width for them. | 
|  |  | 
|  | Following the flag an optional specification of the width is possible. | 
|  | This is specified in decimal notation.  If the natural size of the | 
|  | output is of the field has less than the specified number of characters, | 
|  | the result is written right adjusted and space padded to the given | 
|  | size. | 
|  |  | 
|  | An optional modifier can follow the optional flag and width | 
|  | specification.  The modifiers, which were first standardized by | 
|  | POSIX.2-1992 and by @w{ISO C99}, are: | 
|  |  | 
|  | @table @code | 
|  | @item E | 
|  | Use the locale's alternate representation for date and time.  This | 
|  | modifier applies to the @code{%c}, @code{%C}, @code{%x}, @code{%X}, | 
|  | @code{%y} and @code{%Y} format specifiers.  In a Japanese locale, for | 
|  | example, @code{%Ex} might yield a date format based on the Japanese | 
|  | Emperors' reigns. | 
|  |  | 
|  | @item O | 
|  | Use the locale's alternate numeric symbols for numbers.  This modifier | 
|  | applies only to numeric format specifiers. | 
|  | @end table | 
|  |  | 
|  | If the format supports the modifier but no alternate representation | 
|  | is available, it is ignored. | 
|  |  | 
|  | The conversion specifier ends with a format specifier taken from the | 
|  | following list.  The whole @samp{%} sequence is replaced in the output | 
|  | string as follows: | 
|  |  | 
|  | @table @code | 
|  | @item %a | 
|  | The abbreviated weekday name according to the current locale. | 
|  |  | 
|  | @item %A | 
|  | The full weekday name according to the current locale. | 
|  |  | 
|  | @item %b | 
|  | The abbreviated month name according to the current locale. | 
|  |  | 
|  | @item %B | 
|  | The full month name according to the current locale. | 
|  |  | 
|  | Using @code{%B} together with @code{%d} produces grammatically | 
|  | incorrect results for some locales. | 
|  |  | 
|  | @item %c | 
|  | The preferred calendar time representation for the current locale. | 
|  |  | 
|  | @item %C | 
|  | The century of the year.  This is equivalent to the greatest integer not | 
|  | greater than the year divided by 100. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %d | 
|  | The day of the month as a decimal number (range @code{01} through @code{31}). | 
|  |  | 
|  | @item %D | 
|  | The date using the format @code{%m/%d/%y}. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %e | 
|  | The day of the month like with @code{%d}, but padded with blank (range | 
|  | @code{ 1} through @code{31}). | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %F | 
|  | The date using the format @code{%Y-%m-%d}.  This is the form specified | 
|  | in the @w{ISO 8601} standard and is the preferred form for all uses. | 
|  |  | 
|  | This format was first standardized by @w{ISO C99} and by POSIX.1-2001. | 
|  |  | 
|  | @item %g | 
|  | The year corresponding to the ISO week number, but without the century | 
|  | (range @code{00} through @code{99}).  This has the same format and value | 
|  | as @code{%y}, except that if the ISO week number (see @code{%V}) belongs | 
|  | to the previous or next year, that year is used instead. | 
|  |  | 
|  | This format was first standardized by @w{ISO C99} and by POSIX.1-2001. | 
|  |  | 
|  | @item %G | 
|  | The year corresponding to the ISO week number.  This has the same format | 
|  | and value as @code{%Y}, except that if the ISO week number (see | 
|  | @code{%V}) belongs to the previous or next year, that year is used | 
|  | instead. | 
|  |  | 
|  | This format was first standardized by @w{ISO C99} and by POSIX.1-2001 | 
|  | but was previously available as a GNU extension. | 
|  |  | 
|  | @item %h | 
|  | The abbreviated month name according to the current locale.  The action | 
|  | is the same as for @code{%b}. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %H | 
|  | The hour as a decimal number, using a 24-hour clock (range @code{00} through | 
|  | @code{23}). | 
|  |  | 
|  | @item %I | 
|  | The hour as a decimal number, using a 12-hour clock (range @code{01} through | 
|  | @code{12}). | 
|  |  | 
|  | @item %j | 
|  | The day of the year as a decimal number (range @code{001} through @code{366}). | 
|  |  | 
|  | @item %k | 
|  | The hour as a decimal number, using a 24-hour clock like @code{%H}, but | 
|  | padded with blank (range @code{ 0} through @code{23}). | 
|  |  | 
|  | This format is a GNU extension. | 
|  |  | 
|  | @item %l | 
|  | The hour as a decimal number, using a 12-hour clock like @code{%I}, but | 
|  | padded with blank (range @code{ 1} through @code{12}). | 
|  |  | 
|  | This format is a GNU extension. | 
|  |  | 
|  | @item %m | 
|  | The month as a decimal number (range @code{01} through @code{12}). | 
|  |  | 
|  | @item %M | 
|  | The minute as a decimal number (range @code{00} through @code{59}). | 
|  |  | 
|  | @item %n | 
|  | A single @samp{\n} (newline) character. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %p | 
|  | Either @samp{AM} or @samp{PM}, according to the given time value; or the | 
|  | corresponding strings for the current locale.  Noon is treated as | 
|  | @samp{PM} and midnight as @samp{AM}.  In most locales | 
|  | @samp{AM}/@samp{PM} format is not supported, in such cases @code{"%p"} | 
|  | yields an empty string. | 
|  |  | 
|  | @ignore | 
|  | We currently have a problem with makeinfo.  Write @samp{AM} and @samp{am} | 
|  | both results in `am'.  I.e., the difference in case is not visible anymore. | 
|  | @end ignore | 
|  | @item %P | 
|  | Either @samp{am} or @samp{pm}, according to the given time value; or the | 
|  | corresponding strings for the current locale, printed in lowercase | 
|  | characters.  Noon is treated as @samp{pm} and midnight as @samp{am}.  In | 
|  | most locales @samp{AM}/@samp{PM} format is not supported, in such cases | 
|  | @code{"%P"} yields an empty string. | 
|  |  | 
|  | This format is a GNU extension. | 
|  |  | 
|  | @item %r | 
|  | The complete calendar time using the AM/PM format of the current locale. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  | In the POSIX locale, this format is equivalent to @code{%I:%M:%S %p}. | 
|  |  | 
|  | @item %R | 
|  | The hour and minute in decimal numbers using the format @code{%H:%M}. | 
|  |  | 
|  | This format was first standardized by @w{ISO C99} and by POSIX.1-2001 | 
|  | but was previously available as a GNU extension. | 
|  |  | 
|  | @item %s | 
|  | The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC. | 
|  | Leap seconds are not counted unless leap second support is available. | 
|  |  | 
|  | This format is a GNU extension. | 
|  |  | 
|  | @item %S | 
|  | The seconds as a decimal number (range @code{00} through @code{60}). | 
|  |  | 
|  | @item %t | 
|  | A single @samp{\t} (tabulator) character. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %T | 
|  | The time of day using decimal numbers using the format @code{%H:%M:%S}. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %u | 
|  | The day of the week as a decimal number (range @code{1} through | 
|  | @code{7}), Monday being @code{1}. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %U | 
|  | The week number of the current year as a decimal number (range @code{00} | 
|  | through @code{53}), starting with the first Sunday as the first day of | 
|  | the first week.  Days preceding the first Sunday in the year are | 
|  | considered to be in week @code{00}. | 
|  |  | 
|  | @item %V | 
|  | The @w{ISO 8601:1988} week number as a decimal number (range @code{01} | 
|  | through @code{53}).  ISO weeks start with Monday and end with Sunday. | 
|  | Week @code{01} of a year is the first week which has the majority of its | 
|  | days in that year; this is equivalent to the week containing the year's | 
|  | first Thursday, and it is also equivalent to the week containing January | 
|  | 4.  Week @code{01} of a year can contain days from the previous year. | 
|  | The week before week @code{01} of a year is the last week (@code{52} or | 
|  | @code{53}) of the previous year even if it contains days from the new | 
|  | year. | 
|  |  | 
|  | This format was first standardized by POSIX.2-1992 and by @w{ISO C99}. | 
|  |  | 
|  | @item %w | 
|  | The day of the week as a decimal number (range @code{0} through | 
|  | @code{6}), Sunday being @code{0}. | 
|  |  | 
|  | @item %W | 
|  | The week number of the current year as a decimal number (range @code{00} | 
|  | through @code{53}), starting with the first Monday as the first day of | 
|  | the first week.  All days preceding the first Monday in the year are | 
|  | considered to be in week @code{00}. | 
|  |  | 
|  | @item %x | 
|  | The preferred date representation for the current locale. | 
|  |  | 
|  | @item %X | 
|  | The preferred time of day representation for the current locale. | 
|  |  | 
|  | @item %y | 
|  | The year without a century as a decimal number (range @code{00} through | 
|  | @code{99}).  This is equivalent to the year modulo 100. | 
|  |  | 
|  | @item %Y | 
|  | The year as a decimal number, using the Gregorian calendar.  Years | 
|  | before the year @code{1} are numbered @code{0}, @code{-1}, and so on. | 
|  |  | 
|  | @item %z | 
|  | @w{RFC 822}/@w{ISO 8601:1988} style numeric time zone (e.g., | 
|  | @code{-0600} or @code{+0100}), or nothing if no time zone is | 
|  | determinable. | 
|  |  | 
|  | This format was first standardized by @w{ISO C99} and by POSIX.1-2001 | 
|  | but was previously available as a GNU extension. | 
|  |  | 
|  | In the POSIX locale, a full @w{RFC 822} timestamp is generated by the format | 
|  | @w{@samp{"%a, %d %b %Y %H:%M:%S %z"}} (or the equivalent | 
|  | @w{@samp{"%a, %d %b %Y %T %z"}}). | 
|  |  | 
|  | @item %Z | 
|  | The time zone abbreviation (empty if the time zone can't be determined). | 
|  |  | 
|  | @item %% | 
|  | A literal @samp{%} character. | 
|  | @end table | 
|  |  | 
|  | The @var{size} parameter can be used to specify the maximum number of | 
|  | characters to be stored in the array @var{s}, including the terminating | 
|  | null character.  If the formatted time requires more than @var{size} | 
|  | characters, @code{strftime} returns zero and the contents of the array | 
|  | @var{s} are undefined.  Otherwise the return value indicates the | 
|  | number of characters placed in the array @var{s}, not including the | 
|  | terminating null character. | 
|  |  | 
|  | @emph{Warning:} This convention for the return value which is prescribed | 
|  | in @w{ISO C} can lead to problems in some situations.  For certain | 
|  | format strings and certain locales the output really can be the empty | 
|  | string and this cannot be discovered by testing the return value only. | 
|  | E.g., in most locales the AM/PM time format is not supported (most of | 
|  | the world uses the 24 hour time representation).  In such locales | 
|  | @code{"%p"} will return the empty string, i.e., the return value is | 
|  | zero.  To detect situations like this something similar to the following | 
|  | code should be used: | 
|  |  | 
|  | @smallexample | 
|  | buf[0] = '\1'; | 
|  | len = strftime (buf, bufsize, format, tp); | 
|  | if (len == 0 && buf[0] != '\0') | 
|  | @{ | 
|  | /* Something went wrong in the strftime call.  */ | 
|  | @dots{} | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | If @var{s} is a null pointer, @code{strftime} does not actually write | 
|  | anything, but instead returns the number of characters it would have written. | 
|  |  | 
|  | Calling @code{strftime} also sets the current time zone as if | 
|  | @code{tzset} were called; @code{strftime} uses this information | 
|  | instead of @var{brokentime}'s @code{tm_gmtoff} and @code{tm_zone} | 
|  | members.  @xref{Time Zone Functions}. | 
|  |  | 
|  | For an example of @code{strftime}, see @ref{Time Functions Example}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment ISO/Amend1 | 
|  | @deftypefun size_t wcsftime (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, const struct tm *@var{brokentime}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@asucorrupt{} @ascuheap{} @asulock{} @ascudlopen{}}@acunsafe{@acucorrupt{} @aculock{} @acsmem{} @acsfd{}}} | 
|  | @c wcsftime @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c  wcsftime_l @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c   wcsftime_internal @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c    add ok | 
|  | @c     memset_zero dup ok | 
|  | @c     memset_space dup ok | 
|  | @c    wcslen dup ok | 
|  | @c    cpy ok | 
|  | @c     add dup ok | 
|  | @c     memcpy_lowcase ok | 
|  | @c      TOLOWER ok | 
|  | @c       towlower_l dup ok | 
|  | @c     memcpy_uppcase ok | 
|  | @c      TOUPPER ok | 
|  | @c       towupper_l dup ok | 
|  | @c     MEMCPY ok | 
|  | @c      wmemcpy dup ok | 
|  | @c    widen @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c     memset dup ok | 
|  | @c     mbsrtowcs_l @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd [no @mtasurace:mbstate/!ps] | 
|  | @c    ISDIGIT ok | 
|  | @c    STRLEN ok | 
|  | @c     wcslen dup ok | 
|  | @c    wcsftime_internal dup @mtsenv @mtslocale @asucorrupt @ascuheap @asulock @ascudlopen @acucorrupt @aculock @acsmem @acsfd | 
|  | @c    TOUPPER dup ok | 
|  | @c    nl_get_era_entry dup @ascuheap @asulock @acsmem @aculock | 
|  | @c    DO_NUMBER ok | 
|  | @c    DO_NUMBER_SPACEPAD ok | 
|  | @c    nl_get_walt_digit dup @ascuheap @asulock @acsmem @aculock | 
|  | @c     libc_rwlock_wrlock dup @asulock @aculock | 
|  | @c     nl_init_alt_digit dup @ascuheap @acsmem | 
|  | @c     malloc dup @ascuheap @acsmem | 
|  | @c     memset dup ok | 
|  | @c     wcschr dup ok | 
|  | @c     libc_rwlock_unlock dup @aculock | 
|  | @c    memset_space ok | 
|  | @c     wmemset dup ok | 
|  | @c    memset_zero ok | 
|  | @c     wmemset dup ok | 
|  | @c    mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    iso_week_days ok | 
|  | @c    isleap ok | 
|  | @c    tzset dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    gmtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    tm_diff ok | 
|  | The @code{wcsftime} function is equivalent to the @code{strftime} | 
|  | function with the difference that it operates on wide character | 
|  | strings.  The buffer where the result is stored, pointed to by @var{s}, | 
|  | must be an array of wide characters.  The parameter @var{size} which | 
|  | specifies the size of the output buffer gives the number of wide | 
|  | character, not the number of bytes. | 
|  |  | 
|  | Also the format string @var{template} is a wide character string.  Since | 
|  | all characters needed to specify the format string are in the basic | 
|  | character set it is portably possible to write format strings in the C | 
|  | source code using the @code{L"@dots{}"} notation.  The parameter | 
|  | @var{brokentime} has the same meaning as in the @code{strftime} call. | 
|  |  | 
|  | The @code{wcsftime} function supports the same flags, modifiers, and | 
|  | format specifiers as the @code{strftime} function. | 
|  |  | 
|  | The return value of @code{wcsftime} is the number of wide characters | 
|  | stored in @code{s}.  When more characters would have to be written than | 
|  | can be placed in the buffer @var{s} the return value is zero, with the | 
|  | same problems indicated in the @code{strftime} documentation. | 
|  | @end deftypefun | 
|  |  | 
|  | @node Parsing Date and Time | 
|  | @subsection Convert textual time and date information back | 
|  |  | 
|  | The @w{ISO C} standard does not specify any functions which can convert | 
|  | the output of the @code{strftime} function back into a binary format. | 
|  | This led to a variety of more-or-less successful implementations with | 
|  | different interfaces over the years.  Then the Unix standard was | 
|  | extended by the addition of two functions: @code{strptime} and | 
|  | @code{getdate}.  Both have strange interfaces but at least they are | 
|  | widely available. | 
|  |  | 
|  | @menu | 
|  | * Low-Level Time String Parsing::  Interpret string according to given format. | 
|  | * General Time String Parsing::    User-friendly function to parse data and | 
|  | time strings. | 
|  | @end menu | 
|  |  | 
|  | @node Low-Level Time String Parsing | 
|  | @subsubsection Interpret string according to given format | 
|  |  | 
|  | The first function is rather low-level.  It is nevertheless frequently | 
|  | used in software since it is better known.  Its interface and | 
|  | implementation are heavily influenced by the @code{getdate} function, | 
|  | which is defined and implemented in terms of calls to @code{strptime}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment XPG4 | 
|  | @deftypefun {char *} strptime (const char *@var{s}, const char *@var{fmt}, struct tm *@var{tp}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c strptime @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  strptime_internal @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   memset dup ok | 
|  | @c   ISSPACE ok | 
|  | @c    isspace_l dup ok | 
|  | @c   match_char ok | 
|  | @c   match_string ok | 
|  | @c    strlen dup ok | 
|  | @c    strncasecmp_l dup ok | 
|  | @c   strcmp dup ok | 
|  | @c   recursive @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c    strptime_internal dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   get_number ok | 
|  | @c    ISSPACE dup ok | 
|  | @c   localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   nl_select_era_entry @ascuheap @asulock @acsmem @aculock | 
|  | @c    nl_init_era_entries dup @ascuheap @asulock @acsmem @aculock | 
|  | @c   get_alt_number dup @ascuheap @asulock @acsmem @aculock | 
|  | @c    nl_parse_alt_digit dup @ascuheap @asulock @acsmem @aculock | 
|  | @c     libc_rwlock_wrlock dup @asulock @aculock | 
|  | @c     nl_init_alt_digit dup @ascuheap @acsmem | 
|  | @c     libc_rwlock_unlock dup @aculock | 
|  | @c    get_number dup ok | 
|  | @c   day_of_the_week ok | 
|  | @c   day_of_the_year ok | 
|  | The @code{strptime} function parses the input string @var{s} according | 
|  | to the format string @var{fmt} and stores its results in the | 
|  | structure @var{tp}. | 
|  |  | 
|  | The input string could be generated by a @code{strftime} call or | 
|  | obtained any other way.  It does not need to be in a human-recognizable | 
|  | format; e.g. a date passed as @code{"02:1999:9"} is acceptable, even | 
|  | though it is ambiguous without context.  As long as the format string | 
|  | @var{fmt} matches the input string the function will succeed. | 
|  |  | 
|  | The user has to make sure, though, that the input can be parsed in a | 
|  | unambiguous way.  The string @code{"1999112"} can be parsed using the | 
|  | format @code{"%Y%m%d"} as 1999-1-12, 1999-11-2, or even 19991-1-2.  It | 
|  | is necessary to add appropriate separators to reliably get results. | 
|  |  | 
|  | The format string consists of the same components as the format string | 
|  | of the @code{strftime} function.  The only difference is that the flags | 
|  | @code{_}, @code{-}, @code{0}, and @code{^} are not allowed. | 
|  | @comment Is this really the intention?  --drepper | 
|  | Several of the distinct formats of @code{strftime} do the same work in | 
|  | @code{strptime} since differences like case of the input do not matter. | 
|  | For reasons of symmetry all formats are supported, though. | 
|  |  | 
|  | The modifiers @code{E} and @code{O} are also allowed everywhere the | 
|  | @code{strftime} function allows them. | 
|  |  | 
|  | The formats are: | 
|  |  | 
|  | @table @code | 
|  | @item %a | 
|  | @itemx %A | 
|  | The weekday name according to the current locale, in abbreviated form or | 
|  | the full name. | 
|  |  | 
|  | @item %b | 
|  | @itemx %B | 
|  | @itemx %h | 
|  | The month name according to the current locale, in abbreviated form or | 
|  | the full name. | 
|  |  | 
|  | @item %c | 
|  | The date and time representation for the current locale. | 
|  |  | 
|  | @item %Ec | 
|  | Like @code{%c} but the locale's alternative date and time format is used. | 
|  |  | 
|  | @item %C | 
|  | The century of the year. | 
|  |  | 
|  | It makes sense to use this format only if the format string also | 
|  | contains the @code{%y} format. | 
|  |  | 
|  | @item %EC | 
|  | The locale's representation of the period. | 
|  |  | 
|  | Unlike @code{%C} it sometimes makes sense to use this format since some | 
|  | cultures represent years relative to the beginning of eras instead of | 
|  | using the Gregorian years. | 
|  |  | 
|  | @item %d | 
|  | @item %e | 
|  | The day of the month as a decimal number (range @code{1} through @code{31}). | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %Od | 
|  | @itemx %Oe | 
|  | Same as @code{%d} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %D | 
|  | Equivalent to @code{%m/%d/%y}. | 
|  |  | 
|  | @item %F | 
|  | Equivalent to @code{%Y-%m-%d}, which is the @w{ISO 8601} date | 
|  | format. | 
|  |  | 
|  | This is a GNU extension following an @w{ISO C99} extension to | 
|  | @code{strftime}. | 
|  |  | 
|  | @item %g | 
|  | The year corresponding to the ISO week number, but without the century | 
|  | (range @code{00} through @code{99}). | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | This format is a GNU extension following a GNU extension of @code{strftime}. | 
|  |  | 
|  | @item %G | 
|  | The year corresponding to the ISO week number. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | This format is a GNU extension following a GNU extension of @code{strftime}. | 
|  |  | 
|  | @item %H | 
|  | @itemx %k | 
|  | The hour as a decimal number, using a 24-hour clock (range @code{00} through | 
|  | @code{23}). | 
|  |  | 
|  | @code{%k} is a GNU extension following a GNU extension of @code{strftime}. | 
|  |  | 
|  | @item %OH | 
|  | Same as @code{%H} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %I | 
|  | @itemx %l | 
|  | The hour as a decimal number, using a 12-hour clock (range @code{01} through | 
|  | @code{12}). | 
|  |  | 
|  | @code{%l} is a GNU extension following a GNU extension of @code{strftime}. | 
|  |  | 
|  | @item %OI | 
|  | Same as @code{%I} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %j | 
|  | The day of the year as a decimal number (range @code{1} through @code{366}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %m | 
|  | The month as a decimal number (range @code{1} through @code{12}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %Om | 
|  | Same as @code{%m} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %M | 
|  | The minute as a decimal number (range @code{0} through @code{59}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %OM | 
|  | Same as @code{%M} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %n | 
|  | @itemx %t | 
|  | Matches any white space. | 
|  |  | 
|  | @item %p | 
|  | @item %P | 
|  | The locale-dependent equivalent to @samp{AM} or @samp{PM}. | 
|  |  | 
|  | This format is not useful unless @code{%I} or @code{%l} is also used. | 
|  | Another complication is that the locale might not define these values at | 
|  | all and therefore the conversion fails. | 
|  |  | 
|  | @code{%P} is a GNU extension following a GNU extension to @code{strftime}. | 
|  |  | 
|  | @item %r | 
|  | The complete time using the AM/PM format of the current locale. | 
|  |  | 
|  | A complication is that the locale might not define this format at all | 
|  | and therefore the conversion fails. | 
|  |  | 
|  | @item %R | 
|  | The hour and minute in decimal numbers using the format @code{%H:%M}. | 
|  |  | 
|  | @code{%R} is a GNU extension following a GNU extension to @code{strftime}. | 
|  |  | 
|  | @item %s | 
|  | The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC. | 
|  | Leap seconds are not counted unless leap second support is available. | 
|  |  | 
|  | @code{%s} is a GNU extension following a GNU extension to @code{strftime}. | 
|  |  | 
|  | @item %S | 
|  | The seconds as a decimal number (range @code{0} through @code{60}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @strong{NB:} The Unix specification says the upper bound on this value | 
|  | is @code{61}, a result of a decision to allow double leap seconds.  You | 
|  | will not see the value @code{61} because no minute has more than one | 
|  | leap second, but the myth persists. | 
|  |  | 
|  | @item %OS | 
|  | Same as @code{%S} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %T | 
|  | Equivalent to the use of @code{%H:%M:%S} in this place. | 
|  |  | 
|  | @item %u | 
|  | The day of the week as a decimal number (range @code{1} through | 
|  | @code{7}), Monday being @code{1}. | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | @item %U | 
|  | The week number of the current year as a decimal number (range @code{0} | 
|  | through @code{53}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @item %OU | 
|  | Same as @code{%U} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %V | 
|  | The @w{ISO 8601:1988} week number as a decimal number (range @code{1} | 
|  | through @code{53}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | @item %w | 
|  | The day of the week as a decimal number (range @code{0} through | 
|  | @code{6}), Sunday being @code{0}. | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | @item %Ow | 
|  | Same as @code{%w} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %W | 
|  | The week number of the current year as a decimal number (range @code{0} | 
|  | through @code{53}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | @item %OW | 
|  | Same as @code{%W} but using the locale's alternative numeric symbols. | 
|  |  | 
|  | @item %x | 
|  | The date using the locale's date format. | 
|  |  | 
|  | @item %Ex | 
|  | Like @code{%x} but the locale's alternative data representation is used. | 
|  |  | 
|  | @item %X | 
|  | The time using the locale's time format. | 
|  |  | 
|  | @item %EX | 
|  | Like @code{%X} but the locale's alternative time representation is used. | 
|  |  | 
|  | @item %y | 
|  | The year without a century as a decimal number (range @code{0} through | 
|  | @code{99}). | 
|  |  | 
|  | Leading zeroes are permitted but not required. | 
|  |  | 
|  | Note that it is questionable to use this format without | 
|  | the @code{%C} format.  The @code{strptime} function does regard input | 
|  | values in the range @math{68} to @math{99} as the years @math{1969} to | 
|  | @math{1999} and the values @math{0} to @math{68} as the years | 
|  | @math{2000} to @math{2068}.  But maybe this heuristic fails for some | 
|  | input data. | 
|  |  | 
|  | Therefore it is best to avoid @code{%y} completely and use @code{%Y} | 
|  | instead. | 
|  |  | 
|  | @item %Ey | 
|  | The offset from @code{%EC} in the locale's alternative representation. | 
|  |  | 
|  | @item %Oy | 
|  | The offset of the year (from @code{%C}) using the locale's alternative | 
|  | numeric symbols. | 
|  |  | 
|  | @item %Y | 
|  | The year as a decimal number, using the Gregorian calendar. | 
|  |  | 
|  | @item %EY | 
|  | The full alternative year representation. | 
|  |  | 
|  | @item %z | 
|  | The offset from GMT in @w{ISO 8601}/RFC822 format. | 
|  |  | 
|  | @item %Z | 
|  | The timezone name. | 
|  |  | 
|  | @emph{Note:} Currently, this is not fully implemented.  The format is | 
|  | recognized, input is consumed but no field in @var{tm} is set. | 
|  |  | 
|  | @item %% | 
|  | A literal @samp{%} character. | 
|  | @end table | 
|  |  | 
|  | All other characters in the format string must have a matching character | 
|  | in the input string.  Exceptions are white spaces in the input string | 
|  | which can match zero or more whitespace characters in the format string. | 
|  |  | 
|  | @strong{Portability Note:} The XPG standard advises applications to use | 
|  | at least one whitespace character (as specified by @code{isspace}) or | 
|  | other non-alphanumeric characters between any two conversion | 
|  | specifications.  @Theglibc{} does not have this limitation but | 
|  | other libraries might have trouble parsing formats like | 
|  | @code{"%d%m%Y%H%M%S"}. | 
|  |  | 
|  | The @code{strptime} function processes the input string from right to | 
|  | left.  Each of the three possible input elements (white space, literal, | 
|  | or format) are handled one after the other.  If the input cannot be | 
|  | matched to the format string the function stops.  The remainder of the | 
|  | format and input strings are not processed. | 
|  |  | 
|  | The function returns a pointer to the first character it was unable to | 
|  | process.  If the input string contains more characters than required by | 
|  | the format string the return value points right after the last consumed | 
|  | input character.  If the whole input string is consumed the return value | 
|  | points to the @code{NULL} byte at the end of the string.  If an error | 
|  | occurs, i.e., @code{strptime} fails to match all of the format string, | 
|  | the function returns @code{NULL}. | 
|  | @end deftypefun | 
|  |  | 
|  | The specification of the function in the XPG standard is rather vague, | 
|  | leaving out a few important pieces of information.  Most importantly, it | 
|  | does not specify what happens to those elements of @var{tm} which are | 
|  | not directly initialized by the different formats.  The | 
|  | implementations on different Unix systems vary here. | 
|  |  | 
|  | The @glibcadj{} implementation does not touch those fields which are not | 
|  | directly initialized.  Exceptions are the @code{tm_wday} and | 
|  | @code{tm_yday} elements, which are recomputed if any of the year, month, | 
|  | or date elements changed.  This has two implications: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | Before calling the @code{strptime} function for a new input string, you | 
|  | should prepare the @var{tm} structure you pass.  Normally this will mean | 
|  | initializing all values are to zero.  Alternatively, you can set all | 
|  | fields to values like @code{INT_MAX}, allowing you to determine which | 
|  | elements were set by the function call.  Zero does not work here since | 
|  | it is a valid value for many of the fields. | 
|  |  | 
|  | Careful initialization is necessary if you want to find out whether a | 
|  | certain field in @var{tm} was initialized by the function call. | 
|  |  | 
|  | @item | 
|  | You can construct a @code{struct tm} value with several consecutive | 
|  | @code{strptime} calls.  A useful application of this is e.g. the parsing | 
|  | of two separate strings, one containing date information and the other | 
|  | time information.  By parsing one after the other without clearing the | 
|  | structure in-between, you can construct a complete broken-down time. | 
|  | @end itemize | 
|  |  | 
|  | The following example shows a function which parses a string which is | 
|  | contains the date information in either US style or @w{ISO 8601} form: | 
|  |  | 
|  | @smallexample | 
|  | const char * | 
|  | parse_date (const char *input, struct tm *tm) | 
|  | @{ | 
|  | const char *cp; | 
|  |  | 
|  | /* @r{First clear the result structure.}  */ | 
|  | memset (tm, '\0', sizeof (*tm)); | 
|  |  | 
|  | /* @r{Try the ISO format first.}  */ | 
|  | cp = strptime (input, "%F", tm); | 
|  | if (cp == NULL) | 
|  | @{ | 
|  | /* @r{Does not match.  Try the US form.}  */ | 
|  | cp = strptime (input, "%D", tm); | 
|  | @} | 
|  |  | 
|  | return cp; | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | @node General Time String Parsing | 
|  | @subsubsection A More User-friendly Way to Parse Times and Dates | 
|  |  | 
|  | The Unix standard defines another function for parsing date strings. | 
|  | The interface is weird, but if the function happens to suit your | 
|  | application it is just fine.  It is problematic to use this function | 
|  | in multi-threaded programs or libraries, since it returns a pointer to | 
|  | a static variable, and uses a global variable and global state (an | 
|  | environment variable). | 
|  |  | 
|  | @comment time.h | 
|  | @comment Unix98 | 
|  | @defvar getdate_err | 
|  | This variable of type @code{int} contains the error code of the last | 
|  | unsuccessful call to @code{getdate}.  Defined values are: | 
|  |  | 
|  | @table @math | 
|  | @item 1 | 
|  | The environment variable @code{DATEMSK} is not defined or null. | 
|  | @item 2 | 
|  | The template file denoted by the @code{DATEMSK} environment variable | 
|  | cannot be opened. | 
|  | @item 3 | 
|  | Information about the template file cannot retrieved. | 
|  | @item 4 | 
|  | The template file is not a regular file. | 
|  | @item 5 | 
|  | An I/O error occurred while reading the template file. | 
|  | @item 6 | 
|  | Not enough memory available to execute the function. | 
|  | @item 7 | 
|  | The template file contains no matching template. | 
|  | @item 8 | 
|  | The input date is invalid, but would match a template otherwise.  This | 
|  | includes dates like February 31st, and dates which cannot be represented | 
|  | in a @code{time_t} variable. | 
|  | @end table | 
|  | @end defvar | 
|  |  | 
|  | @comment time.h | 
|  | @comment Unix98 | 
|  | @deftypefun {struct tm *} getdate (const char *@var{string}) | 
|  | @safety{@prelim{}@mtunsafe{@mtasurace{:getdate} @mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c getdate @mtasurace:getdate @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  getdate_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | The interface to @code{getdate} is the simplest possible for a function | 
|  | to parse a string and return the value.  @var{string} is the input | 
|  | string and the result is returned in a statically-allocated variable. | 
|  |  | 
|  | The details about how the string is processed are hidden from the user. | 
|  | In fact, they can be outside the control of the program.  Which formats | 
|  | are recognized is controlled by the file named by the environment | 
|  | variable @code{DATEMSK}.  This file should contain | 
|  | lines of valid format strings which could be passed to @code{strptime}. | 
|  |  | 
|  | The @code{getdate} function reads these format strings one after the | 
|  | other and tries to match the input string.  The first line which | 
|  | completely matches the input string is used. | 
|  |  | 
|  | Elements not initialized through the format string retain the values | 
|  | present at the time of the @code{getdate} function call. | 
|  |  | 
|  | The formats recognized by @code{getdate} are the same as for | 
|  | @code{strptime}.  See above for an explanation.  There are only a few | 
|  | extensions to the @code{strptime} behavior: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | If the @code{%Z} format is given the broken-down time is based on the | 
|  | current time of the timezone matched, not of the current timezone of the | 
|  | runtime environment. | 
|  |  | 
|  | @emph{Note}: This is not implemented (currently).  The problem is that | 
|  | timezone names are not unique.  If a fixed timezone is assumed for a | 
|  | given string (say @code{EST} meaning US East Coast time), then uses for | 
|  | countries other than the USA will fail.  So far we have found no good | 
|  | solution to this. | 
|  |  | 
|  | @item | 
|  | If only the weekday is specified the selected day depends on the current | 
|  | date.  If the current weekday is greater or equal to the @code{tm_wday} | 
|  | value the current week's day is chosen, otherwise the day next week is chosen. | 
|  |  | 
|  | @item | 
|  | A similar heuristic is used when only the month is given and not the | 
|  | year.  If the month is greater than or equal to the current month, then | 
|  | the current year is used.  Otherwise it wraps to next year.  The first | 
|  | day of the month is assumed if one is not explicitly specified. | 
|  |  | 
|  | @item | 
|  | The current hour, minute, and second are used if the appropriate value is | 
|  | not set through the format. | 
|  |  | 
|  | @item | 
|  | If no date is given tomorrow's date is used if the time is | 
|  | smaller than the current time.  Otherwise today's date is taken. | 
|  | @end itemize | 
|  |  | 
|  | It should be noted that the format in the template file need not only | 
|  | contain format elements.  The following is a list of possible format | 
|  | strings (taken from the Unix standard): | 
|  |  | 
|  | @smallexample | 
|  | %m | 
|  | %A %B %d, %Y %H:%M:%S | 
|  | %A | 
|  | %B | 
|  | %m/%d/%y %I %p | 
|  | %d,%m,%Y %H:%M | 
|  | at %A the %dst of %B in %Y | 
|  | run job at %I %p,%B %dnd | 
|  | %A den %d. %B %Y %H.%M Uhr | 
|  | @end smallexample | 
|  |  | 
|  | As you can see, the template list can contain very specific strings like | 
|  | @code{run job at %I %p,%B %dnd}.  Using the above list of templates and | 
|  | assuming the current time is Mon Sep 22 12:19:47 EDT 1986 we can obtain the | 
|  | following results for the given input. | 
|  |  | 
|  | @multitable {xxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx} | 
|  | @item        Input @tab     Match @tab Result | 
|  | @item        Mon @tab       %a @tab    Mon Sep 22 12:19:47 EDT 1986 | 
|  | @item        Sun @tab       %a @tab    Sun Sep 28 12:19:47 EDT 1986 | 
|  | @item        Fri @tab       %a @tab    Fri Sep 26 12:19:47 EDT 1986 | 
|  | @item        September @tab %B @tab    Mon Sep 1 12:19:47 EDT 1986 | 
|  | @item        January @tab   %B @tab    Thu Jan 1 12:19:47 EST 1987 | 
|  | @item        December @tab  %B @tab    Mon Dec 1 12:19:47 EST 1986 | 
|  | @item        Sep Mon @tab   %b %a @tab Mon Sep 1 12:19:47 EDT 1986 | 
|  | @item        Jan Fri @tab   %b %a @tab Fri Jan 2 12:19:47 EST 1987 | 
|  | @item        Dec Mon @tab   %b %a @tab Mon Dec 1 12:19:47 EST 1986 | 
|  | @item        Jan Wed 1989 @tab  %b %a %Y @tab Wed Jan 4 12:19:47 EST 1989 | 
|  | @item        Fri 9 @tab     %a %H @tab Fri Sep 26 09:00:00 EDT 1986 | 
|  | @item        Feb 10:30 @tab %b %H:%S @tab Sun Feb 1 10:00:30 EST 1987 | 
|  | @item        10:30 @tab     %H:%M @tab Tue Sep 23 10:30:00 EDT 1986 | 
|  | @item        13:30 @tab     %H:%M @tab Mon Sep 22 13:30:00 EDT 1986 | 
|  | @end multitable | 
|  |  | 
|  | The return value of the function is a pointer to a static variable of | 
|  | type @w{@code{struct tm}}, or a null pointer if an error occurred.  The | 
|  | result is only valid until the next @code{getdate} call, making this | 
|  | function unusable in multi-threaded applications. | 
|  |  | 
|  | The @code{errno} variable is @emph{not} changed.  Error conditions are | 
|  | stored in the global variable @code{getdate_err}.  See the | 
|  | description above for a list of the possible error values. | 
|  |  | 
|  | @emph{Warning:} The @code{getdate} function should @emph{never} be | 
|  | used in SUID-programs.  The reason is obvious: using the | 
|  | @code{DATEMSK} environment variable you can get the function to open | 
|  | any arbitrary file and chances are high that with some bogus input | 
|  | (such as a binary file) the program will crash. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment time.h | 
|  | @comment GNU | 
|  | @deftypefun int getdate_r (const char *@var{string}, struct tm *@var{tp}) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c getdate_r @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  getenv dup @mtsenv | 
|  | @c  stat64 dup ok | 
|  | @c  access dup ok | 
|  | @c  fopen dup @ascuheap @asulock @acsmem @acsfd @aculock | 
|  | @c  fsetlocking dup ok [no @mtasurace:stream @asulock, exclusive] | 
|  | @c  isspace dup @mtslocale | 
|  | @c  strlen dup ok | 
|  | @c  malloc dup @ascuheap @acsmem | 
|  | @c  fclose dup @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  memcpy dup ok | 
|  | @c  getline dup @ascuheap @acsmem [no @asucorrupt @aculock @acucorrupt, exclusive] | 
|  | @c  strptime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  feof_unlocked dup ok | 
|  | @c  free dup @ascuheap @acsmem | 
|  | @c  ferror_unlocked dup dup ok | 
|  | @c  time dup ok | 
|  | @c  localtime_r dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  first_wday @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c   memset dup ok | 
|  | @c   mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  check_mday ok | 
|  | @c  mktime dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | The @code{getdate_r} function is the reentrant counterpart of | 
|  | @code{getdate}.  It does not use the global variable @code{getdate_err} | 
|  | to signal an error, but instead returns an error code.  The same error | 
|  | codes as described in the @code{getdate_err} documentation above are | 
|  | used, with 0 meaning success. | 
|  |  | 
|  | Moreover, @code{getdate_r} stores the broken-down time in the variable | 
|  | of type @code{struct tm} pointed to by the second argument, rather than | 
|  | in a static variable. | 
|  |  | 
|  | This function is not defined in the Unix standard.  Nevertheless it is | 
|  | available on some other Unix systems as well. | 
|  |  | 
|  | The warning against using @code{getdate} in SUID-programs applies to | 
|  | @code{getdate_r} as well. | 
|  | @end deftypefun | 
|  |  | 
|  | @node TZ Variable | 
|  | @subsection Specifying the Time Zone with @code{TZ} | 
|  |  | 
|  | In POSIX systems, a user can specify the time zone by means of the | 
|  | @code{TZ} environment variable.  For information about how to set | 
|  | environment variables, see @ref{Environment Variables}.  The functions | 
|  | for accessing the time zone are declared in @file{time.h}. | 
|  | @pindex time.h | 
|  | @cindex time zone | 
|  |  | 
|  | You should not normally need to set @code{TZ}.  If the system is | 
|  | configured properly, the default time zone will be correct.  You might | 
|  | set @code{TZ} if you are using a computer over a network from a | 
|  | different time zone, and would like times reported to you in the time | 
|  | zone local to you, rather than what is local to the computer. | 
|  |  | 
|  | In POSIX.1 systems the value of the @code{TZ} variable can be in one of | 
|  | three formats.  With @theglibc{}, the most common format is the | 
|  | last one, which can specify a selection from a large database of time | 
|  | zone information for many regions of the world.  The first two formats | 
|  | are used to describe the time zone information directly, which is both | 
|  | more cumbersome and less precise.  But the POSIX.1 standard only | 
|  | specifies the details of the first two formats, so it is good to be | 
|  | familiar with them in case you come across a POSIX.1 system that doesn't | 
|  | support a time zone information database. | 
|  |  | 
|  | The first format is used when there is no Daylight Saving Time (or | 
|  | summer time) in the local time zone: | 
|  |  | 
|  | @smallexample | 
|  | @r{@var{std} @var{offset}} | 
|  | @end smallexample | 
|  |  | 
|  | The @var{std} string specifies the name of the time zone.  It must be | 
|  | three or more characters long and must not contain a leading colon, | 
|  | embedded digits, commas, nor plus and minus signs.  There is no space | 
|  | character separating the time zone name from the @var{offset}, so these | 
|  | restrictions are necessary to parse the specification correctly. | 
|  |  | 
|  | The @var{offset} specifies the time value you must add to the local time | 
|  | to get a Coordinated Universal Time value.  It has syntax like | 
|  | [@code{+}|@code{-}]@var{hh}[@code{:}@var{mm}[@code{:}@var{ss}]].  This | 
|  | is positive if the local time zone is west of the Prime Meridian and | 
|  | negative if it is east.  The hour must be between @code{0} and | 
|  | @code{24}, and the minute and seconds between @code{0} and @code{59}. | 
|  |  | 
|  | For example, here is how we would specify Eastern Standard Time, but | 
|  | without any Daylight Saving Time alternative: | 
|  |  | 
|  | @smallexample | 
|  | EST+5 | 
|  | @end smallexample | 
|  |  | 
|  | The second format is used when there is Daylight Saving Time: | 
|  |  | 
|  | @smallexample | 
|  | @r{@var{std} @var{offset} @var{dst} [@var{offset}]@code{,}@var{start}[@code{/}@var{time}]@code{,}@var{end}[@code{/}@var{time}]} | 
|  | @end smallexample | 
|  |  | 
|  | The initial @var{std} and @var{offset} specify the standard time zone, as | 
|  | described above.  The @var{dst} string and @var{offset} specify the name | 
|  | and offset for the corresponding Daylight Saving Time zone; if the | 
|  | @var{offset} is omitted, it defaults to one hour ahead of standard time. | 
|  |  | 
|  | The remainder of the specification describes when Daylight Saving Time is | 
|  | in effect.  The @var{start} field is when Daylight Saving Time goes into | 
|  | effect and the @var{end} field is when the change is made back to standard | 
|  | time.  The following formats are recognized for these fields: | 
|  |  | 
|  | @table @code | 
|  | @item J@var{n} | 
|  | This specifies the Julian day, with @var{n} between @code{1} and @code{365}. | 
|  | February 29 is never counted, even in leap years. | 
|  |  | 
|  | @item @var{n} | 
|  | This specifies the Julian day, with @var{n} between @code{0} and @code{365}. | 
|  | February 29 is counted in leap years. | 
|  |  | 
|  | @item M@var{m}.@var{w}.@var{d} | 
|  | This specifies day @var{d} of week @var{w} of month @var{m}.  The day | 
|  | @var{d} must be between @code{0} (Sunday) and @code{6}.  The week | 
|  | @var{w} must be between @code{1} and @code{5}; week @code{1} is the | 
|  | first week in which day @var{d} occurs, and week @code{5} specifies the | 
|  | @emph{last} @var{d} day in the month.  The month @var{m} should be | 
|  | between @code{1} and @code{12}. | 
|  | @end table | 
|  |  | 
|  | The @var{time} fields specify when, in the local time currently in | 
|  | effect, the change to the other time occurs.  If omitted, the default is | 
|  | @code{02:00:00}.  The hours part of the time fields can range from | 
|  | @minus{}167 through 167; this is an extension to POSIX.1, which allows | 
|  | only the range 0 through 24. | 
|  |  | 
|  | Here are some example @code{TZ} values, including the appropriate | 
|  | Daylight Saving Time and its dates of applicability.  In North | 
|  | American Eastern Standard Time (EST) and Eastern Daylight Time (EDT), | 
|  | the normal offset from UTC is 5 hours; since this is | 
|  | west of the prime meridian, the sign is positive.  Summer time begins on | 
|  | March's second Sunday at 2:00am, and ends on November's first Sunday | 
|  | at 2:00am. | 
|  |  | 
|  | @smallexample | 
|  | EST+5EDT,M3.2.0/2,M11.1.0/2 | 
|  | @end smallexample | 
|  |  | 
|  | Israel Standard Time (IST) and Israel Daylight Time (IDT) are 2 hours | 
|  | ahead of the prime meridian in winter, springing forward an hour on | 
|  | March's fourth Thursday at 26:00 (i.e., 02:00 on the first Friday on or | 
|  | after March 23), and falling back on October's last Sunday at 02:00. | 
|  |  | 
|  | @smallexample | 
|  | IST-2IDT,M3.4.4/26,M10.5.0 | 
|  | @end smallexample | 
|  |  | 
|  | Western Argentina Summer Time (WARST) is 3 hours behind the prime | 
|  | meridian all year.  There is a dummy fall-back transition on December | 
|  | 31 at 25:00 daylight saving time (i.e., 24:00 standard time, | 
|  | equivalent to January 1 at 00:00 standard time), and a simultaneous | 
|  | spring-forward transition on January 1 at 00:00 standard time, so | 
|  | daylight saving time is in effect all year and the initial @code{WART} | 
|  | is a placeholder. | 
|  |  | 
|  | @smallexample | 
|  | WART4WARST,J1/0,J365/25 | 
|  | @end smallexample | 
|  |  | 
|  | Western Greenland Time (WGT) and Western Greenland Summer Time (WGST) | 
|  | are 3 hours behind UTC in the winter.  Its clocks follow the European | 
|  | Union rules of springing forward by one hour on March's last Sunday at | 
|  | 01:00 UTC (@minus{}02:00 local time) and falling back on October's | 
|  | last Sunday at 01:00 UTC (@minus{}01:00 local time). | 
|  |  | 
|  | @smallexample | 
|  | WGT3WGST,M3.5.0/-2,M10.5.0/-1 | 
|  | @end smallexample | 
|  |  | 
|  | The schedule of Daylight Saving Time in any particular jurisdiction has | 
|  | changed over the years.  To be strictly correct, the conversion of dates | 
|  | and times in the past should be based on the schedule that was in effect | 
|  | then.  However, this format has no facilities to let you specify how the | 
|  | schedule has changed from year to year.  The most you can do is specify | 
|  | one particular schedule---usually the present day schedule---and this is | 
|  | used to convert any date, no matter when.  For precise time zone | 
|  | specifications, it is best to use the time zone information database | 
|  | (see below). | 
|  |  | 
|  | The third format looks like this: | 
|  |  | 
|  | @smallexample | 
|  | :@var{characters} | 
|  | @end smallexample | 
|  |  | 
|  | Each operating system interprets this format differently; in | 
|  | @theglibc{}, @var{characters} is the name of a file which describes the time | 
|  | zone. | 
|  |  | 
|  | @pindex /etc/localtime | 
|  | @pindex localtime | 
|  | If the @code{TZ} environment variable does not have a value, the | 
|  | operation chooses a time zone by default.  In @theglibc{}, the | 
|  | default time zone is like the specification @samp{TZ=:/etc/localtime} | 
|  | (or @samp{TZ=:/usr/local/etc/localtime}, depending on how @theglibc{} | 
|  | was configured; @pxref{Installation}).  Other C libraries use their own | 
|  | rule for choosing the default time zone, so there is little we can say | 
|  | about them. | 
|  |  | 
|  | @cindex time zone database | 
|  | @pindex /usr/share/zoneinfo | 
|  | @pindex zoneinfo | 
|  | If @var{characters} begins with a slash, it is an absolute file name; | 
|  | otherwise the library looks for the file | 
|  | @w{@file{/usr/share/zoneinfo/@var{characters}}}.  The @file{zoneinfo} | 
|  | directory contains data files describing local time zones in many | 
|  | different parts of the world.  The names represent major cities, with | 
|  | subdirectories for geographical areas; for example, | 
|  | @file{America/New_York}, @file{Europe/London}, @file{Asia/Hong_Kong}. | 
|  | These data files are installed by the system administrator, who also | 
|  | sets @file{/etc/localtime} to point to the data file for the local time | 
|  | zone.  The files typically come from the @url{http://www.iana.org/time-zones, | 
|  | Time Zone Database} of time zone and daylight saving time | 
|  | information for most regions of the world, which is maintained by a | 
|  | community of volunteers and put in the public domain. | 
|  |  | 
|  | @node Time Zone Functions | 
|  | @subsection Functions and Variables for Time Zones | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1 | 
|  | @deftypevar {char *} tzname [2] | 
|  | The array @code{tzname} contains two strings, which are the standard | 
|  | names of the pair of time zones (standard and Daylight | 
|  | Saving) that the user has selected.  @code{tzname[0]} is the name of | 
|  | the standard time zone (for example, @code{"EST"}), and @code{tzname[1]} | 
|  | is the name for the time zone when Daylight Saving Time is in use (for | 
|  | example, @code{"EDT"}).  These correspond to the @var{std} and @var{dst} | 
|  | strings (respectively) from the @code{TZ} environment variable.  If | 
|  | Daylight Saving Time is never used, @code{tzname[1]} is the empty string. | 
|  |  | 
|  | The @code{tzname} array is initialized from the @code{TZ} environment | 
|  | variable whenever @code{tzset}, @code{ctime}, @code{strftime}, | 
|  | @code{mktime}, or @code{localtime} is called.  If multiple abbreviations | 
|  | have been used (e.g. @code{"EWT"} and @code{"EDT"} for U.S. Eastern War | 
|  | Time and Eastern Daylight Time), the array contains the most recent | 
|  | abbreviation. | 
|  |  | 
|  | The @code{tzname} array is required for POSIX.1 compatibility, but in | 
|  | GNU programs it is better to use the @code{tm_zone} member of the | 
|  | broken-down time structure, since @code{tm_zone} reports the correct | 
|  | abbreviation even when it is not the latest one. | 
|  |  | 
|  | Though the strings are declared as @code{char *} the user must refrain | 
|  | from modifying these strings.  Modifying the strings will almost certainly | 
|  | lead to trouble. | 
|  |  | 
|  | @end deftypevar | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun void tzset (void) | 
|  | @safety{@prelim{}@mtsafe{@mtsenv{} @mtslocale{}}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}} | 
|  | @c tzset @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  libc_lock_lock dup @asulock @aculock | 
|  | @c  tzset_internal dup @mtsenv @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd | 
|  | @c  libc_lock_unlock dup @aculock | 
|  | The @code{tzset} function initializes the @code{tzname} variable from | 
|  | the value of the @code{TZ} environment variable.  It is not usually | 
|  | necessary for your program to call this function, because it is called | 
|  | automatically when you use the other time conversion functions that | 
|  | depend on the time zone. | 
|  | @end deftypefun | 
|  |  | 
|  | The following variables are defined for compatibility with System V | 
|  | Unix.  Like @code{tzname}, these variables are set by calling | 
|  | @code{tzset} or the other time conversion functions. | 
|  |  | 
|  | @comment time.h | 
|  | @comment SVID | 
|  | @deftypevar {long int} timezone | 
|  | This contains the difference between UTC and the latest local standard | 
|  | time, in seconds west of UTC.  For example, in the U.S. Eastern time | 
|  | zone, the value is @code{5*60*60}.  Unlike the @code{tm_gmtoff} member | 
|  | of the broken-down time structure, this value is not adjusted for | 
|  | daylight saving, and its sign is reversed.  In GNU programs it is better | 
|  | to use @code{tm_gmtoff}, since it contains the correct offset even when | 
|  | it is not the latest one. | 
|  | @end deftypevar | 
|  |  | 
|  | @comment time.h | 
|  | @comment SVID | 
|  | @deftypevar int daylight | 
|  | This variable has a nonzero value if Daylight Saving Time rules apply. | 
|  | A nonzero value does not necessarily mean that Daylight Saving Time is | 
|  | now in effect; it means only that Daylight Saving Time is sometimes in | 
|  | effect. | 
|  | @end deftypevar | 
|  |  | 
|  | @node Time Functions Example | 
|  | @subsection Time Functions Example | 
|  |  | 
|  | Here is an example program showing the use of some of the calendar time | 
|  | functions. | 
|  |  | 
|  | @smallexample | 
|  | @include strftim.c.texi | 
|  | @end smallexample | 
|  |  | 
|  | It produces output like this: | 
|  |  | 
|  | @smallexample | 
|  | Wed Jul 31 13:02:36 1991 | 
|  | Today is Wednesday, July 31. | 
|  | The time is 01:02 PM. | 
|  | @end smallexample | 
|  |  | 
|  |  | 
|  | @node Setting an Alarm | 
|  | @section Setting an Alarm | 
|  |  | 
|  | The @code{alarm} and @code{setitimer} functions provide a mechanism for a | 
|  | process to interrupt itself in the future.  They do this by setting a | 
|  | timer; when the timer expires, the process receives a signal. | 
|  |  | 
|  | @cindex setting an alarm | 
|  | @cindex interval timer, setting | 
|  | @cindex alarms, setting | 
|  | @cindex timers, setting | 
|  | Each process has three independent interval timers available: | 
|  |  | 
|  | @itemize @bullet | 
|  | @item | 
|  | A real-time timer that counts elapsed time.  This timer sends a | 
|  | @code{SIGALRM} signal to the process when it expires. | 
|  | @cindex real-time timer | 
|  | @cindex timer, real-time | 
|  |  | 
|  | @item | 
|  | A virtual timer that counts processor time used by the process.  This timer | 
|  | sends a @code{SIGVTALRM} signal to the process when it expires. | 
|  | @cindex virtual timer | 
|  | @cindex timer, virtual | 
|  |  | 
|  | @item | 
|  | A profiling timer that counts both processor time used by the process, | 
|  | and processor time spent in system calls on behalf of the process.  This | 
|  | timer sends a @code{SIGPROF} signal to the process when it expires. | 
|  | @cindex profiling timer | 
|  | @cindex timer, profiling | 
|  |  | 
|  | This timer is useful for profiling in interpreters.  The interval timer | 
|  | mechanism does not have the fine granularity necessary for profiling | 
|  | native code. | 
|  | @c @xref{profil} !!! | 
|  | @end itemize | 
|  |  | 
|  | You can only have one timer of each kind set at any given time.  If you | 
|  | set a timer that has not yet expired, that timer is simply reset to the | 
|  | new value. | 
|  |  | 
|  | You should establish a handler for the appropriate alarm signal using | 
|  | @code{signal} or @code{sigaction} before issuing a call to | 
|  | @code{setitimer} or @code{alarm}.  Otherwise, an unusual chain of events | 
|  | could cause the timer to expire before your program establishes the | 
|  | handler.  In this case it would be terminated, since termination is the | 
|  | default action for the alarm signals.  @xref{Signal Handling}. | 
|  |  | 
|  | To be able to use the alarm function to interrupt a system call which | 
|  | might block otherwise indefinitely it is important to @emph{not} set the | 
|  | @code{SA_RESTART} flag when registering the signal handler using | 
|  | @code{sigaction}.  When not using @code{sigaction} things get even | 
|  | uglier: the @code{signal} function has to fixed semantics with respect | 
|  | to restarts.  The BSD semantics for this function is to set the flag. | 
|  | Therefore, if @code{sigaction} for whatever reason cannot be used, it is | 
|  | necessary to use @code{sysv_signal} and not @code{signal}. | 
|  |  | 
|  | The @code{setitimer} function is the primary means for setting an alarm. | 
|  | This facility is declared in the header file @file{sys/time.h}.  The | 
|  | @code{alarm} function, declared in @file{unistd.h}, provides a somewhat | 
|  | simpler interface for setting the real-time timer. | 
|  | @pindex unistd.h | 
|  | @pindex sys/time.h | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftp {Data Type} {struct itimerval} | 
|  | This structure is used to specify when a timer should expire.  It contains | 
|  | the following members: | 
|  | @table @code | 
|  | @item struct timeval it_interval | 
|  | This is the period between successive timer interrupts.  If zero, the | 
|  | alarm will only be sent once. | 
|  |  | 
|  | @item struct timeval it_value | 
|  | This is the period between now and the first timer interrupt.  If zero, | 
|  | the alarm is disabled. | 
|  | @end table | 
|  |  | 
|  | The @code{struct timeval} data type is described in @ref{Elapsed Time}. | 
|  | @end deftp | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftypefun int setitimer (int @var{which}, const struct itimerval *@var{new}, struct itimerval *@var{old}) | 
|  | @safety{@prelim{}@mtsafe{@mtstimer{}}@assafe{}@acsafe{}} | 
|  | @c This function is marked with @mtstimer because the same set of timers | 
|  | @c is shared by all threads of a process, so calling it in one thread | 
|  | @c may interfere with timers set by another thread.  This interference | 
|  | @c is not regarded as destructive, because the interface specification | 
|  | @c makes this overriding while returning the previous value the expected | 
|  | @c behavior, and the kernel will serialize concurrent calls so that the | 
|  | @c last one prevails, with each call getting the timer information from | 
|  | @c the timer installed by the previous call in that serialization. | 
|  | The @code{setitimer} function sets the timer specified by @var{which} | 
|  | according to @var{new}.  The @var{which} argument can have a value of | 
|  | @code{ITIMER_REAL}, @code{ITIMER_VIRTUAL}, or @code{ITIMER_PROF}. | 
|  |  | 
|  | If @var{old} is not a null pointer, @code{setitimer} returns information | 
|  | about any previous unexpired timer of the same kind in the structure it | 
|  | points to. | 
|  |  | 
|  | The return value is @code{0} on success and @code{-1} on failure.  The | 
|  | following @code{errno} error conditions are defined for this function: | 
|  |  | 
|  | @table @code | 
|  | @item EINVAL | 
|  | The timer period is too large. | 
|  | @end table | 
|  | @end deftypefun | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @deftypefun int getitimer (int @var{which}, struct itimerval *@var{old}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | The @code{getitimer} function stores information about the timer specified | 
|  | by @var{which} in the structure pointed at by @var{old}. | 
|  |  | 
|  | The return value and error conditions are the same as for @code{setitimer}. | 
|  | @end deftypefun | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @vtable @code | 
|  | @item ITIMER_REAL | 
|  | This constant can be used as the @var{which} argument to the | 
|  | @code{setitimer} and @code{getitimer} functions to specify the real-time | 
|  | timer. | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @item ITIMER_VIRTUAL | 
|  | This constant can be used as the @var{which} argument to the | 
|  | @code{setitimer} and @code{getitimer} functions to specify the virtual | 
|  | timer. | 
|  |  | 
|  | @comment sys/time.h | 
|  | @comment BSD | 
|  | @item ITIMER_PROF | 
|  | This constant can be used as the @var{which} argument to the | 
|  | @code{setitimer} and @code{getitimer} functions to specify the profiling | 
|  | timer. | 
|  | @end vtable | 
|  |  | 
|  | @comment unistd.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun {unsigned int} alarm (unsigned int @var{seconds}) | 
|  | @safety{@prelim{}@mtsafe{@mtstimer{}}@assafe{}@acsafe{}} | 
|  | @c Wrapper for setitimer. | 
|  | The @code{alarm} function sets the real-time timer to expire in | 
|  | @var{seconds} seconds.  If you want to cancel any existing alarm, you | 
|  | can do this by calling @code{alarm} with a @var{seconds} argument of | 
|  | zero. | 
|  |  | 
|  | The return value indicates how many seconds remain before the previous | 
|  | alarm would have been sent.  If there is no previous alarm, @code{alarm} | 
|  | returns zero. | 
|  | @end deftypefun | 
|  |  | 
|  | The @code{alarm} function could be defined in terms of @code{setitimer} | 
|  | like this: | 
|  |  | 
|  | @smallexample | 
|  | unsigned int | 
|  | alarm (unsigned int seconds) | 
|  | @{ | 
|  | struct itimerval old, new; | 
|  | new.it_interval.tv_usec = 0; | 
|  | new.it_interval.tv_sec = 0; | 
|  | new.it_value.tv_usec = 0; | 
|  | new.it_value.tv_sec = (long int) seconds; | 
|  | if (setitimer (ITIMER_REAL, &new, &old) < 0) | 
|  | return 0; | 
|  | else | 
|  | return old.it_value.tv_sec; | 
|  | @} | 
|  | @end smallexample | 
|  |  | 
|  | There is an example showing the use of the @code{alarm} function in | 
|  | @ref{Handler Returns}. | 
|  |  | 
|  | If you simply want your process to wait for a given number of seconds, | 
|  | you should use the @code{sleep} function.  @xref{Sleeping}. | 
|  |  | 
|  | You shouldn't count on the signal arriving precisely when the timer | 
|  | expires.  In a multiprocessing environment there is typically some | 
|  | amount of delay involved. | 
|  |  | 
|  | @strong{Portability Note:} The @code{setitimer} and @code{getitimer} | 
|  | functions are derived from BSD Unix, while the @code{alarm} function is | 
|  | specified by the POSIX.1 standard.  @code{setitimer} is more powerful than | 
|  | @code{alarm}, but @code{alarm} is more widely used. | 
|  |  | 
|  | @node Sleeping | 
|  | @section Sleeping | 
|  |  | 
|  | The function @code{sleep} gives a simple way to make the program wait | 
|  | for a short interval.  If your program doesn't use signals (except to | 
|  | terminate), then you can expect @code{sleep} to wait reliably throughout | 
|  | the specified interval.  Otherwise, @code{sleep} can return sooner if a | 
|  | signal arrives; if you want to wait for a given interval regardless of | 
|  | signals, use @code{select} (@pxref{Waiting for I/O}) and don't specify | 
|  | any descriptors to wait for. | 
|  | @c !!! select can get EINTR; using SA_RESTART makes sleep win too. | 
|  |  | 
|  | @comment unistd.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun {unsigned int} sleep (unsigned int @var{seconds}) | 
|  | @safety{@prelim{}@mtunsafe{@mtascusig{:SIGCHLD/linux}}@asunsafe{}@acunsafe{}} | 
|  | @c On Mach, it uses ports and calls time.  On generic posix, it calls | 
|  | @c nanosleep.  On Linux, it temporarily blocks SIGCHLD, which is MT- and | 
|  | @c AS-Unsafe, and in a way that makes it AC-Unsafe (C-unsafe, even!). | 
|  | The @code{sleep} function waits for @var{seconds} or until a signal | 
|  | is delivered, whichever happens first. | 
|  |  | 
|  | If @code{sleep} function returns because the requested interval is over, | 
|  | it returns a value of zero.  If it returns because of delivery of a | 
|  | signal, its return value is the remaining time in the sleep interval. | 
|  |  | 
|  | The @code{sleep} function is declared in @file{unistd.h}. | 
|  | @end deftypefun | 
|  |  | 
|  | Resist the temptation to implement a sleep for a fixed amount of time by | 
|  | using the return value of @code{sleep}, when nonzero, to call | 
|  | @code{sleep} again.  This will work with a certain amount of accuracy as | 
|  | long as signals arrive infrequently.  But each signal can cause the | 
|  | eventual wakeup time to be off by an additional second or so.  Suppose a | 
|  | few signals happen to arrive in rapid succession by bad luck---there is | 
|  | no limit on how much this could shorten or lengthen the wait. | 
|  |  | 
|  | Instead, compute the calendar time at which the program should stop | 
|  | waiting, and keep trying to wait until that calendar time.  This won't | 
|  | be off by more than a second.  With just a little more work, you can use | 
|  | @code{select} and make the waiting period quite accurate.  (Of course, | 
|  | heavy system load can cause additional unavoidable delays---unless the | 
|  | machine is dedicated to one application, there is no way you can avoid | 
|  | this.) | 
|  |  | 
|  | On some systems, @code{sleep} can do strange things if your program uses | 
|  | @code{SIGALRM} explicitly.  Even if @code{SIGALRM} signals are being | 
|  | ignored or blocked when @code{sleep} is called, @code{sleep} might | 
|  | return prematurely on delivery of a @code{SIGALRM} signal.  If you have | 
|  | established a handler for @code{SIGALRM} signals and a @code{SIGALRM} | 
|  | signal is delivered while the process is sleeping, the action taken | 
|  | might be just to cause @code{sleep} to return instead of invoking your | 
|  | handler.  And, if @code{sleep} is interrupted by delivery of a signal | 
|  | whose handler requests an alarm or alters the handling of @code{SIGALRM}, | 
|  | this handler and @code{sleep} will interfere. | 
|  |  | 
|  | On @gnusystems{}, it is safe to use @code{sleep} and @code{SIGALRM} in | 
|  | the same program, because @code{sleep} does not work by means of | 
|  | @code{SIGALRM}. | 
|  |  | 
|  | @comment time.h | 
|  | @comment POSIX.1 | 
|  | @deftypefun int nanosleep (const struct timespec *@var{requested_time}, struct timespec *@var{remaining}) | 
|  | @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} | 
|  | @c On Linux, it's a syscall.  On Mach, it calls gettimeofday and uses | 
|  | @c ports. | 
|  | If resolution to seconds is not enough the @code{nanosleep} function can | 
|  | be used.  As the name suggests the sleep interval can be specified in | 
|  | nanoseconds.  The actual elapsed time of the sleep interval might be | 
|  | longer since the system rounds the elapsed time you request up to the | 
|  | next integer multiple of the actual resolution the system can deliver. | 
|  |  | 
|  | *@code{requested_time} is the elapsed time of the interval you want to | 
|  | sleep. | 
|  |  | 
|  | The function returns as *@code{remaining} the elapsed time left in the | 
|  | interval for which you requested to sleep.  If the interval completed | 
|  | without getting interrupted by a signal, this is zero. | 
|  |  | 
|  | @code{struct timespec} is described in @xref{Elapsed Time}. | 
|  |  | 
|  | If the function returns because the interval is over the return value is | 
|  | zero.  If the function returns @math{-1} the global variable @var{errno} | 
|  | is set to the following values: | 
|  |  | 
|  | @table @code | 
|  | @item EINTR | 
|  | The call was interrupted because a signal was delivered to the thread. | 
|  | If the @var{remaining} parameter is not the null pointer the structure | 
|  | pointed to by @var{remaining} is updated to contain the remaining | 
|  | elapsed time. | 
|  |  | 
|  | @item EINVAL | 
|  | The nanosecond value in the @var{requested_time} parameter contains an | 
|  | illegal value.  Either the value is negative or greater than or equal to | 
|  | 1000 million. | 
|  | @end table | 
|  |  | 
|  | This function is a cancellation point in multi-threaded programs.  This | 
|  | is a problem if the thread allocates some resources (like memory, file | 
|  | descriptors, semaphores or whatever) at the time @code{nanosleep} is | 
|  | called.  If the thread gets canceled these resources stay allocated | 
|  | until the program ends.  To avoid this calls to @code{nanosleep} should | 
|  | be protected using cancellation handlers. | 
|  | @c ref pthread_cleanup_push / pthread_cleanup_pop | 
|  |  | 
|  | The @code{nanosleep} function is declared in @file{time.h}. | 
|  | @end deftypefun |