diff options
Diffstat (limited to 'doc/rfc/rfc9636.txt')
-rw-r--r-- | doc/rfc/rfc9636.txt | 2372 |
1 files changed, 2372 insertions, 0 deletions
diff --git a/doc/rfc/rfc9636.txt b/doc/rfc/rfc9636.txt new file mode 100644 index 0000000..13a7a03 --- /dev/null +++ b/doc/rfc/rfc9636.txt @@ -0,0 +1,2372 @@ + + + + +Internet Engineering Task Force (IETF) A. Olson +Request for Comments: 9636 +Obsoletes: 8536 P. Eggert +Category: Standards Track UCLA +ISSN: 2070-1721 K. Murchison + Fastmail + October 2024 + + + The Time Zone Information Format (TZif) + +Abstract + + This document specifies the Time Zone Information Format (TZif) for + representing and exchanging time zone information, independent of any + particular service or protocol. Two media types for this format are + also defined. + + This document replaces and obsoletes RFC 8536. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9636. + +Copyright Notice + + Copyright (c) 2024 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + +Table of Contents + + 1. Introduction + 2. Conventions Used in This Document + 3. The Time Zone Information Format (TZif) + 3.1. TZif Header + 3.2. TZif Data Block + 3.3. TZif Footer + 3.3.1. All-Year Daylight Saving Time + 3.3.2. TZ String Extension + 4. Interoperability Considerations + 5. Internationalization Considerations + 6. Use with the Time Zone Data Distribution Service + 6.1. Truncating TZif Files + 6.2. Example TZDIST Request for TZif Data + 7. Security Considerations + 8. Privacy Considerations + 9. IANA Considerations + 9.1. application/tzif + 9.2. application/tzif-leap + 10. References + 10.1. Normative References + 10.2. Informative References + Appendix A. Common Interoperability Issues + Appendix B. Example TZif Files + B.1. Version 1 File Representing UTC (with Leap Seconds) + B.2. Version 2 File Representing Pacific/Honolulu + B.3. Truncated Version 2 File Representing Pacific/Johnston + B.4. Truncated Version 3 File Representing Asia/Jerusalem + B.5. Truncated Version 4 File Representing Europe/London + Appendix C. Changes from RFC 8536 + Acknowledgments + Authors' Addresses + +1. Introduction + + Time zone data typically consists of offsets from universal time + (UT), daylight saving transition rules, one or more local time + designations (acronyms or abbreviations), and optional leap-second + adjustments. One such format for conveying this information is + iCalendar [RFC5545]. It is a text-based format used by calendaring + and scheduling systems. + + This document specifies the widely deployed Time Zone Information + Format (TZif). It is a binary format used by most UNIX systems to + calculate local time. This format was introduced in the 1980s and + has evolved since then into multiple upward-compatible versions. + There is a wide variety of interoperable software capable of + generating and reading files in this format [tz-link]. + + This specification does not define the source of the data assembled + into a TZif file. One such source is the IANA-hosted time zone + database [RFC6557]. + + This document obsoletes [RFC8536], providing editorial improvements, + new details, and errata fixes while keeping full compatibility with + the interchange format of [RFC8536]. Additionally, a new version of + the format is defined. The changes from [RFC8536] are summarized in + Appendix C. + +2. Conventions Used in This Document + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + + The following terms are used in this document (see "Time zone and + daylight saving time data" [tz-link] for more detailed information + about civil timekeeping data and practice): + + Coordinated Universal Time (UTC): The basis for civil time since + 1960. It is approximately equal to mean solar time at the prime + meridian (0 degrees longitude). + + Daylight Saving Time (DST): The time according to a location's law + or practice, when adjusted as necessary from standard time. The + adjustment may be positive or negative, and the amount of + adjustment may vary depending on the date and time; the TZif + format even allows the adjustment to be zero, although this is not + common practice. + + International Atomic Time (TAI): The time standard based on atomic + clocks since 1972. It is equal to UTC but without leap-second + adjustments. + + Leap Second: A one-second adjustment to keep UTC close to mean solar + time at the prime meridian (see [ITU-R-TF.460]). Each inserted or + deleted leap second occurs at the end of a UTC month, that is, a + month using the Gregorian calendar and the UTC timescale. + + Leap-Second Correction (LEAPCORR): The value of "TAI - UTC - 10" for + timestamps after the first leap second, and zero for timestamps + before that. The expression "TAI - UTC - 10" comes from the fact + that TAI - UTC was defined to be 10 just prior to the first leap + second in 1972, so clocks with leap seconds have a zero LEAPCORR + before the first leap second. + + Local Time: Civil time for a particular location. Its offset from + universal time can depend on the date and time of day. + + POSIX Epoch: 1970-01-01 00:00:00 UTC, the basis for absolute + timestamps in this document. + + Standard Time: The time according to a location's law or practice, + unadjusted for daylight saving time. + + Time Change: A change to civil timekeeping practice. It occurs when + one or more of the following happen simultaneously: + + 1. a change in UT offset + + 2. a change in whether daylight saving time is in effect + + 3. a change in time zone abbreviation + + 4. a leap second (i.e., a change in LEAPCORR) + + Time Zone Data: The Time Zone Data Distribution Service (TZDIST) + [RFC7808] defines "Time zone data" as "data that defines a single + time zone, including an identifier, UTC offset values, DST rules, + and other information such as time zone abbreviations". The + interchange format defined in this document is one such form of + time zone data. + + Transition Time: The moment of occurrence of a time change that is + not a leap second. It is identified with a signed integer count + of UNIX leap time seconds since the POSIX epoch. + + Universal Time (UT): The basis of civil time. This is the principal + form of the mean solar time at the prime meridian (0 degrees + longitude) for timestamps before UTC was introduced in 1960 and is + UTC for timestamps thereafter. Although UT is sometimes called + "UTC" or "GMT" in other sources, this specification uses the term + "UT" to avoid confusion with UTC or with GMT. + + UNIX Time: The time as returned by the time() function provided by + the C programming language (see Section 3 of the "System + Interfaces" volume of [POSIX]). This is an integer number of + seconds since the POSIX epoch, not counting leap seconds. As an + extension to POSIX, negative values represent times before the + POSIX epoch, using UT. + + UNIX Leap Time: UNIX time plus all preceding leap-second + corrections. For example, if the first leap-second record in a + TZif file occurs at 1972-06-30 23:59:60 UTC, the UNIX leap time + for the timestamp 1972-07-01 00:00:00 UTC would be 78796801, one + greater than the UNIX time for the same timestamp. Similarly, if + the second leap-second record occurs at 1972-12-31 23:59:60 UTC, + it accounts for the first leap second, so the UNIX leap time of + 1972-12-31 23:59:60 UTC would be 94694401, and the UNIX leap time + of 1973-01-01 00:00:00 UTC would be 94694402. If a TZif file + specifies no leap-second records, UNIX leap time is equal to UNIX + time. + + Wall Time: Another name for local time; short for "wall-clock time". + +3. The Time Zone Information Format (TZif) + + The Time Zone Information Format begins with a fixed 44-octet version + 1 header (Section 3.1) containing a field that specifies the version + of the file's format. Readers designed for version N can read + version N+1 files without too much trouble; data specific to version + N+1 either appears after version N data so that earlier version + readers can easily ignore later version data they are not designed + for, or it appears as a minor extension to version N that version N + readers are likely to tolerate well. + + The version 1 header is followed by a variable-length version 1 data + block (Section 3.2) containing four-octet (32-bit) transition times + and leap-second occurrences. These 32-bit values are limited to + representing time changes from 1901-12-13 20:45:52 through 2038-01-19 + 03:14:07 UT, and the version 1 header and data block are present only + for backward compatibility with obsolescent readers, as discussed in + "Common Interoperability Issues" (Appendix A). + + Version 1 files terminate after the version 1 data block. Files from + versions 2 and higher extend the format by appending a second + 44-octet version 2+ header, a variable-length version 2+ data block + containing eight-octet (64-bit) transition times and leap-second + occurrences, and a variable-length footer (Section 3.3). These + 64-bit values can represent times approximately 292 billion years + into the past or future. + + NOTE: All multi-octet integer values MUST be stored in network octet + order format (high-order octet first, otherwise known as big-endian), + with all bits significant. Signed integer values MUST be represented + using two's complement. + + A TZif file is structured as follows: + + Version 1 Versions 2+ + +-------------+ +-------------+ + | Version 1 | | Version 1 | + | Header | | Header | + +-------------+ +-------------+ + | Version 1 | | Version 1 | + | Data Block | | Data Block | + +-------------+ +-------------+ + | Version 2+ | + | Header | + +-------------+ + | Version 2+ | + | Data Block | + +-------------+ + | Footer | + +-------------+ + + Figure 1: General Format of TZif Files + +3.1. TZif Header + + A TZif header is structured as follows (the lengths of multi-octet + fields are shown in parentheses): + + +---------------+---+ + | magic (4) |ver| + +---------------+---+---------------------------------------+ + | [unused - reserved for future use] (15) | + +---------------+---------------+---------------+-----------+ + | isutcnt (4) | isstdcnt (4) | leapcnt (4) | + +---------------+---------------+---------------+ + | timecnt (4) | typecnt (4) | charcnt (4) | + +---------------+---------------+---------------+ + + Figure 2: TZif Header + + The fields of the header are defined as follows: + + magic: The four-octet ASCII [RFC20] sequence "TZif" (0x54 0x5A 0x69 + 0x66), which identifies the file as utilizing the Time Zone + Information Format. + + ver(sion): An octet identifying the version of the file's format. + The value MUST be one of the following: + + * NUL (0x00) Version 1 - The file contains only the version 1 + header and data block. Version 1 files MUST NOT contain a + version 2+ header, data block, or footer. + + * '2' (0x32) Version 2 - The file MUST contain the version 1 + header and data block, a version 2+ header and data block, and + a footer. The TZ string in the footer (Section 3.3), if non- + empty, MUST strictly adhere to the requirements for the TZ + environment variable as defined in Section 8.3 of the "Base + Definitions" volume of [POSIX] and MUST encode the POSIX + portable character set as ASCII. The leap-second records MUST + NOT be truncated at the start (Section 6.1) and MUST NOT + contain an expiration time. + + * '3' (0x33) Version 3 - The file MUST conform to all version 2 + requirements, except that any TZ string in the footer + (Section 3.3) MAY use the TZ string extension described below + (Section 3.3.2). + + * '4' (0x34) Version 4 - The file MUST conform to all version 3 + requirements, except that the leap-second records MAY be + truncated at the start and MAY contain an expiration time. + + isutcnt: A four-octet unsigned integer specifying the number of UT/ + local indicators contained in the data block -- MUST either be + zero or equal to "typecnt". + + isstdcnt: A four-octet unsigned integer specifying the number of + standard/wall indicators contained in the data block -- MUST + either be zero or equal to "typecnt". + + leapcnt: A four-octet unsigned integer specifying the number of + leap-second records contained in the data block. + + timecnt: A four-octet unsigned integer specifying the number of + transition times contained in the data block. + + typecnt: A four-octet unsigned integer specifying the number of + local time type records contained in the data block -- MUST NOT be + zero. (Although local time type records convey no useful + information in files that have non-empty TZ strings but no + transitions, at least one such record is nevertheless required + because many TZif readers reject files that have zero time types.) + + charcnt: A four-octet unsigned integer specifying the total number + of octets used by the set of time zone designations contained in + the data block -- MUST NOT be zero. The count includes the + trailing NUL (0x00) octet at the end of the last time zone + designation. + + Although the version 1 and 2+ headers have the same format, magic + number, and version fields, their count fields may differ, because + the version 1 data can be a subset of the version 2+ data. + +3.2. TZif Data Block + + A TZif data block consists of seven variable-length elements, each of + which is a series of items. The number of items in each series is + determined by the corresponding count field in the header. The total + length of each element is calculated by multiplying the number of + items by the size of each item. Therefore, implementations that do + not wish to parse or use the version 1 data block can calculate its + total length and skip directly to the header of the version 2+ data + block. + + In the version 1 data block, time values are 32 bits (TIME_SIZE = 4 + octets). In the version 2+ data block, present only in version 2 and + higher files, time values are 64 bits (TIME_SIZE = 8 octets). + + The data block is structured as follows (the lengths of multi-octet + fields are shown in parentheses): + + +---------------------------------------------------------+ + | transition times (timecnt x TIME_SIZE) | + +---------------------------------------------------------+ + | transition types (timecnt) | + +---------------------------------------------------------+ + | local time type records (typecnt x 6) | + +---------------------------------------------------------+ + | time zone designations (charcnt) | + +---------------------------------------------------------+ + | leap-second records (leapcnt x (TIME_SIZE + 4)) | + +---------------------------------------------------------+ + | standard/wall indicators (isstdcnt) | + +---------------------------------------------------------+ + | UT/local indicators (isutcnt) | + +---------------------------------------------------------+ + + Figure 3: TZif Data Block + + The elements of the data block are defined as follows: + + transition times: A series of four- or eight-octet UNIX leap time + values sorted in strictly ascending order. Each value is used as + a transition time at which the rules for computing local time may + change. The number of time values is specified by the "timecnt" + field in the header. Each time value SHOULD be at least -2^59. + (-2^59 is the greatest negated power of 2 that predates the Big + Bang, and avoiding earlier timestamps works around known TZif + reader bugs relating to outlandishly negative timestamps.) + + transition types: A series of one-octet unsigned integers specifying + the type of local time of the corresponding transition time. + These values serve as zero-based indices into the array of local + time type records. The number of type indices is specified by the + "timecnt" field in the header. Each type index MUST be in the + range [0, "typecnt" - 1]. + + local time type records: A series of six-octet records specifying a + local time type. The number of records is specified by the + "typecnt" field in the header. Each record has the following + format (the lengths of multi-octet fields are shown in + parentheses): + + +---------------+---+---+ + | utoff (4) |dst|idx| + +---------------+---+---+ + + utoff: A four-octet signed integer specifying the number of + seconds to be added to UT in order to determine local time. + The value MUST NOT be -2^31 and SHOULD be in the range [-89999, + 93599] (i.e., its value SHOULD be more than -25 hours and less + than 26 hours). Avoiding -2^31 allows 32-bit clients to negate + the value without overflow. Restricting it to [-89999, 93599] + allows easy support by implementations that already support the + POSIX-required range [-24:59:59, 25:59:59]. + + (is)dst: A one-octet value indicating whether local time should + be considered Daylight Saving Time (DST). The value MUST be 0 + or 1. A value of one (1) indicates that this type of time is + DST. A value of zero (0) indicates that this time type is + standard time. + + (desig)idx: A one-octet unsigned integer specifying a zero-based + index into the series of time zone designation octets, thereby + selecting a particular designation string. Each index MUST be + in the range [0, "charcnt" - 1]; it designates the + NUL-terminated string of octets starting at position "idx" in + the time zone designations. (This string MAY be empty.) A NUL + octet MUST exist in the time zone designations at or after + position "idx". If the designation string is "-00", the time + type is a placeholder indicating that local time is + unspecified. + + time zone designations: A series of octets constituting an array of + NUL-terminated (0x00) time zone designation strings. The total + number of octets is specified by the "charcnt" field in the + header. Two designations MAY overlap if one is a suffix of the + other. The character encoding of time zone designation strings is + not specified; however, see Section 4 of this document. + + leap-second records: A series of eight- or twelve-octet records + specifying the corrections that need to be applied to UTC in order + to determine TAI, also known as the leap-second table. The + records are sorted by the occurrence time in strictly ascending + order. The number of records is specified by the "leapcnt" field + in the header. Each record has one of the following structures + (the lengths of multi-octet fields are shown in parentheses): + + Version 1 Data Block: + +---------------+---------------+ + | occur (4) | corr (4) | + +---------------+---------------+ + + version 2+ Data Block: + +---------------+---------------+---------------+ + | occur (8) | corr (4) | + +---------------+---------------+---------------+ + + occur(rence): A four- or eight-octet UNIX leap time value + specifying the time at which a leap-second correction occurs or + at which the leap-second table expires. The first value, if + present, MUST be non-negative, and each leap second MUST occur + at the end of a UTC month. + + corr(ection): A four-octet signed integer specifying the value of + LEAPCORR on or after the occurrence. If "leapcnt" is zero, + LEAPCORR is zero for all timestamps. If "leapcnt" is nonzero, + for timestamps before the first occurrence time, LEAPCORR is + zero if the first correction is one (1) or minus one (-1) and + is unspecified otherwise (which can happen only in files + truncated at the start (Section 6.1)). + + The first leap second is a positive leap second if and only if + its correction is positive. Each correction after the first + MUST differ from the previous correction by either one (1) for + a positive leap second or minus one (-1) for a negative leap + second, except that in version 4 files with two or more leap- + second records, the correction value of the last two records + MAY be the same, with the occurrence of last record indicating + the expiration time of the leap-second table. + + The leap-second table expiration time is the time at which the + table no longer records the presence or absence of future leap- + second corrections, and post-expiration timestamps cannot be + accurately calculated. For example, a leap-second table + published in January, which predicts the presence or absence of + a leap second at June's end, might expire in mid-December + because it is not known when the next leap second will occur. + + If leap seconds become permanently discontinued, as requested + by the General Conference on Weights and Measures + [CGPM-2022-R4], leap-second tables published after the + discontinuation time SHOULD NOT expire, since they will not be + updated in the foreseeable future. + + standard/wall indicators: A series of one-octet values indicating + whether the transition times associated with local time types were + specified as standard time or wall-clock time. Each value MUST be + 0 or 1. A value of one (1) indicates standard time. The value + MUST be set to one (1) if the corresponding UT/local indicator is + set to one (1). A value of zero (0) indicates wall time. The + number of values is specified by the "isstdcnt" field in the + header. If "isstdcnt" is zero (0), all transition times + associated with local time types are assumed to be specified as + wall time. + + UT/local indicators: A series of one-octet values indicating whether + the transition times associated with local time types were + specified as UT or local time. Each value MUST be 0 or 1. A + value of one (1) indicates UT, and the corresponding standard/wall + indicator MUST also be set to one (1). A value of zero (0) + indicates local time. The number of values is specified by the + "isutcnt" field in the header. If "isutcnt" is zero (0), all + transition times associated with local time types are assumed to + be specified as local time. + + The type corresponding to a transition time specifies local time for + timestamps starting at the given transition time and continuing up + to, but not including, the next transition time. Local time for + timestamps before the first transition is specified by the first time + type (time type 0). Local time for timestamps on or after the last + transition is specified by the TZ string in the footer (Section 3.3) + if present and non-empty; otherwise, it is unspecified. If there are + no transitions, local time for all timestamps is specified by the TZ + string in the footer if present and non-empty; otherwise, it is + specified by time type 0. A time type with a designation string of + "-00" represents an unspecified local time. + + A given pair of standard/wall and UT/local indicators is used to + designate whether the corresponding transition time was specified as + UT, standard time, or wall-clock time. There are only three + combinations of the two indicators, given that the standard/wall + value MUST be one (1) if the UT/local value is one (1). This + information can be useful if the transition times in a TZif file need + to be transformed into transitions appropriate for another time zone + (e.g., when calculating transition times for a simple POSIX-like TZ + string such as "AKST9AKDT"). + + In order to eliminate unused space in a TZif file, every nonzero + local time type index SHOULD appear at least once in the transition + type array. Likewise, every octet in the time zone designations + array SHOULD be used by at least one time type record. + +3.3. TZif Footer + + The TZif footer is structured as follows (the lengths of multi-octet + fields are shown in parentheses): + + +---+--------------------+---+ + | NL| TZ string (0...) |NL | + +---+--------------------+---+ + + Figure 4: TZif Footer + + The elements of the footer are defined as follows: + + NL: An ASCII new line character (0x0A). + + TZ string: A rule for computing local time changes after the last + transition time stored in the version 2+ data block. The string + is either empty or uses the expanded format of the "TZ" + environment variable as defined in Section 8.3 of the "Base + Definitions" volume of [POSIX] with ASCII encoding, possibly + utilizing the extension described below (Section 3.3.2) in version + 3 and higher files. If the string is empty, the corresponding + information is not available. If the string is non-empty and one + or more transitions appear in the version 2+ data, the string MUST + be consistent with the last version 2+ transition. In other + words, evaluating the TZ string at the time of the last transition + should yield the same time type as was specified in the last + transition. The string MUST NOT contain NUL octets or be + NUL-terminated, and it SHOULD NOT begin with the ":" (colon) + character. + + The TZif footer is present only in version 2 and higher files, as the + obsolescent version 1 format was designed before the need for a + footer was apparent. + +3.3.1. All-Year Daylight Saving Time + + DST is considered to be in effect all year if its UT offset is less + than (i.e., west of) that of standard time, and it starts January 1 + at 00:00 and ends December 31 at 24:00 minus the difference between + standard and daylight saving time, leaving no room for standard time + in the calendar. [POSIX] implies but does not explicitly state this, + so it is spelled out here for clarity. + + Example: XXX3EDT4,0/0,J365/23 + This represents a time zone that is perpetually 4 hours west of UT + and is abbreviated "EDT". The "XXX" is ignored. + +3.3.2. TZ String Extension + + The TZ string in a version 3 or higher TZif file MAY use the + following extension to POSIX TZ strings. This extension is described + using the terminology of Section 8.3 of the "Base Definitions" volume + of [POSIX]. + + The hours part of the transition times may be signed and range from + -167 through 167 (-167 <= hh <= 167) instead of the POSIX-required + unsigned values from 0 through 24. + + Example: <-03>3<-02>,M3.5.0/-2,M10.5.0/-1 + This represents a time zone that observes daylight saving time + from 22:00 on the day before March's last Sunday until 23:00 on + the day before October's last Sunday. Standard time is 3 hours + west of UT and is abbreviated "-03"; daylight saving time is 2 + hours west of UT and is abbreviated "-02". + + A TZif file that uses the above extension MUST be designated as + version 3 (or higher), even if a future version of POSIX adopts this + extension. + +4. Interoperability Considerations + + The following practices help ensure the interoperability of TZif + applications. + + * Version 1 files are considered a legacy format and SHOULD NOT be + generated, as they do not support transition times after the year + 2038. + + * Readers that understand only version 1 MUST ignore any data that + extends beyond the calculated end of the version 1 data block. + + * Other than version 1, writers SHOULD generate the lowest version + number needed by a file's data. This helps interoperability with + older readers. For example, a writer SHOULD generate a version 4 + file only if its leap-second table either expires or is truncated + at the start. Likewise, a writer not generating a version 4 file + SHOULD generate a version 3 file only if the TZ string extension + is necessary to accurately model transition times. + + * To save space, writers of version 2+ files MAY output a + placeholder version 1 data block with all counts zero except that + "typecnt" and "charcnt" are both one (1). If this is done, + obsolescent version-1-only readers MUST interpret these files as + lacking time changes and time zone abbreviations. + + * Unless the version 1 data block is a placeholder, the sequence of + timestamps defined by the version 1 header and data block SHOULD + be a contiguous sub-sequence of the timestamps defined by the + version 2+ header and data block and by the footer. This + guideline helps obsolescent version 1 readers agree with current + readers about timestamps within the contiguous sub-sequence. + + * When a TZif file contains a leap-second table expiration time, + TZif readers SHOULD either refuse to process post-expiration + timestamps or process them as if the expiration time did not exist + (possibly with an error indication). This lessens disagreement + among implementations when processing far-future timestamps that + cannot yet be handled exactly. + + * Time zone designations MUST consist of at least three (3) and no + more than six (6) ASCII characters from the set of alphanumerics, + "-", and "+". This is compatible with POSIX requirements for time + zone abbreviations. + + * A reader that encounters a time zone designation containing bytes + other than ASCII alphanumerics, "-", and "+" SHOULD act if the + designation instead contained a signed numeric string derived from + the UT offset, for example, "-10" and "+0530" to indicate 10 hours + west and 5.5 hours east of Greenwich, respectively. + + * When reading a version 2 or higher file, readers SHOULD ignore the + version 1 header and data block except for the purpose of skipping + over them. This improves compatibility among readers of non- + conforming files where version 2+ data is not upward compatible + with version 1. + + * Readers SHOULD calculate the total lengths of the headers and data + blocks and check that they all fit within the actual file size, as + part of a validity check for the file. + + * When a TZif file is used in a MIME message entity, it SHOULD be + indicated by one of the following media types: + + - "application/tzif-leap" (Section 9.2) to indicate that leap- + second records are included in the TZif data as necessary (none + are necessary if the file is truncated to a range that precedes + the first leap second). + + - "application/tzif" (Section 9.1) to indicate that leap-second + records are not included in the TZif data; "leapcnt" in the + header(s) MUST be zero (0). + + * Common interoperability issues and possible workarounds are + described in Appendix A. + +5. Internationalization Considerations + + TZif time zone designations contain only ASCII alphanumerics, "-", + and "+". Commonly used designations include numeric strings like + "-10" and "+0530" for UT offsets and English language abbreviations + like "CEST" for Central European Summer Time and "GMT" for Greenwich + Mean Time. It is the TZif reader's responsibility to substitute + different abbreviations when needed for internationalization, such as + substituting "HNC" (l'heure normale du Centre) for "CST" (Central + Standard Time) in French-speaking regions. This substitution can be + problematic, as abbreviations can be ambiguous; for example, "CST" + commonly stands for China Standard Time and Cuba Standard Time as + well as Central Standard Time. One approach for addressing this + issue can be found in the time zone charts of the Unicode Common + Locale Data Repository (CLDR) Project [CLDR]. + + Although the original TZif design allowed for any nonzero octets in + time zone designations, and it was common practice until the mid- + 1990s for designations to contain ASCII spaces, designations are now + limited to ASCII alphanumerics, "-", and "+" to avoid confusion and + to encourage portability to a wide variety of locales. + +6. Use with the Time Zone Data Distribution Service + + The Time Zone Data Distribution Service (TZDIST) [RFC7808] is a + service that allows reliable, secure, and fast delivery of time zone + data and leap-second rules to client systems such as calendaring and + scheduling applications or operating systems. + + A TZDIST service MAY supply time zone data to clients in the Time + Zone Information Format. Such a service MUST indicate that it + supports this format by including the media type "application/tzif" + (Section 9.1) in its "capabilities" response (Section 5.1 of + [RFC7808]). A TZDIST service MAY also include the media type + "application/tzif-leap" (Section 9.2) in its "capabilities" response + if it is able to generate TZif files containing leap-second records. + A TZDIST service MUST NOT advertise the "application/tzif-leap" media + type without also advertising "application/tzif". + + TZDIST clients MUST use the HTTP "Accept" header field ([RFC9110], + Section 12.5.1) to indicate their preference to receive data in the + "application/tzif" and/or "application/tzif-leap" formats. + +6.1. Truncating TZif Files + + As described in Section 3.9 of [RFC7808], a TZDIST service MAY + truncate time zone transition data. A truncated TZif file is valid + from its first and up to, but not including, its last version 2+ + transition time, if present. + + When truncating the start of a TZif file, the service MUST supply in + the version 2+ data a first transition time that is the start point + of the truncation range. As with untruncated TZif files, time type 0 + indicates local time immediately before the start point, and the time + type of the first transition indicates local time thereafter. Time + type 0 MUST be a placeholder indicating that local time is + unspecified, so that the reader is unambiguously informed of + truncation at the start. + + When truncating the start of a TZif file containing leap-second + records, the service MUST keep all leap-second records governing + timestamps within the truncation range, even if the first such record + precedes the start point of the truncation range. If the truncated + leap-second table is non-empty, its first record MUST have a positive + correction if and only if it represents a positive leap second. + + When truncating the end of a TZif file, the service MUST supply in + the version 2+ data a last transition time that is the end point of + the truncation range and MUST supply an empty TZ string. As with + untruncated TZif files with empty TZ strings, a truncated TZif file + does not indicate local time after the last transition. To this end, + the time type of the last transition MUST be a placeholder indicating + that local time is unspecified. + + All represented information that falls inside the truncation range + MUST be the same as that represented by a corresponding untruncated + TZif file. + + TZDIST clients SHOULD NOT use a truncated TZif file (as described + above) to interpret timestamps outside the truncation time range. + +6.2. Example TZDIST Request for TZif Data + + In this example, the client checks the server for the available + formats and then requests that the time zone with a specific time + zone identifier be returned in Time Zone Information Format. + + This example presumes that the time zone context path has been + discovered (see [RFC7808], Section 4.2.1) to be "/tzdist". + + >> Request << + + GET /tzdist/capabilities HTTP/1.1 + Host: tz.example.com + + >> Response << + + HTTP/1.1 200 OK + Date: Fri, 01 Jun 2018 14:52:23 GMT + Content-Type: application/json + Content-Length: xxxx + + { + "version": 1, + + "info": { + "primary-source": "IANA:2018e", + "formats": [ + "text/calendar", + "application/tzif", + "application/tzif-leap" + ], + ... + }, + ... + } + + + >> Request << + + GET /tzdist/zones/America%2FNew_York HTTP/1.1 + Host: tz.example.com + Accept: application/tzif + + >> Response << + + HTTP/1.1 200 OK + Date: Fri, 01 Jun 2018 14:52:24 GMT + Content-Type: application/tzif + Content-Length: xxxx + ETag: "123456789-000-111" + + TZif2...[binary data without leap-second records]... + EST5EDT,M3.2.0,M11.1.0 + +7. Security Considerations + + The Time Zone Information Format contains no executable code, and it + does not define any extensible areas that could be used to store such + code. + + TZif contains counted arrays of data elements. All counts should be + checked when processing TZif objects, to guard against references + past the end of the object. + + TZif provides no confidentiality or integrity protection. Time zone + information is normally public and does not call for confidentiality + protection. Since time zone information is used in many critical + applications, integrity protection may be required and must be + provided externally. + + As discussed in Section 8 of [RFC7808], transmission of time zone + data over an insecure communication channel could result in tampered + data, harming calendaring and scheduling operations. As such, TZif + data transmitted over a public communications channel MUST be + protected with a security layer such as that provided by Transport + Layer Security (TLS) [RFC8446]. + +8. Privacy Considerations + + The Time Zone Information Format contains publicly available data, + and it does not define any extensible areas that could be used to + store private data. + + As discussed in Section 9 of [RFC7808], transmission of time zone + data over an insecure communications channel could leak the past, + current, or future location of a device or user. As such, TZif data + transmitted over a public communications channel MUST be protected + with a confidentiality layer such as that provided by Transport Layer + Security (TLS) [RFC8446]. + +9. IANA Considerations + + IANA has updated the "Media Types" registry + (https://www.iana.org/assignments/media-types) as follows. + + This document defines two media types [RFC6838] for the exchange of + data utilizing the Time Zone Information Format. + +9.1. application/tzif + + Type name: application + + Subtype name: tzif + + Required parameters: N/A + + Optional parameters: N/A + + Encoding considerations: binary + + Security considerations: See Section 7 of RFC 9636. + + Interoperability considerations: See Section 4 of RFC 9636. + + Published specification: RFC 9636. + + Applications that use this media type: This media type is designed + for widespread use by applications that need to use or exchange + time zone information relative to UNIX time, such as the Time Zone + Information Compiler (zic) [ZIC] and the GNU C Library [GNU-C]. + The Time Zone Distribution Service [RFC7808] can directly use this + media type. + + Fragment identifier considerations: N/A + + Additional information: + + Magic number(s): The first 4 octets are 0x54, 0x5A, 0x69, 0x66 + File extensions(s): N/A + Macintosh file type code(s): N/A + + Person & email address to contact for further information: Time Zone + Database mailing list <tz@iana.org> + + Intended usage: COMMON + + Restrictions on usage: N/A + + Author: See the "Authors' Addresses" section of RFC 9636. + + Change controller: IETF + +9.2. application/tzif-leap + + Type name: application + + Subtype name: tzif-leap + + Required parameters: none + + Optional parameters: none + + Encoding considerations: binary + + Security considerations: See Section 7 of RFC 9636. + + Interoperability considerations: See Section 4 of RFC 9636. + + Published specification: RFC 9636. + + Applications that use this media type: This media type is designed + for widespread use by applications that need to use or exchange + time zone information relative to UNIX leap time, such as the Time + Zone Information Compiler (zic) [ZIC] and the GNU C Library + [GNU-C]. The Time Zone Distribution Service [RFC7808] can + directly use this media type. + + Fragment identifier considerations: N/A + + Additional information: + + Magic number(s): The first 4 octets are 0x54, 0x5A, 0x69, 0x66 + File extensions(s): N/A + Macintosh file type code(s): N/A + + Person & email address to contact for further information: Time Zone + Database mailing list <tz@iana.org> + + Intended usage: COMMON + + Restrictions on usage: N/A + + Author: See the "Authors' Addresses" section of RFC 9636. + + Change controller: IETF + +10. References + +10.1. Normative References + + [GNU-C] Free Software Foundation, "The GNU C Library", + <https://www.gnu.org/software/libc/>. + + [ITU-R-TF.460] + International Telecommunication Union, "Standard-frequency + and time-signal emissions", ITU-R Recommendation TF.460, + February 2002, <https://www.itu.int/rec/R-REC-TF.460/en>. + + [POSIX] IEEE, "IEEE Standard for Information Technology--Portable + Operating System Interface (POSIX(TM)) Base + Specifications, Issue 7", POSIX.1-2017, IEEE + Std 1003.1-2017, DOI 10.1109/IEEESTD.2018.8277153, January + 2018, <https://pubs.opengroup.org/onlinepubs/9699919799/>. + + [RFC20] Cerf, V., "ASCII format for network interchange", STD 80, + RFC 20, DOI 10.17487/RFC0020, October 1969, + <https://www.rfc-editor.org/info/rfc20>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC6838] Freed, N., Klensin, J., and T. Hansen, "Media Type + Specifications and Registration Procedures", BCP 13, + RFC 6838, DOI 10.17487/RFC6838, January 2013, + <https://www.rfc-editor.org/info/rfc6838>. + + [RFC7808] Douglass, M. and C. Daboo, "Time Zone Data Distribution + Service", RFC 7808, DOI 10.17487/RFC7808, March 2016, + <https://www.rfc-editor.org/info/rfc7808>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC9110] Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, + Ed., "HTTP Semantics", STD 97, RFC 9110, + DOI 10.17487/RFC9110, June 2022, + <https://www.rfc-editor.org/info/rfc9110>. + + [ZIC] Kerrisk, M., "zic(8) - Linux manual page", + <http://man7.org/linux/man-pages/man8/zic.8.html>. + +10.2. Informative References + + [CGPM-2022-R4] + General Conference on Weights and Measures, "Resolution 4 + of the 27th CGPM (2022)", DOI 10.59161/CGPM2022RES4E, + November 2022, + <https://www.bipm.org/en/cgpm-2022/resolution-4>. + + [CLDR] Unicode, Inc., "Unicode CLDR Project", + <https://cldr.unicode.org/>. + + [EGGERT-TZ] + "History for tz", commit b5318b5, June 2024, + <https://github.com/eggert/tz/commits/main/tzfile.5>. + + [Err6426] RFC Errata, "Erratum ID 6426", RFC 8536, + <https://www.rfc-editor.org/errata/eid6426>. + + [Err6435] RFC Errata, "Erratum ID 6435", RFC 8536, + <https://www.rfc-editor.org/errata/eid6435>. + + [Err6757] RFC Errata, "Erratum ID 6757", RFC 8536, + <https://www.rfc-editor.org/errata/eid6757>. + + [Err7681] RFC Errata, "Erratum ID 7681", RFC 8536, + <https://www.rfc-editor.org/errata/eid7681>. + + [RFC5545] Desruisseaux, B., Ed., "Internet Calendaring and + Scheduling Core Object Specification (iCalendar)", + RFC 5545, DOI 10.17487/RFC5545, September 2009, + <https://www.rfc-editor.org/info/rfc5545>. + + [RFC6557] Lear, E. and P. Eggert, "Procedures for Maintaining the + Time Zone Database", BCP 175, RFC 6557, + DOI 10.17487/RFC6557, February 2012, + <https://www.rfc-editor.org/info/rfc6557>. + + [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol + Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, + <https://www.rfc-editor.org/info/rfc8446>. + + [RFC8536] Olson, A., Eggert, P., and K. Murchison, "The Time Zone + Information Format (TZif)", RFC 8536, + DOI 10.17487/RFC8536, February 2019, + <https://www.rfc-editor.org/info/rfc8536>. + + [tz-link] Eggert, P. and A. Olson, "Time zone and daylight saving + time data", + <https://www.iana.org/time-zones/repository/tz-link.html>. + +Appendix A. Common Interoperability Issues + + This section documents common problems in implementing this + specification. Most of these are problems in generating TZif files + for use by readers conforming to predecessors of this specification + [EGGERT-TZ]. The goals of this section are to help: + + 1. TZif writers output files that avoid common pitfalls in older or + buggy TZif readers, + + 2. TZif readers avoid common pitfalls when reading files generated + by future TZif writers, and + + 3. any future specification authors see what sort of problems arise + when the TZif format is changed. + + When new versions of the TZif format have been defined, a design goal + has been that a reader can successfully use a TZif file even if the + file is of a later TZif version than what the reader was designed + for. When complete compatibility was not achieved, an attempt was + made to limit glitches to rarely used timestamps and allow simple + partial workarounds in writers designed to generate newer-version + data useful even for older-version readers. This section attempts to + document these compatibility issues and workarounds as well as other + common bugs in readers. + + Interoperability problems with TZif include the following: + + * Some readers examine only version 1 data. As a partial + workaround, a writer can output as much version 1 data as + possible. However, a reader should ignore version 1 data and use + version 2+ data, even if the reader's timestamps have only 32 + bits. + + * Some readers designed for version 2 might mishandle timestamps + after a version 3 or higher file's last transition, because they + cannot parse extensions to POSIX in the TZ-like string. As a + partial workaround, a writer can output more transitions than + necessary, so that only far-future timestamps are mishandled by + version 2 readers. + + * Some readers designed for version 2 do not support permanent + daylight saving time with transitions after 24:00 -- e.g., a TZ + string "EST5EDT,0/0,J365/25" denoting permanent Eastern Daylight + Time (-04). As a workaround, a writer can substitute standard + time for two time zones east, e.g., "XXX3EDT4,0/0,J365/23" for a + time zone with a never-used standard time (XXX, -03) and negative + daylight saving time (EDT, -04) all year. Alternatively, as a + partial workaround, a writer can substitute standard time for the + next time zone east -- e.g., "AST4" for permanent Atlantic + Standard Time (-04). + + * Some readers designed for version 2 or 3 and that require strict + conformance to [RFC8536] reject version 4 files whose leap-second + tables are truncated at the start or end in expiration times. + + * Some readers ignore the footer and instead predict future + timestamps from the time type of the last transition. As a + partial workaround, a writer can output more transitions than + necessary. + + * Some readers do not use time type 0 for timestamps before the + first transition, in that they infer a time type using a heuristic + that does not always select time type 0. As a partial workaround, + a writer can output a placeholder (no-op) first transition at an + early time. + + * Some readers mishandle timestamps before the first transition that + has a timestamp that is not less than -2^31. Readers that support + only 32-bit timestamps are likely to be more prone to this + problem, for example, when they process 64-bit transitions, only + some of which are representable in 32 bits. As a partial + workaround, a writer can output a placeholder transition at + timestamp -2^31. + + * Some readers mishandle a transition if its timestamp has the + minimum possible signed 64-bit value. Timestamps less than -2^59 + are not recommended. + + * Some readers mishandle POSIX-style TZ strings that contain "<" or + ">". As a partial workaround, a writer can avoid using "<" or ">" + for time zone abbreviations containing only alphabetic characters. + + * Many readers mishandle time zone abbreviations that contain non- + ASCII characters. These characters are not recommended. + + * Some readers may mishandle time zone abbreviations that contain + fewer than 3 or more than 6 characters or that contain ASCII + characters other than alphanumerics, "-", and "+". These + abbreviations are not recommended. + + * This specification does not dictate how readers should deal with + timestamps when local time is unspecified. Common practice is for + readers to report UT with designation string "-00". A reader + could return an error indication instead. + + * Some readers mishandle TZif files that specify daylight saving + time UT offsets that are less than the UT offsets for the + corresponding standard time. These readers do not support + locations like Ireland, which uses the equivalent of the POSIX TZ + string "IST-1GMT0,M10.5.0,M3.5.0/1", observing standard time (IST, + +01) in summer and daylight saving time (GMT, +00) in winter. As + a partial workaround, a writer can output data for the equivalent + of the POSIX TZ string "GMT0IST,M3.5.0/1,M10.5.0", thus swapping + standard and daylight saving time. Although this workaround + misidentifies which part of the year uses daylight saving time, it + records UT offsets and time zone abbreviations correctly. + + * Some readers generate ambiguous timestamps for positive leap + seconds that occur when the UTC offset is not a multiple of 60 + seconds. For example, with UTC offset +01:23:45 and a positive + leap second 78796801 (1972-06-30 23:59:60 UTC), some readers will + map both 78796800 and 78796801 to 01:23:45 local time the next day + instead of mapping the latter to 01:23:46, and they will map + 78796815 to 01:23:59 instead of to 01:23:60. This has not yet + been a practical problem, since no civil authority has observed + such UTC offsets since leap seconds were introduced in 1972. + + Some interoperability problems are reader bugs that are listed here + mostly as warnings to developers of readers. + + * Some readers do not support negative timestamps. Developers of + distributed applications should keep this in mind if they need to + deal with pre-1970 data. + + * Some readers mishandle timestamps before the first transition that + has a non-negative timestamp. Readers that do not support + negative timestamps are likely to be more prone to this problem. + + * Some readers mishandle time zone abbreviations like "-08" that + contain "+", "-", or digits. + + * Some readers mishandle UT offsets that are out of the conventional + range of -12 through +12 hours and so do not support locations + like Kiritimati that are outside this range. + + * Some readers mishandle UT offsets in the range [-3599, -1] seconds + from UT because they integer-divide the offset by 3600 to get 0 + and then display the hour part as "+00". + + * Some readers mishandle UT offsets that are not a multiple of one + hour, 15 minutes, or 1 minute. + +Appendix B. Example TZif Files + + The following sections contain annotated hexadecimal dumps of example + TZif files. + + These examples should only be considered informative. Although the + example data entries are current as of the publication date of this + document, the data will likely change in the future as leap seconds + are added and changes are made to civil time. + +B.1. Version 1 File Representing UTC (with Leap Seconds) + + +========+=============+==================+========================+ + | File | Hexadecimal | Record Name / | Field Value | + | Offset | Octets | Field Name | | + +========+=============+==================+========================+ + | 000 | 54 5a 69 66 | magic | "TZif" | + +--------+-------------+------------------+------------------------+ + | 004 | 00 | version | 0 (1) | + +--------+-------------+------------------+------------------------+ + | 005 | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 | | + +--------+-------------+------------------+------------------------+ + | 020 | 00 00 00 01 | isutcnt | 1 | + +--------+-------------+------------------+------------------------+ + | 024 | 00 00 00 01 | isstdcnt | 1 | + +--------+-------------+------------------+------------------------+ + | 028 | 00 00 00 1b | leapcnt | 27 | + +--------+-------------+------------------+------------------------+ + | 032 | 00 00 00 00 | timecnt | 0 | + +--------+-------------+------------------+------------------------+ + | 036 | 00 00 00 01 | typecnt | 1 | + +--------+-------------+------------------+------------------------+ + | 040 | 00 00 00 04 | charcnt | 4 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[0] | | + +--------+-------------+------------------+------------------------+ + | 044 | 00 00 00 00 | utoff | 0 (+00:00) | + +--------+-------------+------------------+------------------------+ + | 048 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 049 | 00 | desigidx | 0 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 050 | 55 54 43 00 | designations[0] | "UTC\0" | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[0] | | + +--------+-------------+------------------+------------------------+ + | 054 | 04 b2 58 00 | occurrence | 78796800 | + | | | | (1972-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 058 | 00 00 00 01 | correction | 1 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[1] | | + +--------+-------------+------------------+------------------------+ + | 062 | 05 a4 ec 01 | occurrence | 94694401 | + | | | | (1972-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 066 | 00 00 00 02 | correction | 2 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[2] | | + +--------+-------------+------------------+------------------------+ + | 070 | 07 86 1f 82 | occurrence | 126230402 | + | | | | (1973-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 074 | 00 00 00 03 | correction | 3 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[3] | | + +--------+-------------+------------------+------------------------+ + | 078 | 09 67 53 03 | occurrence | 157766403 | + | | | | (1974-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 082 | 00 00 00 04 | correction | 4 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[4] | | + +--------+-------------+------------------+------------------------+ + | 086 | 0b 48 86 84 | occurrence | 189302404 | + | | | | (1975-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 090 | 00 00 00 05 | correction | 5 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[5] | | + +--------+-------------+------------------+------------------------+ + | 094 | 0d 2b 0b 85 | occurrence | 220924805 | + | | | | (1976-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 098 | 00 00 00 06 | correction | 6 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[6] | | + +--------+-------------+------------------+------------------------+ + | 102 | 0f 0c 3f 06 | occurrence | 252460806 | + | | | | (1977-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 106 | 00 00 00 07 | correction | 7 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[7] | | + +--------+-------------+------------------+------------------------+ + | 110 | 10 ed 72 87 | occurrence | 283996807 | + | | | | (1978-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 114 | 00 00 00 08 | correction | 8 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[8] | | + +--------+-------------+------------------+------------------------+ + | 118 | 12 ce a6 08 | occurrence | 315532808 | + | | | | (1979-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 122 | 00 00 00 09 | correction | 9 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[9] | | + +--------+-------------+------------------+------------------------+ + | 126 | 15 9f ca 89 | occurrence | 362793609 | + | | | | (1981-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 130 | 00 00 00 0a | correction | 10 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[10] | | + +--------+-------------+------------------+------------------------+ + | 134 | 17 80 fe 0a | occurrence | 394329610 | + | | | | (1982-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 138 | 00 00 00 0b | correction | 11 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[11] | | + +--------+-------------+------------------+------------------------+ + | 142 | 19 62 31 8b | occurrence | 425865611 | + | | | | (1983-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 146 | 00 00 00 0c | correction | 12 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[12] | | + +--------+-------------+------------------+------------------------+ + | 150 | 1d 25 ea 0c | occurrence | 489024012 | + | | | | (1985-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 154 | 00 00 00 0d | correction | 13 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[13] | | + +--------+-------------+------------------+------------------------+ + | 158 | 21 da e5 0d | occurrence | 567993613 | + | | | | (1987-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 162 | 00 00 00 0e | correction | 14 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[14] | | + +--------+-------------+------------------+------------------------+ + | 166 | 25 9e 9d 8e | occurrence | 631152014 | + | | | | (1989-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 170 | 00 00 00 0f | correction | 15 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[15] | | + +--------+-------------+------------------+------------------------+ + | 174 | 27 7f d1 0f | occurrence | 662688015 | + | | | | (1990-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 178 | 00 00 00 10 | correction | 16 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[16] | | + +--------+-------------+------------------+------------------------+ + | 182 | 2a 50 f5 90 | occurrence | 709948816 | + | | | | (1992-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 186 | 00 00 00 11 | correction | 17 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[17] | | + +--------+-------------+------------------+------------------------+ + | 190 | 2c 32 29 11 | occurrence | 741484817 | + | | | | (1993-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 194 | 00 00 00 12 | correction | 18 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[18] | | + +--------+-------------+------------------+------------------------+ + | 198 | 2e 13 5c 92 | occurrence | 773020818 | + | | | | (1994-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 202 | 00 00 00 13 | correction | 19 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[19] | | + +--------+-------------+------------------+------------------------+ + | 206 | 30 e7 24 13 | occurrence | 820454419 | + | | | | (1995-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 210 | 00 00 00 14 | correction | 20 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[20] | | + +--------+-------------+------------------+------------------------+ + | 214 | 33 b8 48 94 | occurrence | 867715220 | + | | | | (1997-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 218 | 00 00 00 15 | correction | 21 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[21] | | + +--------+-------------+------------------+------------------------+ + | 222 | 36 8c 10 15 | occurrence | 915148821 | + | | | | (1998-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 226 | 00 00 00 16 | correction | 22 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[22] | | + +--------+-------------+------------------+------------------------+ + | 230 | 43 b7 1b 96 | occurrence | 1136073622 | + | | | | (2005-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 234 | 00 00 00 17 | correction | 23 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[23] | | + +--------+-------------+------------------+------------------------+ + | 238 | 49 5c 07 97 | occurrence | 1230768023 | + | | | | (2008-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 242 | 00 00 00 18 | correction | 24 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[24] | | + +--------+-------------+------------------+------------------------+ + | 246 | 4f ef 93 18 | occurrence | 1341100824 | + | | | | (2012-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 250 | 00 00 00 19 | correction | 25 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[25] | | + +--------+-------------+------------------+------------------------+ + | 254 | 55 93 2d 99 | occurrence | 1435708825 | + | | | | (2015-06-30T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 258 | 00 00 00 1a | correction | 26 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | leapsecond[26] | | + +--------+-------------+------------------+------------------------+ + | 262 | 58 68 46 9a | occurrence | 1483228826 | + | | | | (2016-12-31T23:59:60Z) | + +--------+-------------+------------------+------------------------+ + | 266 | 00 00 00 1b | correction | 27 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 270 | 00 | standard/wall[0] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 271 | 00 | UT/local[0] | 0 (local) | + +--------+-------------+------------------+------------------------+ + + Table 1 + + To determine TAI corresponding to 2000-01-01T00:00:00Z + (UNIX time = 946684800), the following procedure would be followed: + + 1. Find the latest leap-second occurrence prior to the time of + interest (leapsecond[21]) and note the correction value + (LEAPCORR = 22). + + 2. Add LEAPCORR + 10 to the time of interest to yield TAI of + 2000-01-01T00:00:32. + +B.2. Version 2 File Representing Pacific/Honolulu + + +========+=============+==================+========================+ + | File | Hexadecimal | Record Name / | Field Value | + | Offset | Octets | Field Name | | + +========+=============+==================+========================+ + | 000 | 54 5a 69 66 | magic | "TZif" | + +--------+-------------+------------------+------------------------+ + | 004 | 32 | version | '2' (2) | + +--------+-------------+------------------+------------------------+ + | 005 | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 | | + +--------+-------------+------------------+------------------------+ + | 020 | 00 00 00 06 | isutcnt | 6 | + +--------+-------------+------------------+------------------------+ + | 024 | 00 00 00 06 | isstdcnt | 6 | + +--------+-------------+------------------+------------------------+ + | 028 | 00 00 00 00 | leapcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 032 | 00 00 00 07 | timecnt | 7 | + +--------+-------------+------------------+------------------------+ + | 036 | 00 00 00 06 | typecnt | 6 | + +--------+-------------+------------------+------------------------+ + | 040 | 00 00 00 14 | charcnt | 20 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 044 | 80 00 00 00 | trans time[0] | -2147483648 | + | | | | (1901-12-13T20:45:52Z) | + +--------+-------------+------------------+------------------------+ + | 048 | bb 05 43 48 | trans time[1] | -1157283000 | + | | | | (1933-04-30T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 052 | bb 21 71 58 | trans time[2] | -1155436200 | + | | | | (1933-05-21T21:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 056 | cb 89 3d c8 | trans time[3] | -880198200 | + | | | | (1942-02-09T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 060 | d2 23 f4 70 | trans time[4] | -769395600 | + | | | | (1945-08-14T23:00:00Z) | + +--------+-------------+------------------+------------------------+ + | 064 | d2 61 49 38 | trans time[5] | -765376200 | + | | | | (1945-09-30T11:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 068 | d5 8d 73 48 | trans time[6] | -712150200 | + | | | | (1947-06-08T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 072 | 01 | trans type[0] | 1 | + +--------+-------------+------------------+------------------------+ + | 073 | 02 | trans type[1] | 2 | + +--------+-------------+------------------+------------------------+ + | 074 | 01 | trans type[2] | 1 | + +--------+-------------+------------------+------------------------+ + | 075 | 03 | trans type[3] | 3 | + +--------+-------------+------------------+------------------------+ + | 076 | 04 | trans type[4] | 4 | + +--------+-------------+------------------+------------------------+ + | 077 | 01 | trans type[5] | 1 | + +--------+-------------+------------------+------------------------+ + | 078 | 05 | trans type[6] | 5 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[0] | | + +--------+-------------+------------------+------------------------+ + | 079 | ff ff 6c 02 | utoff | -37886 (-10:31:26) | + +--------+-------------+------------------+------------------------+ + | 083 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 084 | 00 | desigidx | 0 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[1] | | + +--------+-------------+------------------+------------------------+ + | 085 | ff ff 6c 58 | utoff | -37800 (-10:30) | + +--------+-------------+------------------+------------------------+ + | 089 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 090 | 04 | desigidx | 4 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[2] | | + +--------+-------------+------------------+------------------------+ + | 091 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 095 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 096 | 08 | desigidx | 8 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[3] | | + +--------+-------------+------------------+------------------------+ + | 097 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 101 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 102 | 0c | desigidx | 12 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[4] | | + +--------+-------------+------------------+------------------------+ + | 103 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 107 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 108 | 10 | desigidx | 16 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[5] | | + +--------+-------------+------------------+------------------------+ + | 109 | ff ff 73 60 | utoff | -36000 (-10:00) | + +--------+-------------+------------------+------------------------+ + | 113 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 114 | 04 | desigidx | 4 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 115 | 4c 4d 54 00 | designations[0] | "LMT\0" | + +--------+-------------+------------------+------------------------+ + | 119 | 48 53 54 00 | designations[4] | "HST\0" | + +--------+-------------+------------------+------------------------+ + | 123 | 48 44 54 00 | designations[8] | "HDT\0" | + +--------+-------------+------------------+------------------------+ + | 127 | 48 57 54 00 | designations[12] | "HWT\0" | + +--------+-------------+------------------+------------------------+ + | 131 | 48 50 54 00 | designations[16] | "HPT\0" | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 135 | 00 | standard/wall[0] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 136 | 00 | standard/wall[1] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 137 | 00 | standard/wall[2] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 138 | 00 | standard/wall[3] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 139 | 01 | standard/wall[4] | 1 (standard) | + +--------+-------------+------------------+------------------------+ + | 140 | 00 | standard/wall[5] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 141 | 00 | UT/local[0] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 142 | 00 | UT/local[1] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 143 | 00 | UT/local[2] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 144 | 00 | UT/local[3] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 145 | 01 | UT/local[4] | 1 (UT) | + +--------+-------------+------------------+------------------------+ + | 146 | 00 | UT/local[5] | 0 (local) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 147 | 54 5a 69 66 | magic | "TZif" | + +--------+-------------+------------------+------------------------+ + | 151 | 32 | version | '2' (2) | + +--------+-------------+------------------+------------------------+ + | 152 | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 | | + +--------+-------------+------------------+------------------------+ + | 167 | 00 00 00 06 | isutcnt | 6 | + +--------+-------------+------------------+------------------------+ + | 171 | 00 00 00 06 | isstdcnt | 6 | + +--------+-------------+------------------+------------------------+ + | 175 | 00 00 00 00 | leapcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 179 | 00 00 00 07 | timecnt | 7 | + +--------+-------------+------------------+------------------------+ + | 183 | 00 00 00 06 | typecnt | 6 | + +--------+-------------+------------------+------------------------+ + | 187 | 00 00 00 14 | charcnt | 20 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 191 | ff ff ff ff | trans time[0] | -2334101314 | + | | 74 e0 70 be | | (1896-01-13T22:31:26Z) | + +--------+-------------+------------------+------------------------+ + | 199 | ff ff ff ff | trans time[1] | -1157283000 | + | | bb 05 43 48 | | (1933-04-30T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 207 | ff ff ff ff | trans time[2] | -1155436200 | + | | bb 21 71 58 | | (1933-05-21T21:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 215 | ff ff ff ff | trans time[3] | -880198200 | + | | cb 89 3d c8 | | (1942-02-09T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 223 | ff ff ff ff | trans time[4] | -769395600 | + | | d2 23 f4 70 | | (1945-08-14T23:00:00Z) | + +--------+-------------+------------------+------------------------+ + | 231 | ff ff ff ff | trans time[5] | -765376200 | + | | d2 61 49 38 | | (1945-09-30T11:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 239 | ff ff ff ff | trans time[6] | -712150200 | + | | d5 8d 73 48 | | (1947-06-08T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 247 | 01 | trans type[0] | 1 | + +--------+-------------+------------------+------------------------+ + | 248 | 02 | trans type[1] | 2 | + +--------+-------------+------------------+------------------------+ + | 249 | 01 | trans type[2] | 1 | + +--------+-------------+------------------+------------------------+ + | 250 | 03 | trans type[3] | 3 | + +--------+-------------+------------------+------------------------+ + | 251 | 04 | trans type[4] | 4 | + +--------+-------------+------------------+------------------------+ + | 252 | 01 | trans type[5] | 1 | + +--------+-------------+------------------+------------------------+ + | 253 | 05 | trans type[6] | 5 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[0] | | + +--------+-------------+------------------+------------------------+ + | 254 | ff ff 6c 02 | utoff | -37886 (-10:31:26) | + +--------+-------------+------------------+------------------------+ + | 258 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 259 | 00 | desigidx | 0 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[1] | | + +--------+-------------+------------------+------------------------+ + | 260 | ff ff 6c 58 | utoff | -37800 (-10:30) | + +--------+-------------+------------------+------------------------+ + | 264 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 265 | 04 | desigidx | 4 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[2] | | + +--------+-------------+------------------+------------------------+ + | 266 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 270 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 271 | 08 | desigidx | 8 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[3] | | + +--------+-------------+------------------+------------------------+ + | 272 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 276 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 277 | 0c | desigidx | 12 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[4] | | + +--------+-------------+------------------+------------------------+ + | 278 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 282 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 283 | 10 | desigidx | 16 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[5] | | + +--------+-------------+------------------+------------------------+ + | 284 | ff ff 73 60 | utoff | -36000 (-10:00) | + +--------+-------------+------------------+------------------------+ + | 288 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 289 | 04 | desigidx | 4 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 290 | 4c 4d 54 00 | designations[0] | "LMT\0" | + +--------+-------------+------------------+------------------------+ + | 294 | 48 53 54 00 | designations[4] | "HST\0" | + +--------+-------------+------------------+------------------------+ + | 298 | 48 44 54 00 | designations[8] | "HDT\0" | + +--------+-------------+------------------+------------------------+ + | 302 | 48 57 54 00 | designations[12] | "HWT\0" | + +--------+-------------+------------------+------------------------+ + | 306 | 48 50 54 00 | designations[16] | "HPT\0" | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 310 | 00 | standard/wall[0] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 311 | 00 | standard/wall[1] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 312 | 00 | standard/wall[2] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 313 | 00 | standard/wall[3] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + | 314 | 01 | standard/wall[4] | 1 (standard) | + +--------+-------------+------------------+------------------------+ + | 315 | 00 | standard/wall[5] | 0 (wall) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 316 | 00 | UT/local[0] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 317 | 00 | UT/local[1] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 318 | 00 | UT/local[2] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 319 | 00 | UT/local[3] | 0 (local) | + +--------+-------------+------------------+------------------------+ + | 320 | 01 | UT/local[4] | 1 (UT) | + +--------+-------------+------------------+------------------------+ + | 321 | 00 | UT/local[5] | 0 (local) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 322 | 0a | NL | '\n' | + +--------+-------------+------------------+------------------------+ + | 323 | 48 53 54 31 | TZ string | "HST10" | + | | 30 | | | + +--------+-------------+------------------+------------------------+ + | 328 | 0a | NL | '\n' | + +--------+-------------+------------------+------------------------+ + + Table 2 + + To determine the local time in this time zone corresponding to + 1933-05-04T12:00:00Z (UNIX time = -1156939200), the following + procedure would be followed: + + 1. Find the latest time transition prior to the time of interest + (trans time[1]). + + 2. Reference the corresponding transition type (trans type[1]) to + determine the local time type index (2). + + 3. Reference the corresponding local time type (localtimetype[2]) to + determine the offset from UTC (-09:30), the daylight saving + indicator (1 = yes), and the index into the time zone designation + strings (8). + + 4. Look up the corresponding time zone designation string + (designations[8] = "HDT"). + + 5. Add the UTC offset to the time of interest to yield a local + daylight saving time of 1933-05-04T02:30:00-09:30 (HDT). + + To determine the local time in this time zone corresponding to + 2019-01-01T00:00:00Z (UNIX time = 1546300800), the following + procedure would be followed: + + 1. Find the latest time transition prior to the time of interest + (there is no such transition). + + 2. Look up the TZ string in the footer ("HST10"), which indicates + that the time zone designation is "HST" year-round and the offset + to UTC is 10:00. + + 3. Subtract the UTC offset from the time of interest to yield a + standard local time of 2018-12-31T14:00:00-10:00 (HST). + +B.3. Truncated Version 2 File Representing Pacific/Johnston + + The following TZif file has been truncated to end on + 2004-06-161T00:00:00Z (the atoll was abandoned sometime on + 2004-06-15). + + In this example: + + * The version 1 header contains only the required minimum data, + which will be ignored by readers. + + * The version 2 header leverages the fact that, by specifying + 'isutcnt' and 'isstdcnt' as zero, all transition times associated + with local time types are assumed to be specified as local wall- + clock time (see the definitions of UT/local indicators and + standard/wall indicators in Section 3.2). + + * The time type of the last transition has designation "-00", + indicating that local time is unspecified. + + * The TZ string is empty, indicating that there are no known future + transitions. + + +========+=============+==================+========================+ + | File | Hexadecimal | Record Name / | Field Value | + | Offset | Octets | Field Name | | + +========+=============+==================+========================+ + | 000 | 54 5a 69 66 | magic | "TZif" | + +--------+-------------+------------------+------------------------+ + | 004 | 32 | version | '2' (2) | + +--------+-------------+------------------+------------------------+ + | 005 | 00 00 00 00 | | | + | | 00 00 00 00 | | | + | | 00 00 00 00 | | | + | | 00 00 00 | | | + +--------+-------------+------------------+------------------------+ + | 020 | 00 00 00 00 | isutcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 024 | 00 00 00 00 | isstdcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 028 | 00 00 00 00 | leapcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 032 | 00 00 00 00 | timecnt | 0 | + +--------+-------------+------------------+------------------------+ + | 036 | 00 00 00 01 | typecnt | 1 | + +--------+-------------+------------------+------------------------+ + | 040 | 00 00 00 01 | charcnt | 1 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[0] | | + +--------+-------------+------------------+------------------------+ + | 044 | 00 00 00 00 | utoff | 0 (+00:00) | + +--------+-------------+------------------+------------------------+ + | 048 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 049 | 00 | desigidx | 0 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 050 | 00 | designations[0] | "\0" | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 051 | 54 5a 69 66 | magic | "TZif" | + +--------+-------------+------------------+------------------------+ + | 055 | 32 | version | '2' (2) | + +--------+-------------+------------------+------------------------+ + | 056 | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 00 | | + | | 00 00 00 | | + +--------+-------------+------------------+------------------------+ + | 071 | 00 00 00 00 | isutcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 075 | 00 00 00 00 | isstdcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 079 | 00 00 00 00 | leapcnt | 0 | + +--------+-------------+------------------+------------------------+ + | 083 | 00 00 00 08 | timecnt | 8 | + +--------+-------------+------------------+------------------------+ + | 087 | 00 00 00 07 | typecnt | 7 | + +--------+-------------+------------------+------------------------+ + | 091 | 00 00 00 18 | charcnt | 24 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 095 | ff ff ff ff | trans time[0] | -2334101314 | + | | 74 e0 70 be | | (1896-01-13T22:31:26Z) | + +--------+-------------+------------------+------------------------+ + | 103 | ff ff ff ff | trans time[1] | -1157283000 | + | | bb 05 43 48 | | (1933-04-30T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 111 | ff ff ff ff | trans time[2] | -1155436200 | + | | bb 21 71 58 | | (1933-05-21T21:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 119 | ff ff ff ff | trans time[3] | -880198200 | + | | cb 89 3d c8 | | (1942-02-09T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 127 | ff ff ff ff | trans time[4] | -769395600 | + | | d2 23 f4 70 | | (1945-08-14T23:00:00Z) | + +--------+-------------+------------------+------------------------+ + | 135 | ff ff ff ff | trans time[5] | -765376200 | + | | d2 61 49 38 | | (1945-09-30T11:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 143 | ff ff ff ff | trans time[6] | -712150200 | + | | d5 8d 73 48 | | (1947-06-08T12:30:00Z) | + +--------+-------------+------------------+------------------------+ + | 151 | 00 00 00 00 | trans time[7] | 1087344000 | + | | 40 cf 8d 80 | | (2004-06-16T00:00:00Z) | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 159 | 02 | trans type[0] | 2 | + +--------+-------------+------------------+------------------------+ + | 160 | 03 | trans type[1] | 3 | + +--------+-------------+------------------+------------------------+ + | 161 | 02 | trans type[2] | 2 | + +--------+-------------+------------------+------------------------+ + | 162 | 04 | trans type[3] | 4 | + +--------+-------------+------------------+------------------------+ + | 163 | 05 | trans type[4] | 5 | + +--------+-------------+------------------+------------------------+ + | 164 | 02 | trans type[5] | 2 | + +--------+-------------+------------------+------------------------+ + | 165 | 06 | trans type[6] | 6 | + +--------+-------------+------------------+------------------------+ + | 166 | 01 | trans type[7] | 1 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[0] | | + +--------+-------------+------------------+------------------------+ + | 167 | ff ff 6c 02 | utoff | -37886 (-10:31:26) | + +--------+-------------+------------------+------------------------+ + | 171 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 172 | 04 | desigidx | 4 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[1] | | + +--------+-------------+------------------+------------------------+ + | 173 | 00 00 00 00 | utoff | 0 (+00:00) | + +--------+-------------+------------------+------------------------+ + | 177 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 178 | 00 | desigidx | 0 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[2] | | + +--------+-------------+------------------+------------------------+ + | 179 | ff ff 6c 58 | utoff | -37800 (-10:30) | + +--------+-------------+------------------+------------------------+ + | 183 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 184 | 08 | desigidx | 8 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[3] | | + +--------+-------------+------------------+------------------------+ + | 185 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 189 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 190 | 0c | desigidx | 12 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[4] | | + +--------+-------------+------------------+------------------------+ + | 191 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 195 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 196 | 10 | desigidx | 16 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[5] | | + +--------+-------------+------------------+------------------------+ + | 197 | ff ff 7a 68 | utoff | -34200 (-09:30) | + +--------+-------------+------------------+------------------------+ + | 201 | 01 | isdst | 1 (yes) | + +--------+-------------+------------------+------------------------+ + | 202 | 14 | desigidx | 20 | + +--------+-------------+------------------+------------------------+ + +----------------------+------------------+------------------------+ + | | localtimetype[6] | | + +--------+-------------+------------------+------------------------+ + | 203 | ff ff 73 60 | utoff | -36000 (-10:00) | + +--------+-------------+------------------+------------------------+ + | 207 | 00 | isdst | 0 (no) | + +--------+-------------+------------------+------------------------+ + | 208 | 08 | desigidx | 8 | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 209 | 2d 30 30 00 | designations[0] | "-00\0" | + +--------+-------------+------------------+------------------------+ + | 213 | 4c 4d 54 00 | designations[4] | "LMT\0" | + +--------+-------------+------------------+------------------------+ + | 217 | 48 53 54 00 | designations[8] | "HST\0" | + +--------+-------------+------------------+------------------------+ + | 221 | 48 44 54 00 | designations[12] | "HDT\0" | + +--------+-------------+------------------+------------------------+ + | 225 | 48 57 54 00 | designations[16] | "HWT\0" | + +--------+-------------+------------------+------------------------+ + | 229 | 48 50 54 00 | designations[20] | "HPT\0" | + +--------+-------------+------------------+------------------------+ + +--------+-------------+------------------+------------------------+ + | 233 | 0a | NL | '\n' | + +--------+-------------+------------------+------------------------+ + | 234 | | TZ string | "" | + +--------+-------------+------------------+------------------------+ + | 234 | 0a | NL | '\n' | + +--------+-------------+------------------+------------------------+ + + Table 3 + +B.4. Truncated Version 3 File Representing Asia/Jerusalem + + The following TZif file has been truncated to start on + 2038-01-01T00:00:00Z. + + In this example: + + * The start time value cannot be represented using 32 bits, so the + version 1 header contains only the required minimum data, which + will be ignored by readers. + + * The version 3 header leverages the fact that, by specifying + 'isutcnt' and 'isstdcnt' as zero, all transition times associated + with local time types are assumed to be specified as local wall- + clock time (see the definitions of UT/local indicators and + standard/wall indicators in Section 3.2). + + * Time type 0 has designation "-00", indicating that local time is + unspecified prior to the truncation time. + + * The TZ string value has been line-wrapped for presentation + purposes only. + + +======+===========+================+==============================+ + |File |Hexadecimal|Record Name / | Field Value | + |Offset|Octets |Field Name | | + +======+===========+================+==============================+ + |000 |54 5a 69 66|magic | "TZif" | + +------+-----------+----------------+------------------------------+ + |004 |33 |version | '3' (3) | + +------+-----------+----------------+------------------------------+ + |005 |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 | | + +------+-----------+----------------+------------------------------+ + |020 |00 00 00 00|isutcnt | 0 | + +------+-----------+----------------+------------------------------+ + |024 |00 00 00 00|isstdcnt | 0 | + +------+-----------+----------------+------------------------------+ + |028 |00 00 00 00|leapcnt | 0 | + +------+-----------+----------------+------------------------------+ + |032 |00 00 00 00|timecnt | 0 | + +------+-----------+----------------+------------------------------+ + |036 |00 00 00 01|typecnt | 1 | + +------+-----------+----------------+------------------------------+ + |040 |00 00 00 01|charcnt | 1 | + +------+-----------+----------------+------------------------------+ + +------------------+----------------+------------------------------+ + | |localtimetype[0]| | + +------+-----------+----------------+------------------------------+ + |044 |00 00 00 00|utoff | 0 (+00:00) | + +------+-----------+----------------+------------------------------+ + |048 |00 |isdst | 0 (no) | + +------+-----------+----------------+------------------------------+ + |049 |00 |desigidx | 0 | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |050 |00 |designations[0] | "\0" | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |051 |54 5a 69 66|magic | "TZif" | + +------+-----------+----------------+------------------------------+ + |055 |33 |version | '3' (3) | + +------+-----------+----------------+------------------------------+ + |056 |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 | | + +------+-----------+----------------+------------------------------+ + |071 |00 00 00 00|isutcnt | 0 | + +------+-----------+----------------+------------------------------+ + |075 |00 00 00 00|isstdcnt | 0 | + +------+-----------+----------------+------------------------------+ + |079 |00 00 00 00|leapcnt | 0 | + +------+-----------+----------------+------------------------------+ + |083 |00 00 00 01|timecnt | 1 | + +------+-----------+----------------+------------------------------+ + |087 |00 00 00 02|typecnt | 2 | + +------+-----------+----------------+------------------------------+ + |091 |00 00 00 08|charcnt | 8 | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |095 |00 00 00 00|trans time[0] | 2145916800 | + | |7f e8 17 80| | (2038-01-01T00:00:00Z) | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |103 |01 |trans type[0] | 1 | + +------+-----------+----------------+------------------------------+ + +------------------+----------------+------------------------------+ + | |localtimetype[0]| | + +------+-----------+----------------+------------------------------+ + |104 |00 00 00 00|utoff | 0 (+00:00) | + +------+-----------+----------------+------------------------------+ + |108 |00 |isdst | 0 (no) | + +------+-----------+----------------+------------------------------+ + |109 |00 |desigidx | 0 | + +------+-----------+----------------+------------------------------+ + +------------------+----------------+------------------------------+ + | |localtimetype[1]| | + +------+-----------+----------------+------------------------------+ + |110 |00 00 1c 20|utoff | 7200 (+02:00) | + +------+-----------+----------------+------------------------------+ + |114 |00 |isdst | 0 (no) | + +------+-----------+----------------+------------------------------+ + |115 |04 |desigidx | 4 | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |116 |2d 30 30 00|designations[0] | "-00\0" | + +------+-----------+----------------+------------------------------+ + |120 |49 53 54 00|designations[4] | "IST\0" | + +------+-----------+----------------+------------------------------+ + +------+-----------+----------------+------------------------------+ + |124 |0a |NL | '\n' | + +------+-----------+----------------+------------------------------+ + |125 |49 53 54 2d|TZ string | "IST-2IDT,M3.4.4/26,M10.5.0" | + | |32 49 44 54| | | + | |2c 4d 33 2e| | | + | |34 2e 34 2f| | | + | |32 36 2c 4d| | | + | |31 30 2e 35| | | + | |2e 30 | | | + +------+-----------+----------------+------------------------------+ + |151 |0a |NL | '\n' | + +------+-----------+----------------+------------------------------+ + + Table 4 + +B.5. Truncated Version 4 File Representing Europe/London + + The following TZif file has been truncated to start on + 2022-01-01T00:00:00Z. + + In this example: + + * The version 1 header contains only the required minimum data, + which will be ignored by readers. + + * The version 4 header leverages the fact that, by specifying + 'isutcnt' and 'isstdcnt' as zero, all transition times associated + with local time types are assumed to be specified as local wall- + clock time (see the definitions of UT/local indicators and + standard/wall indicators in Section 3.2). + + * Time type 0 has designation "-00", indicating that local time is + unspecified prior to the truncation time. + + * The first leap-second occurrence is the most recent one prior to + the truncation time. + + * The last leap-second correction matches the second-to-last leap- + second correction, indicating the expiration time of the leap- + second table. + + * The TZ string value has been line-wrapped for presentation + purposes only. + + +======+===========+==================+============================+ + |File |Hexadecimal| Record Name / | Field Value | + |Offset|Octets | Field Name | | + +======+===========+==================+============================+ + |000 |54 5a 69 66| magic | "TZif" | + +------+-----------+------------------+----------------------------+ + |004 |34 | version | '4' (4) | + +------+-----------+------------------+----------------------------+ + |005 |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 | | + +------+-----------+------------------+----------------------------+ + |020 |00 00 00 00| isutcnt | 0 | + +------+-----------+------------------+----------------------------+ + |024 |00 00 00 00| isstdcnt | 0 | + +------+-----------+------------------+----------------------------+ + |028 |00 00 00 00| leapcnt | 0 | + +------+-----------+------------------+----------------------------+ + |032 |00 00 00 00| timecnt | 0 | + +------+-----------+------------------+----------------------------+ + |036 |00 00 00 01| typecnt | 1 | + +------+-----------+------------------+----------------------------+ + |040 |00 00 00 01| charcnt | 1 | + +------+-----------+------------------+----------------------------+ + +------------------+------------------+----------------------------+ + | | localtimetype[0] | | + +------+-----------+------------------+----------------------------+ + |044 |00 00 00 00| utoff | 0 (+00:00) | + +------+-----------+------------------+----------------------------+ + |048 |00 | isdst | 0 (no) | + +------+-----------+------------------+----------------------------+ + |049 |00 | desigidx | 0 | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |050 |00 | designations[0] | "\0" | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |051 |54 5a 69 66| magic | "TZif" | + +------+-----------+------------------+----------------------------+ + |055 |34 | version | '4' (4) | + +------+-----------+------------------+----------------------------+ + |056 |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 00| | + | |00 00 00 | | + +------+-----------+------------------+----------------------------+ + |071 |00 00 00 00| isutcnt | 0 | + +------+-----------+------------------+----------------------------+ + |075 |00 00 00 00| isstdcnt | 0 | + +------+-----------+------------------+----------------------------+ + |079 |00 00 00 02| leapcnt | 2 | + +------+-----------+------------------+----------------------------+ + |083 |00 00 00 01| timecnt | 1 | + +------+-----------+------------------+----------------------------+ + |087 |00 00 00 02| typecnt | 2 | + +------+-----------+------------------+----------------------------+ + |091 |00 00 00 08| charcnt | 8 | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |095 |00 00 00 00| trans time[0] | 1640995227 | + | |61 cf 99 9b| | (2022-01-01T00:00:27Z) | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |103 |01 | trans type[0] | 1 | + +------+-----------+------------------+----------------------------+ + +------------------+------------------+----------------------------+ + | | localtimetype[0] | | + +------+-----------+------------------+----------------------------+ + |104 |00 00 00 00| utoff | 0 (+00:00) | + +------+-----------+------------------+----------------------------+ + |108 |00 | isdst | 0 (no) | + +------+-----------+------------------+----------------------------+ + |109 |00 | desigidx | 0 | + +------+-----------+------------------+----------------------------+ + +------------------+------------------+----------------------------+ + | | localtimetype[1] | | + +------+-----------+------------------+----------------------------+ + |110 |00 00 00 00| utoff | 0 (+00:00) | + +------+-----------+------------------+----------------------------+ + |114 |00 | isdst | 0 (no) | + +------+-----------+------------------+----------------------------+ + |115 |04 | desigidx | 4 | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |116 |2d 30 30 00| designations[0] | "-00\0" | + +------+-----------+------------------+----------------------------+ + |120 |47 4d 54 00| designations[4] | "GMT\0" | + +------+-----------+------------------+----------------------------+ + +------------------+------------------+----------------------------+ + | | leapsecond[0] | | + +------+-----------+------------------+----------------------------+ + |124 |00 00 00 00| occurrence | 1483228826 | + | |58 68 46 9a| | (2016-12-31T23:59:60Z) | + +------+-----------+------------------+----------------------------+ + |132 |00 00 00 1b| correction | 27 | + +------+-----------+------------------+----------------------------+ + +------------------+------------------+----------------------------+ + | | leapsecond[1] | | + +------+-----------+------------------+----------------------------+ + |136 |00 00 00 00| occurrence | 1719532827 | + | |66 7d fd 1b| | (2024-06-28T00:00:01Z) | + +------+-----------+------------------+----------------------------+ + |144 |00 00 00 1b| correction | 27 | + +------+-----------+------------------+----------------------------+ + +------+-----------+------------------+----------------------------+ + |148 |0a | NL | '\n' | + +------+-----------+------------------+----------------------------+ + |149 |47 4d 54 30| TZ string | "GMT0BST,M3.5.0/1,M10.5.0" | + | |42 53 54 2c| | | + | |4d 33 2e 35| | | + | |2e 30 2f 31| | | + | |2c 4d 31 30| | | + | |2e 35 2e 30| | | + +------+-----------+------------------+----------------------------+ + |173 |0a | NL | '\n' | + +------+-----------+------------------+----------------------------+ + + Table 5 + +Appendix C. Changes from RFC 8536 + + * Added definition of Leap Second. + + * Added specification of the version 4 format and the optional leap- + second table truncation and expiration, along with an example and + relevant interoperability considerations. + + * Documented the longstanding practice that UT with designation + string "-00" denotes unspecified local time. Added recommendation + that this designation string should be used for timestamps + excluded by TZif file truncation. + + * Required support in version 2 files for all-year daylight saving + time, using POSIX TZ strings with negative DST, as this is not an + extension to POSIX (Section 3.3.1). + + * Applied erratum [Err6435]. + + * Addressed errata [Err6426], [Err6757], and [Err7681] as well as + several other errors in the examples. + + * Added additional interoperability considerations and common + issues. + + * Added an example of a TZif file truncated at the end + (Appendix B.3). + + * Added informational notes to Appendix B.4. + + * Miscellaneous editorial changes. + +Acknowledgments + + The authors thank the following individuals for contributing their + ideas and support for writing this specification: Michael Douglass, + Ned Freed, Guy Harris, Eliot Lear, Alexey Melnikov, and Tim Parenti. + +Authors' Addresses + + Arthur David Olson + Email: arthurdavidolson@gmail.com + + + Paul Eggert + University of California, Los Angeles + Email: eggert@cs.ucla.edu + + + Kenneth Murchison + Fastmail US LLC + Email: murch@fastmailteam.com |