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