xref: /freebsd/contrib/tzcode/theory.html (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <title>Theory and pragmatics of the tz code and data</title>
5  <meta charset="UTF-8">
6  <style>
7    pre {margin-left: 2em; white-space: pre-wrap;}
8  </style>
9</head>
10
11<body>
12<h1>Theory and pragmatics of the <code><abbr>tz</abbr></code> code and data</h1>
13  <h3>Outline</h3>
14  <nav>
15    <ul>
16      <li><a href="#scope">Scope of the <code><abbr>tz</abbr></code>
17	  database</a></li>
18      <li><a href="#naming">Timezone identifiers</a></li>
19      <li><a href="#abbreviations">Time zone abbreviations</a></li>
20      <li><a href="#accuracy">Accuracy of the <code><abbr>tz</abbr></code>
21	  database</a></li>
22      <li><a href="#functions">Time and date functions</a></li>
23      <li><a href="#stability">Interface stability</a></li>
24      <li><a href="#leapsec">Leap seconds</a></li>
25      <li><a href="#calendar">Calendrical issues</a></li>
26      <li><a href="#planets">Time and time zones off earth</a></li>
27    </ul>
28  </nav>
29
30<section>
31  <h2 id="scope">Scope of the <code><abbr>tz</abbr></code> database</h2>
32<p>
33The <a
34href="https://www.iana.org/time-zones"><code><abbr>tz</abbr></code>
35database</a> attempts to record the history and predicted future of
36civil time scales.
37It organizes <a href="tz-link.html">time zone and daylight saving time
38data</a> by partitioning the world into <a
39href="https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"><dfn>timezones</dfn></a>
40whose clocks all agree about timestamps that occur after the <a
41href="https://en.wikipedia.org/wiki/Unix_time">POSIX Epoch</a>
42(1970-01-01 00:00:00 <a
43href="https://en.wikipedia.org/wiki/Coordinated_Universal_Time"><abbr
44title="Coordinated Universal Time">UTC</abbr></a>).
45Although 1970 is a somewhat-arbitrary cutoff, there are significant
46challenges to moving the cutoff earlier even by a decade or two, due
47to the wide variety of local practices before computer timekeeping
48became prevalent.
49Most timezones correspond to a notable location and the database
50records all known clock transitions for that location;
51some timezones correspond instead to a fixed <abbr>UTC</abbr> offset.
52</p>
53
54<p>
55Each timezone typically corresponds to a geographical region that is
56smaller than a traditional time zone, because clocks in a timezone
57all agree after 1970 whereas a traditional time zone merely
58specifies current standard time. For example, applications that deal
59with current and future timestamps in the traditional North
60American mountain time zone can choose from the timezones
61<code>America/Denver</code> which observes US-style daylight saving
62time (<abbr>DST</abbr>),
63and <code>America/Phoenix</code> which does not observe <abbr>DST</abbr>.
64Applications that also deal with past timestamps in the mountain time
65zone can choose from over a dozen timezones, such as
66<code>America/Boise</code>, <code>America/Edmonton</code>, and
67<code>America/Hermosillo</code>, each of which currently uses mountain
68time but differs from other timezones for some timestamps after 1970.
69</p>
70
71<p>
72Clock transitions before 1970 are recorded for location-based timezones,
73because most systems support timestamps before 1970 and could
74misbehave if data entries were omitted for pre-1970 transitions.
75However, the database is not designed for and does not suffice for
76applications requiring accurate handling of all past times everywhere,
77as it would take far too much effort and guesswork to record all
78details of pre-1970 civil timekeeping.
79Although some information outside the scope of the database is
80collected in a file <code>backzone</code> that is distributed along
81with the database proper, this file is less reliable and does not
82necessarily follow database guidelines.
83</p>
84
85<p>
86As described below, reference source code for using the
87<code><abbr>tz</abbr></code> database is also available.
88The <code><abbr>tz</abbr></code> code is upwards compatible with <a
89href="https://en.wikipedia.org/wiki/POSIX">POSIX</a>, an international
90standard for <a
91href="https://en.wikipedia.org/wiki/Unix">UNIX</a>-like systems.
92As of this writing, the current edition of POSIX is POSIX.1-2024,
93which has been published but not yet in HTML form.
94Unlike its predecessor POSIX.1-2017 (<a
95href="https://pubs.opengroup.org/onlinepubs/9699919799/"> The Open
96Group Base Specifications Issue 7</a>, IEEE Std 1003.1-2017, 2018
97Edition), POSIX.1-2024 requires support for the
98<code><abbr>tz</abbr></code> database, which has a
99model for describing civil time that is more complex than the
100standard and daylight saving times required by POSIX.1-2017.
101A <code><abbr>tz</abbr></code> timezone corresponds to a ruleset that can
102have more than two changes per year, these changes need not merely
103flip back and forth between two alternatives, and the rules themselves
104can change at times.
105Whether and when a timezone changes its clock,
106and even the timezone's notional base offset from <abbr>UTC</abbr>,
107are variable.
108It does not always make sense to talk about a timezone's
109"base offset", which is not necessarily a single number.
110</p>
111
112</section>
113
114<section>
115  <h2 id="naming">Timezone identifiers</h2>
116<p>
117Each timezone has a name that uniquely identifies the timezone.
118Inexperienced users are not expected to select these names unaided.
119Distributors should provide documentation and/or a simple selection
120interface that explains each name via a map or via descriptive text like
121"Czech Republic" instead of the timezone name "<code>Europe/Prague</code>".
122If geolocation information is available, a selection interface can
123locate the user on a timezone map or prioritize names that are
124geographically close. For an example selection interface, see the
125<code>tzselect</code> program in the <code><abbr>tz</abbr></code> code.
126The <a href="https://cldr.unicode.org">Unicode Common Locale Data
127Repository</a> contains data that may be useful for other selection
128interfaces; it maps timezone names like <code>Europe/Prague</code> to
129locale-dependent strings like "Prague", "Praha", "Прага", and "布拉格".
130</p>
131
132<p>
133The naming conventions attempt to strike a balance
134among the following goals:
135</p>
136
137<ul>
138  <li>
139    Uniquely identify every timezone where clocks have agreed since 1970.
140    This is essential for the intended use: static clocks keeping local
141    civil time.
142  </li>
143  <li>
144    Indicate to experts where the timezone's clocks typically are.
145  </li>
146  <li>
147    Be robust in the presence of political changes.
148    For example, names are typically not tied to countries, to avoid
149    incompatibilities when countries change their name (e.g.,
150    Swaziland&rarr;Eswatini) or when locations change countries (e.g., Hong
151    Kong from UK colony to China).
152    There is no requirement that every country or national
153    capital must have a timezone name.
154  </li>
155  <li>
156    Be portable to a wide variety of implementations.
157  </li>
158  <li>
159    Use a consistent naming conventions over the entire world.
160  </li>
161</ul>
162
163<p>
164Names normally have the format
165<var>AREA</var><code>/</code><var>LOCATION</var>, where
166<var>AREA</var> is a continent or ocean, and
167<var>LOCATION</var> is a specific location within the area.
168North and South America share the same area, '<code>America</code>'.
169Typical names are '<code>Africa/Cairo</code>',
170'<code>America/New_York</code>', and '<code>Pacific/Honolulu</code>'.
171Some names are further qualified to help avoid confusion; for example,
172'<code>America/Indiana/Petersburg</code>' distinguishes Petersburg,
173Indiana from other Petersburgs in America.
174</p>
175
176<p>
177Here are the general guidelines used for
178choosing timezone names,
179in decreasing order of importance:
180</p>
181
182<ul>
183  <li>
184    Use only valid POSIX file name components (i.e., the parts of
185    names other than '<code>/</code>').
186    Do not use the file name components '<code>.</code>' and
187    '<code>..</code>'.
188    Within a file name component, use only <a
189    href="https://en.wikipedia.org/wiki/ASCII">ASCII</a> letters,
190    '<code>.</code>', '<code>-</code>' and '<code>_</code>'.
191    Do not use digits, as that might create an ambiguity with <a
192    href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03">POSIX's proleptic
193    <code>TZ</code> strings</a>.
194    A file name component must not exceed 14 characters or start with
195    '<code>-</code>'.
196    E.g., prefer <code>America/Noronha</code> to
197    <code>America/Fernando_de_Noronha</code>.
198    Exceptions: see the discussion of legacy names below.
199  </li>
200  <li>
201    A name must not be empty, or contain '<code>//</code>', or
202    start or end with '<code>/</code>'.
203  </li>
204  <li>
205    Do not use names that differ only in case.
206    Although the reference implementation is case-sensitive, some
207    other implementations are not, and they would mishandle names
208    differing only in case.
209  </li>
210  <li>
211    If one name <var>A</var> is an initial prefix of another
212    name <var>AB</var> (ignoring case), then <var>B</var> must not
213    start with '<code>/</code>', as a regular file cannot have the
214    same name as a directory in POSIX.
215    For example, <code>America/New_York</code> precludes
216    <code>America/New_York/Bronx</code>.
217  </li>
218  <li>
219    Uninhabited regions like the North Pole and Bouvet Island
220    do not need locations, since local time is not defined there.
221  </li>
222  <li>
223    If all the clocks in a timezone have agreed since 1970,
224    do not bother to include more than one timezone
225    even if some of the clocks disagreed before 1970.
226    Otherwise these tables would become annoyingly large.
227  </li>
228  <li>
229    If boundaries between regions are fluid, such as during a war or
230    insurrection, do not bother to create a new timezone merely
231    because of yet another boundary change. This helps prevent table
232    bloat and simplifies maintenance.
233  </li>
234  <li>
235    If a name is ambiguous, use a less ambiguous alternative;
236    e.g., many cities are named San José and Georgetown, so
237    prefer <code>America/Costa_Rica</code> to
238    <code>America/San_Jose</code> and <code>America/Guyana</code>
239    to <code>America/Georgetown</code>.
240  </li>
241  <li>
242    Keep locations compact.
243    Use cities or small islands, not countries or regions, so that any
244    future changes do not split individual locations into different
245    timezones.
246    E.g., prefer <code>Europe/Paris</code> to <code>Europe/France</code>,
247    since
248    <a href="https://en.wikipedia.org/wiki/Time_in_France#History">France
249    has had multiple time zones</a>.
250  </li>
251  <li>
252    Use mainstream English spelling, e.g., prefer
253    <code>Europe/Rome</code> to <code>Europa/Roma</code>, and
254    prefer <code>Europe/Athens</code> to the Greek
255    <code>Ευρώπη/Αθήνα</code> or the Romanized
256    <code>Evrópi/Athína</code>.
257    The POSIX file name restrictions encourage this guideline.
258  </li>
259  <li>
260    Use the most populous among locations in a region,
261    e.g., prefer <code>Asia/Shanghai</code> to
262    <code>Asia/Beijing</code>.
263    Among locations with similar populations, pick the best-known
264    location, e.g., prefer <code>Europe/Rome</code> to
265    <code>Europe/Milan</code>.
266  </li>
267  <li>
268    Use the singular form, e.g., prefer <code>Atlantic/Canary</code> to
269    <code>Atlantic/Canaries</code>.
270  </li>
271  <li>
272    Omit common suffixes like '<code>_Islands</code>' and
273    '<code>_City</code>', unless that would lead to ambiguity.
274    E.g., prefer <code>America/Cayman</code> to
275    <code>America/Cayman_Islands</code> and
276    <code>America/Guatemala</code> to
277    <code>America/Guatemala_City</code>, but prefer
278    <code>America/Mexico_City</code> to
279    <code>America/Mexico</code>
280    because <a href="https://en.wikipedia.org/wiki/Time_in_Mexico">the
281    country of Mexico has several time zones</a>.
282  </li>
283  <li>
284    Use '<code>_</code>' to represent a space.
285  </li>
286  <li>
287    Omit '<code>.</code>' from abbreviations in names.
288    E.g., prefer <code>Atlantic/St_Helena</code> to
289    <code>Atlantic/St._Helena</code>.
290  </li>
291  <li>
292    Do not change established names if they only marginally violate
293    the above guidelines.
294    For example, do not change the existing name <code>Europe/Rome</code> to
295    <code>Europe/Milan</code> merely because Milan's population has grown
296    to be somewhat greater than Rome's.
297  </li>
298  <li>
299    If a name is changed, put its old spelling in the
300    '<code>backward</code>' file as a link to the new spelling.
301    This means old spellings will continue to work.
302    Ordinarily a name change should occur only in the rare case when
303    a location's consensus English-language spelling changes; for example,
304    in 2008 <code>Asia/Calcutta</code> was renamed to <code>Asia/Kolkata</code>
305    due to long-time widespread use of the new city name instead of the old.
306  </li>
307</ul>
308
309<p>
310Guidelines have evolved with time, and names following old versions of
311these guidelines might not follow the current version. When guidelines
312have changed, old names continue to be supported. Guideline changes
313have included the following:
314</p>
315
316<ul>
317<li>
318Older versions of this package used a different naming scheme.
319See the file '<code>backward</code>' for most of these older names
320(e.g., '<code>US/Eastern</code>' instead of '<code>America/New_York</code>').
321The other old-fashioned names still supported are
322'<code>WET</code>', '<code>CET</code>', '<code>MET</code>', and
323'<code>EET</code>' (see the file '<code>europe</code>').
324</li>
325
326<li>
327Older versions of this package defined legacy names that are
328incompatible with the first guideline of location names, but which are
329still supported.
330These legacy names are mostly defined in the file
331'<code>etcetera</code>'.
332Also, the file '<code>backward</code>' defines the legacy names
333'<code>Etc/GMT0</code>', '<code>Etc/GMT-0</code>', '<code>Etc/GMT+0</code>',
334'<code>GMT0</code>', '<code>GMT-0</code>' and '<code>GMT+0</code>',
335and the file '<code>northamerica</code>' defines the legacy names
336'<code>EST5EDT</code>', '<code>CST6CDT</code>',
337'<code>MST7MDT</code>', and '<code>PST8PDT</code>'.
338</li>
339
340<li>
341Older versions of these guidelines said that
342there should typically be at least one name for each <a
343href="https://en.wikipedia.org/wiki/ISO_3166-1"><abbr
344title="International Organization for Standardization">ISO</abbr>
3453166-1</a> officially assigned two-letter code for an inhabited
346country or territory.
347This old guideline has been dropped, as it was not needed to handle
348timestamps correctly and it increased maintenance burden.
349</li>
350</ul>
351
352<p>
353The file <code>zone1970.tab</code> lists geographical locations used
354to name timezones.
355It is intended to be an exhaustive list of names for geographic
356regions as described above; this is a subset of the timezones in the data.
357Although a <code>zone1970.tab</code> location's
358<a href="https://en.wikipedia.org/wiki/Longitude">longitude</a>
359corresponds to
360its <a href="https://en.wikipedia.org/wiki/Local_mean_time">local mean
361time (<abbr>LMT</abbr>)</a> offset with one hour for every 15&deg;
362east longitude, this relationship is not exact.
363The backward-compatibility file <code>zone.tab</code> is similar
364but conforms to the older-version guidelines related to <abbr>ISO</abbr> 3166-1;
365it lists only one country code per entry and unlike <code>zone1970.tab</code>
366it can list names defined in <code>backward</code>.
367Applications that process only timestamps from now on can instead use the file
368<code>zonenow.tab</code>, which partitions the world more coarsely,
369into regions where clocks agree now and in the predicted future;
370this file is smaller and simpler than <code>zone1970.tab</code>
371and <code>zone.tab</code>.
372</p>
373
374<p>
375The database defines each timezone name to be a zone, or a link to a zone.
376The source file <code>backward</code> defines links for backward
377compatibility; it does not define zones.
378Although <code>backward</code> was originally designed to be optional,
379nowadays distributions typically use it
380and no great weight should be attached to whether a link
381is defined in <code>backward</code> or in some other file.
382The source file <code>etcetera</code> defines names that may be useful
383on platforms that do not support proleptic <code>TZ</code> strings
384like <code>&lt;+08&gt;-8</code>;
385no other source file other than <code>backward</code>
386contains links to its zones.
387One of <code>etcetera</code>'s names is <code>Etc/UTC</code>,
388used by functions like <code>gmtime</code> to obtain leap
389second information on platforms that support leap seconds.
390Another <code>etcetera</code> name, <code>GMT</code>,
391is used by older code releases.
392</p>
393</section>
394
395<section>
396  <h2 id="abbreviations">Time zone abbreviations</h2>
397<p>
398When this package is installed, it generates time zone abbreviations
399like '<code>EST</code>' to be compatible with human tradition and POSIX.
400Here are the general guidelines used for choosing time zone abbreviations,
401in decreasing order of importance:
402</p>
403
404<ul>
405  <li>
406    Use three to six characters that are ASCII alphanumerics or
407    '<code>+</code>' or '<code>-</code>'.
408    Previous editions of this database also used characters like
409    space and '<code>?</code>', but these characters have a
410    special meaning to the
411    <a href="https://en.wikipedia.org/wiki/Unix_shell">UNIX shell</a>
412    and cause commands like
413    '<code><a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set">set</a>
414    `<a href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.html">date</a>`</code>'
415    to have unexpected effects.
416    Previous editions of this guideline required upper-case letters, but the
417    Congressman who introduced
418    <a href="https://en.wikipedia.org/wiki/Chamorro_Time_Zone">Chamorro
419    Standard Time</a> preferred "ChST", so lower-case letters are now
420    allowed.
421    Also, POSIX from 2001 on relaxed the rule to allow '<code>-</code>',
422    '<code>+</code>', and alphanumeric characters from the portable
423    character set in the current locale.
424    In practice ASCII alphanumerics and '<code>+</code>' and
425    '<code>-</code>' are safe in all locales.
426
427    <p>
428    In other words, in the C locale the POSIX extended regular
429    expression <code>[-+[:alnum:]]{3,6}</code> should match the
430    abbreviation.
431    This guarantees that all abbreviations could have been specified
432    explicitly by a POSIX proleptic <code>TZ</code> string.
433    </p>
434  </li>
435  <li>
436    Use abbreviations that are in common use among English-speakers,
437    e.g., 'EST' for Eastern Standard Time in North America.
438    We assume that applications translate them to other languages
439    as part of the normal localization process; for example,
440    a French application might translate 'EST' to 'HNE'.
441
442    <p>
443    <small>These abbreviations (for standard/daylight/etc. time) are:
444      ACST/ACDT Australian Central,
445      AST/ADT/APT/AWT/ADDT Atlantic,
446      AEST/AEDT Australian Eastern,
447      AHST/AHDT Alaska-Hawaii,
448      AKST/AKDT Alaska,
449      AWST/AWDT Australian Western,
450      BST/BDT Bering,
451      CAT/CAST Central Africa,
452      CET/CEST/CEMT Central European,
453      ChST Chamorro,
454      CST/CDT/CWT/CPT Central [North America],
455      CST/CDT China,
456      GMT/BST/IST/BDST Greenwich,
457      EAT East Africa,
458      EST/EDT/EWT/EPT Eastern [North America],
459      EET/EEST Eastern European,
460      GST/GDT Guam,
461      HST/HDT/HWT/HPT Hawaii,
462      HKT/HKST/HKWT Hong Kong,
463      IST India,
464      IST/GMT Irish,
465      IST/IDT/IDDT Israel,
466      JST/JDT Japan,
467      KST/KDT Korea,
468      MET/MEST Middle European (a backward-compatibility alias for
469	Central European),
470      MSK/MSD Moscow,
471      MST/MDT/MWT/MPT Mountain,
472      NST/NDT/NWT/NPT/NDDT Newfoundland,
473      NST/NDT/NWT/NPT Nome,
474      NZMT/NZST New Zealand through 1945,
475      NZST/NZDT New Zealand 1946&ndash;present,
476      PKT/PKST Pakistan,
477      PST/PDT/PWT/PPT Pacific,
478      PST/PDT Philippine,
479      SAST South Africa,
480      SST Samoa,
481      UTC Universal,
482      WAT/WAST West Africa,
483      WET/WEST/WEMT Western European,
484      WIB Waktu Indonesia Barat,
485      WIT Waktu Indonesia Timur,
486      WITA Waktu Indonesia Tengah,
487      YST/YDT/YWT/YPT/YDDT Yukon</small>.
488    </p>
489  </li>
490  <li>
491    <p>
492    For times taken from a city's longitude, use the
493    traditional <var>x</var>MT notation.
494    The only abbreviation like this in current use is '<abbr>GMT</abbr>'.
495    The others are for timestamps before 1960,
496    except that Monrovia Mean Time persisted until 1972.
497    Typically, numeric abbreviations (e.g., '<code>-</code>004430' for
498    MMT) would cause trouble here, as the numeric strings would exceed
499    the POSIX length limit.
500    </p>
501
502    <p>
503    <small>These abbreviations are:
504      AMT Asunción, Athens;
505      BMT Baghdad, Bangkok, Batavia, Bermuda, Bern, Bogotá,
506        Brussels, Bucharest;
507      CMT Calamarca, Caracas, Chisinau, Colón, Córdoba;
508      DMT Dublin/Dunsink;
509      EMT Easter;
510      FFMT Fort-de-France;
511      FMT Funchal;
512      GMT Greenwich;
513      HMT Havana, Helsinki, Horta, Howrah;
514      IMT Irkutsk, Istanbul;
515      JMT Jerusalem;
516      KMT Kaunas, Kyiv, Kingston;
517      LMT Lima, Lisbon, local;
518      MMT Macassar, Madras, Malé, Managua, Minsk, Monrovia, Montevideo,
519	Moratuwa, Moscow;
520      PLMT Phù Liễn;
521      PMT Paramaribo, Paris, Perm, Pontianak, Prague;
522      PMMT Port Moresby;
523      PPMT Port-au-Prince;
524      QMT Quito;
525      RMT Rangoon, Riga, Rome;
526      SDMT Santo Domingo;
527      SJMT San José;
528      SMT Santiago, Simferopol, Singapore, Stanley;
529      TBMT Tbilisi;
530      TMT Tallinn, Tehran;
531      WMT Warsaw.</small>
532    </p>
533
534    <p>
535    <small>A few abbreviations also follow the pattern that
536    <abbr>GMT</abbr>/<abbr>BST</abbr> established for time in the UK.
537    They are:
538      BMT/BST for Bermuda 1890&ndash;1930,
539      CMT/BST for Calamarca Mean Time and Bolivian Summer Time
540	1890&ndash;1932,
541      DMT/IST for Dublin/Dunsink Mean Time and Irish Summer Time
542	1880&ndash;1916,
543      MMT/MST/MDST for Moscow 1880&ndash;1919, and
544      RMT/LST for Riga Mean Time and Latvian Summer time 1880&ndash;1926.
545    </small>
546    </p>
547  </li>
548  <li>
549    Use '<abbr>LMT</abbr>' for local mean time of locations before the
550    introduction of standard time; see "<a href="#scope">Scope of the
551    <code><abbr>tz</abbr></code> database</a>".
552  </li>
553  <li>
554    If there is no common English abbreviation, use numeric offsets like
555    <code>-</code>05 and <code>+</code>0530 that are generated
556    by <code>zic</code>'s <code>%z</code> notation.
557  </li>
558  <li>
559    Use current abbreviations for older timestamps to avoid confusion.
560    For example, in 1910 a common English abbreviation for time
561    in central Europe was 'MEZ' (short for both "Middle European
562    Zone" and for "Mitteleuropäische Zeit" in German).
563    Nowadays 'CET' ("Central European Time") is more common in
564    English, and the database uses 'CET' even for circa-1910
565    timestamps as this is less confusing for modern users and avoids
566    the need for determining when 'CET' supplanted 'MEZ' in common
567    usage.
568  </li>
569  <li>
570    Use a consistent style in a timezone's history.
571    For example, if a history tends to use numeric
572    abbreviations and a particular entry could go either way, use a
573    numeric abbreviation.
574  </li>
575  <li>
576    Use
577    <a href="https://en.wikipedia.org/wiki/Universal_Time">Universal Time</a>
578    (<abbr>UT</abbr>) (with time zone abbreviation '<code>-</code>00') for
579    locations while uninhabited.
580    The leading '<code>-</code>' is a flag that the <abbr>UT</abbr> offset is in
581    some sense undefined; this notation is derived
582    from <a href="https://datatracker.ietf.org/doc/html/rfc3339">Internet
583    <abbr title="Request For Comments">RFC</abbr> 3339</a>.
584    (The abbreviation 'Z' that
585    <a href="https://datatracker.ietf.org/doc/html/rfc9557">Internet
586    <abbr>RFC</abbr> 9557</a> uses for this concept
587    would violate the POSIX requirement
588    of at least three characters in an abbreviation.)
589  </li>
590</ul>
591
592<p>
593Application writers should note that these abbreviations are ambiguous
594in practice: e.g., 'CST' means one thing in China and something else
595in North America, and 'IST' can refer to time in India, Ireland or
596Israel.
597To avoid ambiguity, use numeric <abbr>UT</abbr> offsets like
598'<code>-</code>0600' instead of time zone abbreviations like 'CST'.
599</p>
600</section>
601
602<section>
603  <h2 id="accuracy">Accuracy of the <code><abbr>tz</abbr></code> database</h2>
604<p>
605The <code><abbr>tz</abbr></code> database is not authoritative, and it
606surely has errors.
607Corrections are welcome and encouraged; see the file <code>CONTRIBUTING</code>.
608Users requiring authoritative data should consult national standards
609bodies and the references cited in the database's comments.
610</p>
611
612<p>
613Errors in the <code><abbr>tz</abbr></code> database arise from many sources:
614</p>
615
616<ul>
617  <li>
618    The <code><abbr>tz</abbr></code> database predicts future
619    timestamps, and current predictions
620    will be incorrect after future governments change the rules.
621    For example, if today someone schedules a meeting for 13:00 next
622    October 1, Casablanca time, and tomorrow Morocco changes its
623    daylight saving rules, software can mess up after the rule change
624    if it blithely relies on conversions made before the change.
625  </li>
626  <li>
627    The pre-1970 entries in this database cover only a tiny sliver of how
628    clocks actually behaved; the vast majority of the necessary
629    information was lost or never recorded.
630    Thousands more timezones would be needed if
631    the <code><abbr>tz</abbr></code> database's scope were extended to
632    cover even just the known or guessed history of standard time; for
633    example, the current single entry for France would need to split
634    into dozens of entries, perhaps hundreds.
635    And in most of the world even this approach would be misleading
636    due to widespread disagreement or indifference about what times
637    should be observed.
638    In her 2015 book
639    <cite><a
640    href="https://www.hup.harvard.edu/catalog.php?isbn=9780674286146">The
641    Global Transformation of Time, 1870&ndash;1950</a></cite>,
642    Vanessa Ogle writes
643    "Outside of Europe and North America there was no system of time
644    zones at all, often not even a stable landscape of mean times,
645    prior to the middle decades of the twentieth century".
646    See: Timothy Shenk, <a
647href="https://www.dissentmagazine.org/blog/booked-a-global-history-of-time-vanessa-ogle">Booked:
648      A Global History of Time</a>. <cite>Dissent</cite> 2015-12-17.
649  </li>
650  <li>
651    Most of the pre-1970 data entries come from unreliable sources, often
652    astrology books that lack citations and whose compilers evidently
653    invented entries when the true facts were unknown, without
654    reporting which entries were known and which were invented.
655    These books often contradict each other or give implausible entries,
656    and on the rare occasions when they are checked they are
657    typically found to be incorrect.
658  </li>
659  <li>
660    For the UK the <code><abbr>tz</abbr></code> database relies on
661    years of first-class work done by
662    Joseph Myers and others; see
663    "<a href="https://www.polyomino.org.uk/british-time/">History of
664    legal time in Britain</a>".
665    Other countries are not done nearly as well.
666  </li>
667  <li>
668    Sometimes, different people in the same city maintain clocks
669    that differ significantly.
670    Historically, railway time was used by railroad companies (which
671    did not always
672    agree with each other), church-clock time was used for birth
673    certificates, etc.
674    More recently, competing political groups might disagree about
675    clock settings. Often this is merely common practice, but
676    sometimes it is set by law.
677    For example, from 1891 to 1911 the <abbr>UT</abbr> offset in France
678    was legally <abbr>UT</abbr> +00:09:21 outside train stations and
679    <abbr>UT</abbr> +00:04:21 inside. Other examples include
680    Chillicothe in 1920, Palm Springs in 1946/7, and Jerusalem and
681    Ürümqi to this day.
682  </li>
683  <li>
684    Although a named location in the <code><abbr>tz</abbr></code>
685    database stands for the containing region, its pre-1970 data
686    entries are often accurate for only a small subset of that region.
687    For example, <code>Europe/London</code> stands for the United
688    Kingdom, but its pre-1847 times are valid only for locations that
689    have London's exact meridian, and its 1847 transition
690    to <abbr>GMT</abbr> is known to be valid only for the L&amp;NW and
691    the Caledonian railways.
692  </li>
693  <li>
694    The <code><abbr>tz</abbr></code> database does not record the
695    earliest time for which a timezone's
696    data entries are thereafter valid for every location in the region.
697    For example, <code>Europe/London</code> is valid for all locations
698    in its region after <abbr>GMT</abbr> was made the standard time,
699    but the date of standardization (1880-08-02) is not in the
700    <code><abbr>tz</abbr></code> database, other than in commentary.
701    For many timezones the earliest time of
702    validity is unknown.
703  </li>
704  <li>
705    The <code><abbr>tz</abbr></code> database does not record a
706    region's boundaries, and in many cases the boundaries are not known.
707    For example, the timezone
708    <code>America/Kentucky/Louisville</code> represents a region
709    around the city of Louisville, the boundaries of which are
710    unclear.
711  </li>
712  <li>
713    Changes that are modeled as instantaneous transitions in the
714    <code><abbr>tz</abbr></code>
715    database were often spread out over hours, days, or even decades.
716  </li>
717  <li>
718    Even if the time is specified by law, locations sometimes
719    deliberately flout the law.
720  </li>
721  <li>
722    Early timekeeping practices, even assuming perfect clocks, were
723    often not specified to the accuracy that the
724    <code><abbr>tz</abbr></code> database requires.
725  </li>
726  <li>
727    The <code><abbr>tz</abbr></code> database cannot represent stopped clocks.
728    However, on 1911-03-11 at 00:00, some public-facing French clocks
729    were changed by stopping them for a few minutes to effect a transition.
730    The <code><abbr>tz</abbr></code> database models this via a
731    backward transition; the relevant French legislation does not
732    specify exactly how the transition was to occur.
733  </li>
734  <li>
735    Sometimes historical timekeeping was specified more precisely
736    than what the <code><abbr>tz</abbr></code> code can handle.
737    For example, from 1880 to 1916 clocks in Ireland observed Dublin Mean
738    Time (estimated to be <abbr>UT</abbr>
739    &minus;00:25:21.1); although the <code><abbr>tz</abbr></code>
740    source data can represent the .1 second, TZif files and the code cannot.
741    In practice these old specifications were rarely if ever
742    implemented to subsecond precision.
743  </li>
744  <li>
745    Even when all the timestamp transitions recorded by the
746    <code><abbr>tz</abbr></code> database are correct, the
747    <code><abbr>tz</abbr></code> rules that generate them may not
748    faithfully reflect the historical rules.
749    For example, from 1922 until World War II the UK moved clocks
750    forward the day following the third Saturday in April unless that
751    was Easter, in which case it moved clocks forward the previous
752    Sunday.
753    Because the <code><abbr>tz</abbr></code> database has no
754    way to specify Easter, these exceptional years are entered as
755    separate <code><abbr>tz</abbr> Rule</code> lines, even though the
756    legal rules did not change.
757    When transitions are known but the historical rules behind them are not,
758    the database contains <code>Zone</code> and <code>Rule</code>
759    entries that are intended to represent only the generated
760    transitions, not any underlying historical rules; however, this
761    intent is recorded at best only in commentary.
762  </li>
763  <li>
764    The <code><abbr>tz</abbr></code> database models time
765    using the <a
766    href="https://en.wikipedia.org/wiki/Proleptic_Gregorian_calendar">proleptic
767    Gregorian calendar</a> with days containing 24 equal-length hours
768    numbered 00 through 23, except when clock transitions occur.
769    Pre-standard time is modeled as local mean time.
770    However, historically many people used other calendars and other timescales.
771    For example, the Roman Empire used
772    the <a href="https://en.wikipedia.org/wiki/Julian_calendar">Julian
773    calendar</a>,
774    and <a href="https://en.wikipedia.org/wiki/Roman_timekeeping">Roman
775    timekeeping</a> had twelve varying-length daytime hours with a
776    non-hour-based system at night.
777    And even today, some local practices diverge from the Gregorian
778    calendar with 24-hour days. These divergences range from
779    relatively minor, such as Japanese bars giving times like "24:30" for the
780    wee hours of the morning, to more-significant differences such as <a
781    href="https://theworld.org/stories/2015-01-30/if-you-have-meeting-ethiopia-you-better-double-check-time">the
782    east African practice of starting the day at dawn</a>, renumbering
783    the Western 06:00 to be 12:00. These practices are largely outside
784    the scope of the <code><abbr>tz</abbr></code> code and data, which
785    provide only limited support for date and time localization
786    such as that required by POSIX.
787    If <abbr>DST</abbr> is not used a different time zone
788    can often do the trick; for example, in Kenya a <code>TZ</code> setting
789    like <code>&lt;-03&gt;3</code> or <code>America/Cayenne</code> starts
790    the day six hours later than <code>Africa/Nairobi</code> does.
791  </li>
792  <li>
793    Early clocks were less reliable, and data entries do not represent
794    clock error.
795  </li>
796  <li>
797    The <code><abbr>tz</abbr></code> database assumes Universal Time
798    (<abbr>UT</abbr>) as an origin, even though <abbr>UT</abbr> is not
799    standardized for older timestamps.
800    In the <code><abbr>tz</abbr></code> database commentary,
801    <abbr>UT</abbr> denotes a family of time standards that includes
802    Coordinated Universal Time (<abbr>UTC</abbr>) along with other
803    variants such as <abbr>UT1</abbr> and <abbr>GMT</abbr>,
804    with days starting at midnight.
805    Although <abbr>UT</abbr> equals <abbr>UTC</abbr> for modern
806    timestamps, <abbr>UTC</abbr> was not defined until 1960, so
807    commentary uses the more general abbreviation <abbr>UT</abbr> for
808    timestamps that might predate 1960.
809    Since <abbr>UT</abbr>, <abbr>UT1</abbr>, etc. disagree slightly,
810    and since pre-1972 <abbr>UTC</abbr> seconds varied in length,
811    interpretation of older timestamps can be problematic when
812    subsecond accuracy is needed.
813  </li>
814  <li>
815    Civil time was not based on atomic time before 1972, and we do not
816    know the history of
817    <a href="https://en.wikipedia.org/wiki/Earth's_rotation">earth's
818    rotation</a> accurately enough to map <a
819    href="https://en.wikipedia.org/wiki/International_System_of_Units"><abbr
820    title="International System of Units">SI</abbr></a> seconds to
821    historical <a href="https://en.wikipedia.org/wiki/Solar_time">solar time</a>
822    to more than about one-hour accuracy.
823    See: Stephenson FR, Morrison LV, Hohenkerk CY.
824    <a href="https://dx.doi.org/10.1098/rspa.2016.0404">Measurement of
825    the Earth's rotation: 720 BC to AD 2015</a>.
826    <cite>Proc Royal Soc A</cite>. 2016;472:20160404.
827    Also see: Espenak F. <a
828    href="https://eclipse.gsfc.nasa.gov/SEhelp/uncertainty2004.html">Uncertainty
829    in Delta T (ΔT)</a>.
830  </li>
831  <li>
832    The relationship between POSIX time (that is, <abbr>UTC</abbr> but
833    ignoring <a href="https://en.wikipedia.org/wiki/Leap_second">leap
834    seconds</a>) and <abbr>UTC</abbr> is not agreed upon.
835    This affects time stamps during the leap second era (1972&ndash;2035).
836    Although the POSIX
837    clock officially stops during an inserted leap second, at least one
838    proposed standard has it jumping back a second instead; and in
839    practice POSIX clocks more typically either progress glacially during
840    a leap second, or are slightly slowed while near a leap second.
841  </li>
842  <li>
843    The <code><abbr>tz</abbr></code> database does not represent how
844    uncertain its information is.
845    Ideally it would contain information about when data entries are
846    incomplete or dicey.
847    Partial temporal knowledge is a field of active research, though,
848    and it is not clear how to apply it here.
849  </li>
850</ul>
851
852<p>
853In short, many, perhaps most, of the <code><abbr>tz</abbr></code>
854database's pre-1970 and future timestamps are either wrong or
855misleading.
856Any attempt to pass the
857<code><abbr>tz</abbr></code> database off as the definition of time
858should be unacceptable to anybody who cares about the facts.
859In particular, the <code><abbr>tz</abbr></code> database's
860<abbr>LMT</abbr> offsets should not be considered meaningful, and
861should not prompt creation of timezones
862merely because two locations
863differ in <abbr>LMT</abbr> or transitioned to standard time at
864different dates.
865</p>
866</section>
867
868<section>
869  <h2 id="functions">Time and date functions</h2>
870<p>
871The <code><abbr>tz</abbr></code> code contains time and date functions
872that are upwards compatible with those of POSIX.
873Code compatible with this package is already
874<a href="tz-link.html#tzdb">part of many platforms</a>, where the
875primary use of this package is to update obsolete time-related files.
876To do this, you may need to compile the time zone compiler
877<code>zic</code> supplied with this package instead of using the
878system <code>zic</code>, since the format of <code>zic</code>'s
879input is occasionally extended, and a platform may still be shipping
880an older <code>zic</code>.
881</p>
882
883<p>
884In POSIX, time display in a process is controlled by the
885environment variable <code>TZ</code>, which can have two forms:
886</p>
887<ul>
888  <li>
889    A <dfn>proleptic <code>TZ</code></dfn> value
890    like <code>CET-1CEST,M3.5.0,M10.5.0/3</code> uses a complex
891    notation that specifies a single standard time along with daylight
892    saving rules that apply to all years past, present, and future.
893  </li>
894  <li>
895    A <dfn>geographical <code>TZ</code></dfn> value
896    like <code>Europe/Berlin</code> names a location that stands for
897    civil time near that location, which can have more than
898    one standard time and more than one set of daylight saving rules,
899    to record timekeeping practice more accurately.
900    These names are defined by the <code><abbr>tz</abbr></code> database.
901  </li>
902</ul>
903
904<h3 id="POSIX.1-2017">POSIX.1-2017 properties and limitations</h3>
905<p>
906Some platforms support only the features required by POSIX.1-2017,
907and have not yet upgraded to POSIX.1-2024.
908Code intended to be portable to these platforms must deal
909with problems that were fixed in later POSIX editions.
910</p>
911
912<ul>
913  <li>
914    POSIX.1-2017 does not require support for geographical <code>TZ</code>,
915    and there is no convenient and efficient way to determine
916    the <abbr>UT</abbr> offset and time zone abbreviation of arbitrary
917    timestamps, particularly for timezones
918    that do not fit into the POSIX model.
919  </li>
920  <li>
921    <p>
922    The proleptic <code>TZ</code> string,
923    which is all that POSIX.1-2017 requires,
924    has a format that is hard to describe and is error-prone in practice.
925    Also, proleptic <code>TZ</code> strings cannot deal with daylight
926    saving time rules not based on the Gregorian calendar (as in
927    Morocco), or with situations where more than two time zone
928    abbreviations or <abbr>UT</abbr> offsets are used in an area.
929    </p>
930
931    <p>
932    A proleptic <code>TZ</code> string has the following format:
933    </p>
934
935    <p>
936    <var>stdoffset</var>[<var>dst</var>[<var>offset</var>][<code>,</code><var>date</var>[<code>/</code><var>time</var>]<code>,</code><var>date</var>[<code>/</code><var>time</var>]]]
937    </p>
938
939    <p>
940    where:
941    </p>
942
943    <dl>
944      <dt><var>std</var> and <var>dst</var></dt><dd>
945	are 3 or more characters specifying the standard
946	and daylight saving time (<abbr>DST</abbr>) zone abbreviations.
947	Starting with POSIX.1-2001, <var>std</var> and <var>dst</var>
948	may also be in a quoted form like '<code>&lt;+09&gt;</code>';
949	this allows "<code>+</code>" and "<code>-</code>" in the names.
950      </dd>
951      <dt><var>offset</var></dt><dd>
952	is of the form
953	'<code>[&plusmn;]<var>hh</var>:[<var>mm</var>[:<var>ss</var>]]</code>'
954	and specifies the offset west of <abbr>UT</abbr>.
955	'<var>hh</var>' may be a single digit;
956	0&le;<var>hh</var>&le;24.
957	The default <abbr>DST</abbr> offset is one hour ahead of
958	standard time.
959      </dd>
960      <dt><var>date</var>[<code>/</code><var>time</var>]<code>,</code><var>date</var>[<code>/</code><var>time</var>]</dt><dd>
961	specifies the beginning and end of <abbr>DST</abbr>.
962	If this is absent, the system supplies its own ruleset
963	for <abbr>DST</abbr>, typically	current <abbr>US</abbr>
964	<abbr>DST</abbr> rules.
965      </dd>
966      <dt><var>time</var></dt><dd>
967	takes the form
968	'<var>hh</var><code>:</code>[<var>mm</var>[<code>:</code><var>ss</var>]]'
969	and defaults to 02:00.
970	This is the same format as the offset, except that a
971	leading '<code>+</code>' or '<code>-</code>' is not allowed.
972      </dd>
973      <dt><var>date</var></dt><dd>
974	takes one of the following forms:
975	<dl>
976	  <dt>J<var>n</var> (1&le;<var>n</var>&le;365)</dt><dd>
977	    origin-1 day number not counting February 29
978	  </dd>
979	  <dt><var>n</var> (0&le;<var>n</var>&le;365)</dt><dd>
980	    origin-0 day number counting February 29 if present
981	  </dd>
982	  <dt><code>M</code><var>m</var><code>.</code><var>n</var><code>.</code><var>d</var>
983	    (0[Sunday]&le;<var>d</var>&le;6[Saturday], 1&le;<var>n</var>&le;5,
984	    1&le;<var>m</var>&le;12)</dt><dd>
985	    for the <var>d</var>th day of week <var>n</var> of
986	    month <var>m</var> of the year, where week 1 is the first
987	    week in which day <var>d</var> appears, and
988	    '<code>5</code>' stands for the last week in which
989	    day <var>d</var> appears (which may be either the 4th or
990	    5th week).
991	    Typically, this is the only useful form; the <var>n</var>
992	    and <code>J</code><var>n</var> forms are rarely used.
993	  </dd>
994	</dl>
995      </dd>
996    </dl>
997
998    <p>
999    Here is an example proleptic <code>TZ</code> string for New
1000    Zealand after 2007.
1001    It says that standard time (<abbr>NZST</abbr>) is 12 hours ahead
1002    of <abbr>UT</abbr>, and that daylight saving time
1003    (<abbr>NZDT</abbr>) is observed from September's last Sunday at
1004    02:00 until April's first Sunday at 03:00:
1005    </p>
1006
1007    <pre><code>TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'</code></pre>
1008
1009    <p>
1010    This proleptic <code>TZ</code> string is hard to remember, and
1011    mishandles some timestamps before 2008.
1012    With this package you can use a geographical <code>TZ</code> instead:
1013    </p>
1014
1015    <pre><code>TZ='Pacific/Auckland'</code></pre>
1016  </li>
1017</ul>
1018
1019<p>
1020POSIX.1-2017 also has the limitations of POSIX.1-2024,
1021discussed in the next section.
1022</p>
1023
1024<h3 id="POSIX.1-2024">POSIX.1-2024 properties and limitations</h3>
1025<p>
1026POSIX.1-2024 extends POSIX.1-2017 in the following significant ways:
1027</p>
1028<ul>
1029  <li>
1030    POSIX.1-2024 requires support for geographical <code>TZ</code>.
1031    Earlier POSIX editions require support only for proleptic <code>TZ</code>.
1032  </li>
1033  <li>
1034    POSIX.1-2024 requires <code>struct tm</code>
1035    to have a <abbr>UT</abbr> offset member <code>tm_gmtoff</code>
1036    and a time zone abbreviation member <code>tm_zone</code>.
1037    Earlier POSIX editions lack this requirement.
1038  </li>
1039  <li>
1040    DST transition times can range from &minus;167:59:59
1041    to 167:59:59 instead of merely from 00:00:00 to 24:59:59.
1042    This allows for proleptic TZ strings
1043    like <code>"&lt;-02&gt;2&lt;-01&gt;,M3.5.0/-1,M10.5.0/0"</code>
1044    where the transition time &minus;1:00 means 23:00 the previous day.
1045  </li>
1046</ul>
1047<p>
1048However POSIX.1-2024, like earlier POSIX editions, has some limitations:
1049<ul>
1050  <li>
1051    The <code>TZ</code> environment variable is process-global, which
1052    makes it hard to write efficient, thread-safe applications that
1053    need access to multiple timezones.
1054  </li>
1055  <li>
1056    In POSIX, there is no tamper-proof way for a process to learn the
1057    system's best idea of local (wall clock) time.
1058    This is important for applications that an administrator wants
1059    used only at certain times &ndash; without regard to whether the
1060    user has fiddled the
1061    <code>TZ</code> environment variable.
1062    While an administrator can "do everything in <abbr>UT</abbr>" to
1063    get around the problem, doing so is inconvenient and precludes
1064    handling daylight saving time shifts &ndash; as might be required to
1065    limit phone calls to off-peak hours.
1066  </li>
1067  <li>
1068    POSIX requires that <code>time_t</code> clock counts exclude leap
1069    seconds.
1070  </li>
1071  <li>
1072    POSIX does not define the <abbr>DST</abbr> transitions
1073    for <code>TZ</code> values like
1074    "<code>EST5EDT</code>".
1075    Traditionally the current <abbr>US</abbr> <abbr>DST</abbr> rules
1076    were used to interpret such values, but this meant that the
1077    <abbr>US</abbr> <abbr>DST</abbr> rules were compiled into each
1078    time conversion package, and when
1079    <abbr>US</abbr> time conversion rules changed (as in the United
1080    States in 1987 and again in 2007), all packages that
1081    interpreted <code>TZ</code> values had to be updated
1082    to ensure proper results.
1083  </li>
1084</ul>
1085
1086<h3 id="POSIX-extensions">Extensions to POSIX in the
1087<code><abbr>tz</abbr></code> code</h3>
1088<p>
1089  The <code><abbr>tz</abbr></code> code defines some properties
1090  left unspecified by POSIX, and attempts to support some
1091  extensions to POSIX.
1092</p>
1093
1094<ul>
1095  <li>
1096    The <code><abbr>tz</abbr></code> code attempts to support all the
1097    <code>time_t</code> implementations allowed by POSIX.
1098    The <code>time_t</code> type represents a nonnegative count of seconds
1099    since 1970-01-01 00:00:00 <abbr>UTC</abbr>, ignoring leap seconds.
1100    In practice, <code>time_t</code> is usually a signed 64- or 32-bit
1101    integer; 32-bit signed <code>time_t</code> values stop working after
1102    2038-01-19 03:14:07 <abbr>UTC</abbr>, so new implementations these
1103    days typically use a signed 64-bit integer.
1104    Unsigned 32-bit integers are used on one or two platforms, and 36-bit
1105    and 40-bit integers are also used occasionally.
1106    Although earlier POSIX versions allowed <code>time_t</code> to be a
1107    floating-point type, this was not supported by any practical system,
1108    and POSIX.1-2013+ and the <code><abbr>tz</abbr></code> code both
1109    require <code>time_t</code> to be an integer type.
1110  </li>
1111  <li>
1112    <p>
1113    If the <code>TZ</code> environment variable uses the geographical format,
1114    it is used in generating
1115    the name of a file from which time-related information is read.
1116    The file's format is <dfn><abbr>TZif</abbr></dfn>,
1117    a timezone information format that contains binary data; see
1118    <a href="https://datatracker.ietf.org/doc/html/8536">Internet
1119    <abbr>RFC</abbr> 8536</a>.
1120    The daylight saving time rules to be used for a
1121    particular timezone are encoded in the
1122    <abbr>TZif</abbr> file; the format of the file allows <abbr>US</abbr>,
1123    Australian, and other rules to be encoded, and
1124    allows for situations where more than two time zone
1125    abbreviations are used.
1126    </p>
1127    <p>
1128    When the <code><abbr>tz</abbr></code> code was developed in the 1980s,
1129    it was recognized that allowing the <code>TZ</code> environment
1130    variable to take on values such as '<code>America/New_York</code>'
1131    might cause "old" programs (that expect <code>TZ</code> to have a
1132    certain format) to operate incorrectly; consideration was given to using
1133    some other environment variable (for example, <code>TIMEZONE</code>)
1134    to hold the string used to generate the <abbr>TZif</abbr> file's name.
1135    In the end, however, it was decided to continue using
1136    <code>TZ</code>: it is widely used for time zone purposes;
1137    separately maintaining both <code>TZ</code>
1138    and <code>TIMEZONE</code> seemed a nuisance; and systems where
1139    "new" forms of <code>TZ</code> might cause problems can simply
1140    use legacy <code>TZ</code> values such as "<code>EST5EDT</code>" which
1141    can be used by "new" programs as well as by "old" programs that
1142    assume pre-POSIX <code>TZ</code> values.
1143    </p>
1144  </li>
1145  <li>
1146    Functions <code>tzalloc</code>, <code>tzfree</code>,
1147    <code>localtime_rz</code>, and <code>mktime_z</code> for
1148    more-efficient thread-safe applications that need to use multiple
1149    timezones.
1150    The <code>tzalloc</code> and <code>tzfree</code> functions
1151    allocate and free objects of type <code>timezone_t</code>,
1152    and <code>localtime_rz</code> and <code>mktime_z</code> are
1153    like <code>localtime_r</code> and <code>mktime</code> with an
1154    extra <code>timezone_t</code> argument.
1155    The functions were inspired by <a href="https://netbsd.org">NetBSD</a>.
1156  </li>
1157  <li>
1158    Negative <code>time_t</code> values are supported, on systems
1159    where <code>time_t</code> is signed.
1160  </li>
1161  <li>
1162    These functions can account for leap seconds;
1163    see <a href="#leapsec">Leap seconds</a> below.
1164  </li>
1165</ul>
1166
1167<h3 id="vestigial">POSIX features no longer needed</h3>
1168<p>
1169POSIX and <a href="https://en.wikipedia.org/wiki/ISO_C"><abbr>ISO</abbr> C</a>
1170define some <a href="https://en.wikipedia.org/wiki/API"><abbr
1171title="application programming interface">API</abbr>s</a> that are vestigial:
1172they are not needed, and are relics of a too-simple model that does
1173not suffice to handle many real-world timestamps.
1174Although the <code><abbr>tz</abbr></code> code supports these
1175vestigial <abbr>API</abbr>s for backwards compatibility, they should
1176be avoided in portable applications.
1177The vestigial <abbr>API</abbr>s are:
1178</p>
1179<ul>
1180  <li>
1181    The POSIX <code>tzname</code> variable does not suffice and is no
1182    longer needed.
1183    It is planned to be removed in a future edition of POSIX.
1184    To get a timestamp's time zone abbreviation, consult
1185    the <code>tm_zone</code> member if available; otherwise,
1186    use <code>strftime</code>'s <code>"%Z"</code> conversion
1187    specification.
1188  </li>
1189  <li>
1190    The POSIX <code>daylight</code> and <code>timezone</code>
1191    variables do not suffice and are no longer needed.
1192    They are planned to be removed in a future edition of POSIX.
1193    To get a timestamp's <abbr>UT</abbr> offset, consult
1194    the <code>tm_gmtoff</code> member if available; otherwise,
1195    subtract values returned by <code>localtime</code>
1196    and <code>gmtime</code> using the rules of the Gregorian calendar,
1197    or use <code>strftime</code>'s <code>"%z"</code> conversion
1198    specification if a string like <code>"+0900"</code> suffices.
1199  </li>
1200  <li>
1201    The <code>tm_isdst</code> member is almost never needed and most of
1202    its uses should be discouraged in favor of the abovementioned
1203    <abbr>API</abbr>s.
1204    Although it can still be used in arguments to
1205    <code>mktime</code> to disambiguate timestamps near
1206    a <abbr>DST</abbr> transition when the clock jumps back on
1207    platforms lacking <code>tm_gmtoff</code>, this
1208    disambiguation does not work when standard time itself jumps back,
1209    which can occur when a location changes to a time zone with a
1210    lesser <abbr>UT</abbr> offset.
1211  </li>
1212</ul>
1213
1214<h3 id="other-portability">Other portability notes</h3>
1215<ul>
1216  <li>
1217    The <a href="https://en.wikipedia.org/wiki/Version_7_Unix">7th Edition
1218    UNIX</a> <code>timezone</code> function is not present in this
1219    package; it is impossible to reliably map <code>timezone</code>'s
1220    arguments (a "minutes west of <abbr>GMT</abbr>" value and a
1221    "daylight saving time in effect" flag) to a time zone
1222    abbreviation, and we refuse to guess.
1223    Programs that in the past used the <code>timezone</code> function
1224    may now examine <code>localtime(&amp;clock)-&gt;tm_zone</code>
1225    (if <code>TM_ZONE</code> is defined) or
1226    <code>tzname[localtime(&amp;clock)-&gt;tm_isdst]</code>
1227    (if <code>HAVE_TZNAME</code> is nonzero) to learn the correct time
1228    zone abbreviation to use.
1229  </li>
1230  <li>
1231    The <a
1232    href="https://en.wikipedia.org/wiki/History_of_the_Berkeley_Software_Distribution#4.2BSD"><abbr>4.2BSD</abbr></a>
1233    <code>gettimeofday</code> function is not
1234    used in this package.
1235    This formerly let users obtain the current <abbr>UTC</abbr> offset
1236    and <abbr>DST</abbr> flag, but this functionality was removed in
1237    later versions of <abbr>BSD</abbr>.
1238  </li>
1239  <li>
1240    In <abbr>SVR2</abbr>, time conversion fails for near-minimum or
1241    near-maximum <code>time_t</code> values when doing conversions
1242    for places that do not use <abbr>UT</abbr>.
1243    This package takes care to do these conversions correctly.
1244    A comment in the source code tells how to get compatibly wrong
1245    results.
1246  </li>
1247  <li>
1248    The functions that are conditionally compiled
1249    if <code>STD_INSPIRED</code> is nonzero should, at this point, be
1250    looked on primarily as food for thought.
1251    They are not in any sense "standard compatible" &ndash; some are
1252    not, in fact, specified in <em>any</em> standard.
1253    They do, however, represent responses of various authors to
1254    standardization proposals.
1255  </li>
1256  <li>
1257    Other time conversion proposals, in particular those supported by the
1258    <a href="https://howardhinnant.github.io/date/tz.html">Time Zone
1259    Database Parser</a>, offer a wider selection of functions
1260    that provide capabilities beyond those provided here.
1261    The absence of such functions from this package is not meant to
1262    discourage the development, standardization, or use of such
1263    functions.
1264    Rather, their absence reflects the decision to make this package
1265    contain valid extensions to POSIX, to ensure its broad
1266    acceptability.
1267    If more powerful time conversion functions can be standardized, so
1268    much the better.
1269  </li>
1270</ul>
1271</section>
1272
1273<section>
1274  <h2 id="stability">Interface stability</h2>
1275<p>
1276The <code><abbr>tz</abbr></code> code and data supply the following interfaces:
1277</p>
1278
1279<ul>
1280  <li>
1281    A set of timezone names as per
1282      "<a href="#naming">Timezone identifiers</a>" above.
1283  </li>
1284  <li>
1285    Library functions described in "<a href="#functions">Time and date
1286      functions</a>" above.
1287  </li>
1288  <li>
1289    The programs <code>tzselect</code>, <code>zdump</code>,
1290    and <code>zic</code>, documented in their man pages.
1291  </li>
1292  <li>
1293    The format of <code>zic</code> input files, documented in
1294    the <code>zic</code> man page.
1295  </li>
1296  <li>
1297    The format of <code>zic</code> output files, documented in
1298    the <code>tzfile</code> man page.
1299  </li>
1300  <li>
1301    The format of zone table files, documented in <code>zone1970.tab</code>.
1302  </li>
1303  <li>
1304    The format of the country code file, documented in <code>iso3166.tab</code>.
1305  </li>
1306  <li>
1307    The version number of the code and data, as the first line of
1308    the text file '<code>version</code>' in each release.
1309  </li>
1310</ul>
1311
1312<p>
1313Interface changes in a release attempt to preserve compatibility with
1314recent releases.
1315For example, <code><abbr>tz</abbr></code> data files typically do not
1316rely on recently added <code>zic</code> features, so that users can
1317run older <code>zic</code> versions to process newer data files.
1318<a href="tz-link.html#download">Downloading
1319the <code><abbr>tz</abbr></code> database</a> describes how releases
1320are tagged and distributed.
1321</p>
1322
1323<p>
1324Interfaces not listed above are less stable.
1325For example, users should not rely on particular <abbr>UT</abbr>
1326offsets or abbreviations for timestamps, as data entries are often
1327based on guesswork and these guesses may be corrected or improved.
1328</p>
1329
1330<p>
1331Timezone boundaries are not part of the stable interface.
1332For example, even though the <samp>Asia/Bangkok</samp> timezone
1333currently includes Chang Mai, Hanoi, and Phnom Penh, this is not part
1334of the stable interface and the timezone can split at any time.
1335If a calendar application records a future event in some location other
1336than Bangkok by putting "<samp>Asia/Bangkok</samp>" in the event's record,
1337the application should be robust in the presence of timezone splits
1338between now and the future time.
1339</p>
1340</section>
1341
1342<section>
1343  <h2 id="leapsec">Leap seconds</h2>
1344<p>
1345Leap seconds were introduced in 1972 to accommodate the
1346difference between atomic time and the less regular rotation of the earth.
1347Unfortunately they have caused so many problems with civil
1348timekeeping that there are
1349<a href="https://www.bipm.org/en/cgpm-2022/resolution-4">plans
1350to discontinue them by 2035</a>.
1351Even if these plans come to fruition, a record of leap seconds will still be
1352needed to resolve timestamps from 1972 through 2035,
1353and there may also be a need to record whatever mechanism replaces them.
1354</p>
1355
1356<p>
1357The <code><abbr>tz</abbr></code> code and data can account for leap seconds,
1358thanks to code contributed by Bradley White.
1359However, the leap second support of this package is rarely used directly
1360because POSIX requires leap seconds to be excluded and many
1361software packages would mishandle leap seconds if they were present.
1362Instead, leap seconds are more commonly handled by occasionally adjusting
1363the operating system kernel clock as described in
1364<a href="tz-link.html#precision">Precision timekeeping</a>,
1365and this package by default installs a <samp>leapseconds</samp> file
1366commonly used by
1367<a href="https://www.ntp.org"><abbr title="Network Time Protocol">NTP</abbr></a>
1368software that adjusts the kernel clock.
1369However, kernel-clock twiddling approximates UTC only roughly,
1370and systems needing more precise UTC can use this package's leap
1371second support directly.
1372</p>
1373
1374<p>
1375The directly supported mechanism assumes that <code>time_t</code>
1376counts of seconds since the POSIX epoch normally include leap seconds,
1377as opposed to POSIX <code>time_t</code> counts which exclude leap seconds.
1378This modified timescale is converted to <abbr>UTC</abbr>
1379at the same point that time zone and <abbr>DST</abbr>
1380adjustments are applied &ndash;
1381namely, at calls to <code>localtime</code> and analogous functions &ndash;
1382and the process is driven by leap second information
1383stored in alternate versions of the <abbr>TZif</abbr> files.
1384Because a leap second adjustment may be needed even
1385if no time zone correction is desired,
1386calls to <code>gmtime</code>-like functions
1387also need to consult a <abbr>TZif</abbr> file,
1388conventionally named <samp><abbr>Etc/UTC</abbr></samp>
1389(<samp><abbr>GMT</abbr></samp> in previous versions),
1390to see whether leap second corrections are needed.
1391To convert an application's <code>time_t</code> timestamps to or from
1392POSIX <code>time_t</code> timestamps (for use when, say,
1393embedding or interpreting timestamps in portable
1394<a href="https://en.wikipedia.org/wiki/Tar_(computing)"><code>tar</code></a>
1395files),
1396the application can call the utility functions
1397<code>time2posix</code> and <code>posix2time</code>
1398included with this package.
1399</p>
1400
1401<p>
1402If the POSIX-compatible <abbr>TZif</abbr> file set is installed
1403in a directory whose basename is <samp>zoneinfo</samp>, the
1404leap-second-aware file set is by default installed in a separate
1405directory <samp>zoneinfo-leaps</samp>.
1406Although each process can have its own time zone by setting
1407its <code>TZ</code> environment variable, there is no support for some
1408processes being leap-second aware while other processes are
1409POSIX-compatible; the leap-second choice is system-wide.
1410So if you configure your kernel to count leap seconds, you should also
1411discard <samp>zoneinfo</samp> and rename <samp>zoneinfo-leaps</samp>
1412to <samp>zoneinfo</samp>.
1413Alternatively, you can install just one set of <abbr>TZif</abbr> files
1414in the first place; see the <code>REDO</code> variable in this package's
1415<a href="https://en.wikipedia.org/wiki/Makefile">makefile</a>.
1416</p>
1417</section>
1418
1419<section>
1420  <h2 id="calendar">Calendrical issues</h2>
1421<p>
1422Calendrical issues are a bit out of scope for a time zone database,
1423but they indicate the sort of problems that we would run into if we
1424extended the time zone database further into the past.
1425An excellent resource in this area is Edward M. Reingold
1426and Nachum Dershowitz, <cite><a
1427href="https://www.cambridge.org/fr/academic/subjects/computer-science/computing-general-interest/calendrical-calculations-ultimate-edition-4th-edition">Calendrical
1428Calculations: The Ultimate Edition</a></cite>, Cambridge University Press (2018).
1429Other information and sources are given in the file '<code>calendars</code>'
1430in the <code><abbr>tz</abbr></code> distribution.
1431They sometimes disagree.
1432</p>
1433</section>
1434
1435<section>
1436  <h2 id="planets">Time and time zones off Earth</h2>
1437<p>
1438The European Space Agency is <a
1439href='https://www.esa.int/Applications/Navigation/Telling_time_on_the_Moon'>considering</a>
1440the establishment of a reference timescale for the Moon, which has
1441days roughly equivalent to 29.5 Earth days, and where relativistic
1442effects cause clocks to tick slightly faster than on Earth.
1443Also, <abbr title="National Aeronautics and Space Administration">NASA</abbr>
1444has been <a
1445href='https://www.whitehouse.gov/wp-content/uploads/2024/04/Celestial-Time-Standardization-Policy.pdf'>ordered</a>
1446to consider the establishment of Coordinated Lunar Time (<abbr>LTC</abbr>).
1447It is not yet known whether the US and European efforts will result in
1448multiple timescales on the Moon.
1449</p>
1450
1451<p>
1452Some people's work schedules have used
1453<a href="https://en.wikipedia.org/wiki/Timekeeping_on_Mars">Mars time</a>.
1454Jet Propulsion Laboratory (JPL) coordinators kept Mars time on
1455and off during the
1456<a href="https://en.wikipedia.org/wiki/Mars_Pathfinder">Mars
1457Pathfinder</a> mission (1997).
1458Some of their family members also adapted to Mars time.
1459Dozens of special Mars watches were built for JPL workers who kept
1460Mars time during the
1461<a href="https://en.wikipedia.org/wiki/Mars_Exploration_Rover">Mars
1462Exploration Rovers (MER)</a> mission (2004&ndash;2018).
1463These timepieces looked like normal Seikos and Citizens but were adjusted
1464to use Mars seconds rather than terrestrial seconds, although
1465unfortunately the adjusted watches were unreliable and appear to have
1466had only limited use.
1467</p>
1468
1469<p>
1470A Mars solar day is called a "sol" and has a mean period equal to
1471about 24 hours 39 minutes 35.244 seconds in terrestrial time.
1472It is divided into a conventional 24-hour clock, so each Mars second
1473equals about 1.02749125 terrestrial seconds.
1474(One MER worker noted, "If I am working Mars hours, and Mars hours are
14752.5% more than Earth hours, shouldn't I get an extra 2.5% pay raise?")
1476</p>
1477
1478<p>
1479The <a href="https://en.wikipedia.org/wiki/Prime_meridian">prime
1480meridian</a> of Mars goes through the center of the crater
1481<a href="https://en.wikipedia.org/wiki/Airy-0">Airy-0</a>, named in
1482honor of the British astronomer who built the Greenwich telescope that
1483defines Earth's prime meridian.
1484Mean solar time on the Mars prime meridian is
1485called Mars Coordinated Time (<abbr>MTC</abbr>).
1486</p>
1487
1488<p>
1489Each landed mission on Mars has adopted a different reference for
1490solar timekeeping, so there is no real standard for Mars time zones.
1491For example, the MER mission defined two time zones "Local
1492Solar Time A" and "Local Solar Time B" for its two missions, each zone
1493designed so that its time equals local true solar time at
1494approximately the middle of the nominal mission.
1495The A and B zones differ enough so that an MER worker assigned to
1496the A zone might suffer "Mars lag" when switching to work in the B zone.
1497Such a "time zone" is not particularly suited for any application
1498other than the mission itself.
1499</p>
1500
1501<p>
1502Many calendars have been proposed for Mars, but none have achieved
1503wide acceptance.
1504Astronomers often use Mars Sol Date (<abbr>MSD</abbr>) which is a
1505sequential count of Mars solar days elapsed since about 1873-12-29
150612:00 <abbr>GMT</abbr>.
1507</p>
1508
1509<p>
1510In our solar system, Mars is the planet with time and calendar most
1511like Earth's.
1512On other planets, Sun-based time and calendars would work quite
1513differently.
1514For example, although Mercury's
1515<a href="https://en.wikipedia.org/wiki/Rotation_period">sidereal
1516rotation period</a> is 58.646 Earth days, Mercury revolves around the
1517Sun so rapidly that an observer on Mercury's equator would see a
1518sunrise only every 175.97 Earth days, i.e., a Mercury year is 0.5 of a
1519Mercury day.
1520Venus is more complicated, partly because its rotation is slightly
1521<a href="https://en.wikipedia.org/wiki/Retrograde_motion">retrograde</a>:
1522its year is 1.92 of its days.
1523Gas giants like Jupiter are trickier still, as their polar and
1524equatorial regions rotate at different rates, so that the length of a
1525day depends on latitude.
1526This effect is most pronounced on Neptune, where the day is about 12
1527hours at the poles and 18 hours at the equator.
1528</p>
1529
1530<p>
1531Although the <code><abbr>tz</abbr></code> database does not support
1532time on other planets, it is documented here in the hopes that support
1533will be added eventually.
1534</p>
1535
1536<p>
1537Sources for time on other planets:
1538</p>
1539
1540<ul>
1541  <li>
1542    Michael Allison and Robert Schmunk,
1543    "<a href="https://www.giss.nasa.gov/tools/mars24/help/notes.html">Technical
1544      Notes on Mars Solar Time as Adopted by the Mars24 Sunclock</a>"
1545    (2020-03-08).
1546  </li>
1547  <li>
1548    Zara Mirmalek,
1549    <em><a href="https://mitpress.mit.edu/books/making-time-mars">Making
1550	Time on Mars</a></em>, MIT Press (March 2020), ISBN 978-0262043854.
1551  </li>
1552  <li>
1553    Jia-Rui Chong,
1554    "<a href="https://www.latimes.com/archives/la-xpm-2004-jan-14-sci-marstime14-story.html">Workdays
1555    Fit for a Martian</a>", <cite>Los Angeles Times</cite>
1556    (2004-01-14), pp A1, A20&ndash;A21.
1557  </li>
1558  <li>
1559    Tom Chmielewski,
1560    "<a href="https://www.theatlantic.com/technology/archive/2015/02/jet-lag-is-worse-on-mars/386033/">Jet
1561    Lag Is Worse on Mars</a>", <cite>The Atlantic</cite> (2015-02-26)
1562  </li>
1563  <li>
1564    Matt Williams,
1565    "<a href="https://www.universetoday.com/37481/days-of-the-planets/">How
1566    long is a day on the other planets of the solar system?</a>"
1567    (2016-01-20).
1568  </li>
1569</ul>
1570</section>
1571
1572<footer>
1573  <hr>
1574  This file is in the public domain, so clarified as of 2009-05-17 by
1575  Arthur David Olson.
1576</footer>
1577</body>
1578</html>
1579