123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910 |
- @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}.
- @deftypefun double difftime (time_t @var{time1}, time_t @var{time0})
- @standards{ISO, time.h}
- @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.
- @deftp {Data Type} {struct timeval}
- @standards{BSD, sys/time.h}
- @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
- @deftp {Data Type} {struct timespec}
- @standards{POSIX.1, sys/time.h}
- @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.
- @deftypevr Macro int CLOCKS_PER_SEC
- @standards{ISO, time.h}
- 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
- @deftp {Data Type} clock_t
- @standards{ISO, time.h}
- 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
- @deftypefun clock_t clock (void)
- @standards{ISO, time.h}
- @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
- @deftp {Data Type} {struct tms}
- @standards{POSIX.1, sys/times.h}
- 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 the 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
- @deftypevr Macro int CLK_TCK
- @standards{POSIX.1, time.h}
- This is an obsolete name for the number of clock ticks per second. Use
- @code{sysconf (_SC_CLK_TCK)} instead.
- @end deftypevr
- @deftypefun clock_t times (struct tms *@var{buffer})
- @standards{POSIX.1, sys/times.h}
- @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
- @deftp {Data Type} time_t
- @standards{ISO, time.h}
- 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}.
- @deftypefun time_t time (time_t *@var{result})
- @standards{ISO, time.h}
- @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.
- @deftypefun int stime (const time_t *@var{newtime})
- @standards{SVID, time.h}
- @standards{XPG, time.h}
- @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
- @deftp {Data Type} {struct timezone}
- @standards{BSD, sys/time.h}
- 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
- @deftypefun int gettimeofday (struct timeval *@var{tp}, struct timezone *@var{tzp})
- @standards{BSD, sys/time.h}
- @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 to by @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
- @deftypefun int settimeofday (const struct timeval *@var{tp}, const struct timezone *@var{tzp})
- @standards{BSD, sys/time.h}
- @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().
- @deftypefun int adjtime (const struct timeval *@var{delta}, struct timeval *@var{olddelta})
- @standards{BSD, sys/time.h}
- @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}.
- @deftypefun int adjtimex (struct timex *@var{timex})
- @standards{GNU, sys/timex.h}
- @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}.
- @deftp {Data Type} {struct tm}
- @standards{ISO, time.h}
- 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
- @deftypefun {struct tm *} localtime (const time_t *@var{time})
- @standards{ISO, time.h}
- @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.
- @deftypefun {struct tm *} localtime_r (const time_t *@var{time}, struct tm *@var{resultp})
- @standards{POSIX.1c, time.h}
- @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
- @deftypefun {struct tm *} gmtime (const time_t *@var{time})
- @standards{ISO, time.h}
- @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}.
- @deftypefun {struct tm *} gmtime_r (const time_t *@var{time}, struct tm *@var{resultp})
- @standards{POSIX.1c, time.h}
- @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
- @deftypefun time_t mktime (struct tm *@var{brokentime})
- @standards{ISO, time.h}
- @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
- @deftypefun time_t timelocal (struct tm *@var{brokentime})
- @standards{???, time.h}
- @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
- @deftypefun time_t timegm (struct tm *@var{brokentime})
- @standards{???, time.h}
- @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
- @deftypefun int ntp_gettime (struct ntptimeval *@var{tptr})
- @standards{GNU, sys/timex.h}
- @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, an @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:
- @vtable @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 vtable
- @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
- @deftypefun int ntp_adjtime (struct timex *@var{tptr})
- @standards{GNU, sys/timex.h}
- @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
- @deftypefun {char *} asctime (const struct tm *@var{brokentime})
- @standards{ISO, time.h}
- @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
- @deftypefun {char *} asctime_r (const struct tm *@var{brokentime}, char *@var{buffer})
- @standards{POSIX.1c, time.h}
- @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
- it returns @code{NULL}.
- @end deftypefun
- @deftypefun {char *} ctime (const time_t *@var{time})
- @standards{ISO, time.h}
- @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
- @deftypefun {char *} ctime_r (const time_t *@var{time}, char *@var{buffer})
- @standards{POSIX.1c, time.h}
- @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
- it returns @code{NULL}.
- @end deftypefun
- @deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime})
- @standards{ISO, time.h}
- @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 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 alternative 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
- With all format specifiers that produce numbers: use the locale's
- alternative numeric symbols.
- With @code{%B}, @code{%b}, and @code{%h}: use the grammatical form for
- month names that is appropriate when the month is named by itself,
- rather than the form that is appropriate when the month is used as
- part of a complete date. This is a GNU extension.
- @end table
- If the format supports the modifier but no alternative 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, in the
- grammatical form used when the month is part of a complete date.
- As a GNU extension, the @code{O} modifier can be used (@code{%Ob})
- to get the grammatical form used when the month is named by itself.
- @item %B
- The full month name according to the current locale, in the
- grammatical form used when the month is part of a complete date.
- As a GNU extension, the @code{O} modifier can be used (@code{%OB})
- to get the grammatical form used when the month is named by itself.
- Note that not all languages need two different forms of the month
- names, so the text produced by @code{%B} and @code{%OB}, and by
- @code{%b} and @code{%Ob}, may or may not be the same, depending on
- the locale.
- @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.
- If the @code{E} modifier is specified (@code{%EC}), instead produces
- the name of the period for the year (e.g.@: an era name) in the
- locale's alternative calendar.
- 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 spaces (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 spaces (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 spaces (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.
- If the @code{E} modifier is specified (@code{%Ey}), instead produces
- the year number according to a locale-specific alternative calendar.
- Unlike @code{%y}, the number is @emph{not} reduced modulo 100.
- However, by default it is zero-padded to a minimum of two digits (this
- can be overridden by an explicit field width or by the @code{_} and
- @code{-} flags).
- @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.
- If the @code{E} modifier is specified (@code{%EY}), instead produces a
- complete representation of the year according to the locale's
- alternative calendar. Generally this will be some combination of the
- information produced by @code{%EC} and @code{Ey}. As a GNU extension,
- the formatting flags @code{_} or @code{-} may be used with this
- conversion specifier; they affect how the year number is printed.
- @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
- @deftypefun size_t wcsftime (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, const struct tm *@var{brokentime})
- @standards{ISO/Amend1, time.h}
- @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
- characters, 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}.
- @deftypefun {char *} strptime (const char *@var{s}, const char *@var{fmt}, struct tm *@var{tp})
- @standards{XPG4, time.h}
- @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
- A month name according to the current locale. All three specifiers
- will recognize both abbreviated and full month names. If the
- locale provides two different grammatical forms of month names,
- all three specifiers will recognize both forms.
- As a GNU extension, the @code{O} modifier can be used with these
- specifiers; it has no effect, as both grammatical forms of month
- names are recognized.
- @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 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
- 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).
- @defvar getdate_err
- @standards{Unix98, time.h}
- 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
- @deftypefun {struct tm *} getdate (const char *@var{string})
- @standards{Unix98, time.h}
- @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 than 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
- @deftypefun int getdate_r (const char *@var{string}, struct tm *@var{tp})
- @standards{GNU, time.h}
- @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
- @deftypevar {char *} tzname [2]
- @standards{POSIX.1, time.h}
- 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
- @deftypefun void tzset (void)
- @standards{POSIX.1, time.h}
- @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.
- @deftypevar {long int} timezone
- @standards{SVID, time.h}
- 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
- @deftypevar int daylight
- @standards{SVID, time.h}
- 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 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
- @deftp {Data Type} {struct itimerval}
- @standards{BSD, sys/time.h}
- 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
- @deftypefun int setitimer (int @var{which}, const struct itimerval *@var{new}, struct itimerval *@var{old})
- @standards{BSD, sys/time.h}
- @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
- @deftypefun int getitimer (int @var{which}, struct itimerval *@var{old})
- @standards{BSD, sys/time.h}
- @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
- @vtable @code
- @item ITIMER_REAL
- @standards{BSD, sys/time.h}
- This constant can be used as the @var{which} argument to the
- @code{setitimer} and @code{getitimer} functions to specify the real-time
- timer.
- @item ITIMER_VIRTUAL
- @standards{BSD, sys/time.h}
- This constant can be used as the @var{which} argument to the
- @code{setitimer} and @code{getitimer} functions to specify the virtual
- timer.
- @item ITIMER_PROF
- @standards{BSD, sys/time.h}
- 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
- @deftypefun {unsigned int} alarm (unsigned int @var{seconds})
- @standards{POSIX.1, unistd.h}
- @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 was 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.
- @deftypefun {unsigned int} sleep (unsigned int @var{seconds})
- @standards{POSIX.1, unistd.h}
- @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} seconds or until a signal
- is delivered, whichever happens first.
- If @code{sleep} 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}.
- @deftypefun int nanosleep (const struct timespec *@var{requested_time}, struct timespec *@var{remaining})
- @standards{POSIX.1, time.h}
- @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 @code{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
|