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→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° 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><+08>-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–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–1930, 551 CMT/BST for Calamarca Mean Time and Bolivian Summer Time 552 1890–1932, 553 DMT/IST for Dublin/Dunsink Mean Time and Irish Summer Time 554 1880–1916, 555 MMT/MST/MDST for Moscow 1880–1919, and 556 RMT/LST for Riga Mean Time and Latvian Summer time 1880–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–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&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 −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><-03>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–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><+09></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>[±]<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≤<var>hh</var>≤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≤<var>n</var>≤365)</dt><dd> 990 origin-1 day number not counting February 29 991 </dd> 992 <dt><var>n</var> (0≤<var>n</var>≤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]≤<var>d</var>≤6[Saturday], 1≤<var>n</var>≤5, 997 1≤<var>m</var>≤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 −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>"<-02>2<-01>,M3.5.0/-1,M10.5.0/0"</code> 1057 where the transition time −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 – 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 – 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(&clock)->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" – 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 – 1397namely, at calls to <code>localtime</code> and analogous functions – 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–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–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