Network Working Group C. Newman Internet Draft: Date and Time on the Internet Innosoft Document: draft-newman-datetime-01.txt January 1997 Date and Time on the Internet Status of this memo This document is an Internet Draft. Internet Drafts are working documents of the Internet Engineering Task Force (IETF), its Areas, and its Working Groups. Note that other groups may also distribute working documents as Internet Drafts. Internet Drafts are draft documents valid for a maximum of six months. Internet Drafts may be updated, replaced, or obsoleted by other documents at any time. It is not appropriate to use Internet Drafts as reference material or to cite them other than as a ``working draft'' or ``work in progress``. To learn the current status of any Internet-Draft, please check the 1id-abstracts.txt listing contained in the Internet-Drafts Shadow Directories on ds.internic.net, nic.nordu.net, ftp.isi.edu, or munnari.oz.au. A revised version of this draft document will be submitted to the IESG as a Proposed Standard for the Internet Community. Discussion and suggestions for improvement are requested. This document will expire six months after publication. Distribution of this draft is unlimited. 1. Introduction Date and time formats cause a lot of confusion and interoperability problems on the Internet. This document will address many of the problems encountered and make recommendations to improve consistancy and interoperability when representing and using date and time in Internet protocols. This document includes an Internet profile of the ISO 8601 [ISO8601] standard for representation of dates and times using the Gregorian calendar. Changes from draft -00: * added some more definitions and references (fixed NTP reference) Newman [Page 1] Internet Draft Date and Time January 1997 * language clarifications * include rules for day of month and leap seconds * disallow hour of 24 * add registry of named timezones and local time format * use . instead of , for fractions of second * removed references to AM/PM * simplified appendix B program * added appendix C program to calculate leap year Controversial in last draft, but unchanged: * use of "T" as date/time separator. Proposal is to use " " instead, but my reading of ISO 8601 does not permit that. * suggestion to make minutes offset from UTC optional. * interpretation of 2 digit years Open issues: * See controversial issues above. More comment is welcome. * Are more definitions needed? * A number of the timezones in the initial registry list are duplicates for future times. I already removed the Indiana county ones since they all duplicate Indianapolis for future times. * Need reference to good article demonstrating year 2000 problems. * Need commentary on registry and to set up address for registry. * Will add appendix D, E with sample POSIX generation/parsing code for section 5.6. Markus Kuhn is working on code. 2. Definitions UTC Coordinated Universal Time as maintained by the Bureau Internaational de l'Heure (International Time Bureau). second A basic unit of measurement of time in the International System of Units. minute A period of time of 60 seconds. hour A period of time of 60 minutes. day A period of time of 24 hours. leap year In the Gregorian calendar, a year which has 366 days. A leap year is a year whose number is divisible by four an integral number of times, except that if it is a centennial year it shall be divisible by four hundred an integral number of times. ABNF Augmented Backus-Naur Form, a format used to represent Newman [Page 2] Internet Draft Date and Time January 1997 permissible strings in a protocol or language, as defined in [IMAIL]. Email Date/Time Format The date/time format used by Internet Mail as defined by RFC 822 [IMAIL] and amended by RFC 1123 [HOST-REQ]. Internet Date/Time Format The date format defined in section 5 of this document. For more information about time scales, see Appendix E of [NTP], Section 3 of [ISO8601], and the appropriate ITU documents [ITU-R- TF]. 3. Two Digit Years Two digit years are expected to cause great expense to many as the year 2000 approaches. Many existing computer programs simply add or subtract 1900 from a two digit year. Such programs will clearly stop functioning on the year 2000 and will have to be upgraded, possibly at great expense [XXX - ref to article on IRS year 2000 problems would be cool]. The following requirements are made of Internet protocols to address this problem: o Internet Protocols MUST generate four digit years in dates. o If a two digit year is received, the values 00-49 MUST be interpreted as referring to the 21st century (add 2000) and the values 50-99 MUST be interpreted as referring to the 20th century (add 1900). While different interpretations may result in a few more years of 2-digit usability for some applications, it is believed that a single interpretation for two digit years in all Internet protocols will result in better interoperability. In addition, it is reasonable to expect all Internet Protocols using 2 digit dates to be upgraded by the year 2050. o It is possible that a program using two digit years will represent years after 1999 as three digits. This occurs if the program simply subtracts 1900 from the year and doesn't check the number of digits. Programs wishing to robustly deal with dates generated by such broken software may add 1900 to three digit years. o It is possible that a program using two digit years will represent years after 1999 as ":0", ":1", ... ":9", ";0", ... This occurs if the program simply subtracts 1900 from the year Newman [Page 3] Internet Draft Date and Time January 1997 and adds the decade to the US-ASCII character zero. Programs wishing to robustly deal with dates generated by such broken software should detect non-numeric decades and interpret appropriately. The problems with two digit years amply demonstrate why all dates and times used in Internet protocols MUST be fully qualified. 4. Local Time 4.1. Coordinated Universal Time (UTC) Because the daylight rules for local timezones are so convoluted and can change based on local law at unpredictable times, true interoperability is best achieved by using Coordinated Universal Time (UTC). 4.2. Local Offsets The offset between local time and UTC is often useful information. For example, in electronic mail [IMAIL] the local offset provides a useful heuristic to determine the probability of a prompt response. Attempts to label local offsets with alphabetic strings have resulted in poor interoperability in the past [IMAIL], [HOST-REQ]. Therefore numeric offsets are now REQUIRED in Internet Mail Date/Time Format. Numeric offsets are calculated as "local time minus UTC". So the equivalent time in UTC can be determined by subtracting the offset from the local time. For example, 18:50:00-04:00 is the same time as 22:58:00Z. 4.3. Unknown Local Offset Convention If the time in UTC is known, but the offset to local time is unknown, this can be represented with an offset of "-00:00". This differs semanticly from an offset of "Z" which implies that UTC is the preferred reference point for the specified time. This convention MAY also be used in the Email Date/Time Format. 4.4. Unqualified Local Time A number of devices currently connected to the Internet run their internal clocks in local time and are unaware of UTC. While the Newman [Page 4] Internet Draft Date and Time January 1997 Internet does have a tradition of accepting reality when creating specifications, this should not be done at the expense of interoperability. Since interpretation of an unqualified local timezone will fail in approximately 23/24 of the globe, the interoperability problems of unqualified local time are deemed unacceptable for the Internet. Devices which are unaware of the time in UTC MUST use one of the following techniques when communicating on the Internet: o Use Network Time Protocol [NTP] to obtain the time in UTC. o Use another host in the same local timezone as a gateway to the Internet. This host MUST correct unqualified local times before they are transmitted to other hosts. o Prompt the user for the local timezone and daylight savings settings. 5. Date and Time formats This section discusses desirable qualities of date and time formats and defines a profile of ISO 8601 for use in new Internet protocols. Email Date/Time Format lacks many of these characteristics and its use in new protocols is discouraged. 5.1. Ordering If date and time components are ordered from least precise to most precise, then a useful property is achieved. Assuming that the timezones of the dates and times are the same (e.g. all in UTC), then the date and time strings may be sorted as strings (e.g. using the strcmp() function in C) and a time-ordered sequence will result. The presence of optional punctuation would violate this characteristic. 5.2. Human Readability Human readability has proved to be a valuable feature of Internet protocols. Human readable protocols greatly reduce the costs of debugging since telnet often suffices as a test client and network analysers need not be modified with knowledge of the protocol. On the other hand, human readability sometimes results in interoperability problems. For example, the date format "10/11/1996" is completely unsuitable for global interchange because it is interpreted differently in different countries. In addition, the date format in [IMAIL] has resulted in Newman [Page 5] Internet Draft Date and Time January 1997 interoperability problems when people assumed any text string was permitted and translated the three letter abbreviations to other languages or substituted date formats which were easier to generate (e.g. the format used by the C function ctime). For this reason, a balance must be struck between human readability and interoperability. Because no date and time format is readable according to the conventions of all countries, Internet clients SHOULD be prepared to transform dates into a display format suitable for the locality. This may include translating UTC to local time. 5.3. Rarely Used Options A format which includes rarely used options is likely to cause interoperability problems. This is because rarely used options are less likely to be used in alpha or beta testing, so bugs in parsing are less likely to be discovered. Rarely used options should be made mandatory or omitted for the sake of interoperability whenever possible. The format defined below includes only one rarely used option: fractions of a second. It is expected that this will be used only by applications which require strict ordering of date/time stamps or which have an unusual precision requirement. 5.4. Redundant Information If a date/time format includes redundant information, that introduces the possibility that the redunant information will not correlate. For example, including the day of the week in a date/time format introduces the possibility that the day of week is incorrect but the date is correct, or vice versa. Since it is not difficult to compute the day of week from a date (see Appendix B), the day of week should not be included in a date/time format. 5.5. Simplicity The complete set of date and time formats specified in ISO 8601 [ISO8601] is quite complex in an attempt to provide multiple representations and partial representations. Appendix A contains an attempt to translate the complete syntax of ISO 8601 into ABNF as defined in [IMAIL]. Internet protocols have somewhat different requirements and simplicity has proved to be an important characteristic. In addition, Internet protocols usually need Newman [Page 6] Internet Draft Date and Time January 1997 complete specification of data in order to achieve true interoperability. Therefore, the complete grammar for ISO 8601 is deemed too complex for most Internet protocols. The following section defines a profile of ISO 8601 for use on the Internet. It is a conformant subset of the ISO 8601 extended format. Simplicity is achieved by making most fields and punctuation mandatory. 5.6. Internet Date/Time Format The following profile of ISO 8601 [ISO8601] dates SHOULD be used in new protocols on the Internet. This is specified using ABNF as defined in [IMAIL]. date-fullyear = 4DIGIT date-month = 2DIGIT ; 01-12 date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year time-hour = 2DIGIT ; 00-23 time-minute = 2DIGIT ; 00-59 time-second = 2DIGIT ; 00-59, 00-60 based on leap second rules time-secfrac = "." 1*DIGIT time-numoffset = ("+" / "-") time-hour ":" time-minute time-offset = "Z" / time-numoffset partial-time = time-hour ":" time-minute ":" time-second [time-secfrac] full-date = date-fullyear "-" date-month "-" date-mday full-time = partial-time time-offset date-time = full-date "T" full-time 5.7. Restrictions The grammar element date-mday represents the day number within the current month. The maximum value varies based on the month and year as follows: Newman [Page 7] Internet Draft Date and Time January 1997 Month Number Month/Year Maximum value of date-mday ------------ ---------- -------------------------- 01 January 31 02 February, normal 28 02 February, leap year 29 03 March 31 04 April 30 05 May 31 06 June 30 07 July 31 08 August 31 09 September 30 10 October 31 11 November 30 12 December 31 Appendix C contains sample C code to determine if a year is a leap year. The grammar element time-second may have the value "60" at the end of June (XXXX-06-30T23:59:60) or December (XXXX-12-31T23:59:60). At all other times the maximum value of time-second is "59". Although ISO 8601 permits the hour to be "24", this profile of ISO 8601 only allows values between "00" and "23" for the hour in order to reduce confusion. 5.8. Examples Here are three examples of Internet date/time format. 1985-04-12T23:20:50.52Z This represents 20 minutes and 50.52 seconds after the 23rd hour of April 12th, 1985 in UTC. 1996-12-19T16:39:57-08:00 This represents 39 minutes and 57 seconds after the 16th hour of December 19th, 1996 with an offset of -08:00 from UTC (Pacific Standard Time). Note that this is equivalent to 1996-12- 20T00:39:57Z in UTC. 1990-12-31T23:59:60Z This represents the leap second insertted at the end of 1990. Newman [Page 8] Internet Draft Date and Time January 1997 6. Future Events in Local Time Some applications (e.g. calendaring) require the representation of repeating or future dates in local time. Because the conversion rules between UTC and local time may change by season and political whim, it is necessary to label the local time zone with a standard label so that if new conversion rules are issued the interpretation of the time relative to UTC can be corrected. For this reason, an IANA registry of timezone names which may be used to represent future dates is necessary. 6.1. Problems Too Hard to Solve Since local timezone rules are set by local governments, the only authoratative reference for such rules is those governments, most of which do not currently provide their rules on line in a computer parsible format. In addition, local timezones were historically set by cities and towns, so attempting to exhaustively enumerate all historical timezones for use in representing past dates is not practical. Attempting to predict where new timezones will be created as a subset of the area covered by an old timezone is also a hopeless prospect. Therefore the only formal part of the registry will be names for a minimal set of modern timezones. As a convenience, the registry will also include the base UTC offset and daylight savings rules (if determinable) at the time of registration. Because the UTC offset and rules may changed by other bodies, they will not be considered an authoratative part of the registry. 6.2. Prior Art An informal collection of timezone information is currently being maintained by volunteer Internet participants. The current location of this information is: This is valuable work, and is used in some operating systems. The initial set of timezone names for the IANA registry is a subset of the names collected by this effort. 6.3. Legal Characters in Timezone Names Only the US-ASCII characters A-Z, a-z, 0-9, "-", "_" and "/" are Newman [Page 9] Internet Draft Date and Time January 1997 legal in timezone names. The basic format is the name of a continent or ocean followed by a "/" followed by the name of a city or political entity. A political entity may be followed by a "/" and a subentity if necessary. Timezone names SHOULD use the standard case in the registry, but MUST be interpreted in a case insensitive manner. New timezone names SHOULD use "-" rather than "_", as the latter is difficult to see in some output contexts. 6.4. Template for IANA Registration of Timezone Names To: timezone@XXX Subject: Timezone Name Registration Timezone Name: ISO 3166 2-character country code: Description: 6.5. Proceedure for IANA Registration of Timezone Names The IESG is responsible for appointing a reviewer of Timezone Names. The job of this reviewer is to verify that the new timezone name has unique UTC rules, is likely to be used, fits the rules in section 6.3 and does not conflict unnecessarily with prior art (especially that mentioned in section 6.2). Within two weeks of posting, the reviewer must take one of the following actions: (1) Pass the registration proposal to IANA. (2) Reject the registration proposal. (3) Recommend alterations to the registration proposal likely to make it acceptable. In order to assist the reviewer, the address timezone@XXX will be a public mailing list where registration proposals may be discussed. Subscription and unsubscription requests may be sent to timezone- request@XXX. 6.6. Initial List of IANA Timezone Names The following list will serve as the initial list of IANA Timezone Names. This list was generated from the archive mentioned in section 6.2. Some of these timezone names (especially within the Newman [Page 10] Internet Draft Date and Time January 1997 same country) are redundant for future dates, but compatibility with the timezone names in the databases discussed section 6.2. is useful. Timezone Name Country ------------- ------- Europe/Andorra AD Asia/Dubai AE Asia/Kabul AF America/Antigua AG America/Anguilla AI Europe/Tirane AL Asia/Yerevan AM America/Curacao AN Africa/Luanda AO Antarctica/Casey AQ Antarctica/DumontDUrville AQ Antarctica/Mawson AQ Antarctica/McMurdo AQ Antarctica/Palmer AQ Antarctica/South_Pole AQ America/Buenos_Aires AR America/Catamarca AR America/Cordoba AR America/Jujuy AR America/Mendoza AR America/Rosario AR Pacific/Pago_Pago AS Europe/Vienna AT Australia/Adelaide AU Australia/Brisbane AU Australia/Broken_Hill AU Australia/Darwin AU Australia/Hobart AU Australia/Lindeman AU Australia/Lord_Howe AU Australia/Melbourne AU Australia/Perth AU Australia/Sydney AU America/Aruba AW Asia/Baku AZ Europe/Sarajevo BA America/Barbados BB Asia/Dacca BD Europe/Brussels BE Africa/Ouagadougou BF Europe/Sofia BG Asia/Bahrain BH Newman [Page 11] Internet Draft Date and Time January 1997 Africa/Bujumbura BI Africa/Porto-Novo BJ Atlantic/Bermuda BM Asia/Brunei BN America/La_Paz BO America/Cuiaba BR America/Fortaleza BR America/Maceio BR America/Manaus BR America/Noronha BR America/Porto_Acre BR America/Sao_Paulo BR America/Nassau BS Asia/Thimbu BT Africa/Gaborone BW Europe/Minsk BY America/Belize BZ America/Dawson CA America/Dawson_Creek CA America/Edmonton CA America/Glace_Bay CA America/Goose_Bay CA America/Halifax CA America/Inuvik CA America/Iqaluit CA America/Montreal CA America/Nipigon CA America/Pangnirtung CA America/Rainy_River CA America/Rankin_Inlet CA America/Regina CA America/St_Johns CA America/Swift_Current CA America/Thunder_Bay CA America/Vancouver CA America/Whitehorse CA America/Winnipeg CA America/Yellowknife CA Indian/Cocos CC Africa/Bangui CF Africa/Brazzaville CG Europe/Zurich CH Africa/Abidjan CI Pacific/Rarotonga CK America/Santiago CL Pacific/Easter CL Africa/Douala CM Asia/Chungking CN Newman [Page 12] Internet Draft Date and Time January 1997 Asia/Harbin CN Asia/Kashgar CN Asia/Shanghai CN Asia/Urumqi CN America/Bogota CO America/Costa_Rica CR America/Havana CU Atlantic/Cape_Verde CV Indian/Christmas CX Asia/Nicosia CY Europe/Prague CZ Europe/Berlin DE Africa/Djibouti DJ Europe/Copenhagen DK America/Dominica DM America/Santo_Domingo DO Africa/Algiers DZ America/Guayaquil EC Pacific/Galapagos EC Europe/Tallinn EE Africa/Cairo EG Africa/El_Aaiun EH Africa/Asmera ER Africa/Ceuta ES Atlantic/Canary ES Europe/Madrid ES Africa/Addis_Ababa ET Europe/Helsinki FI Pacific/Fiji FJ Atlantic/Stanley FK Pacific/Kosrae FM Pacific/Ponape FM Pacific/Truk FM Pacific/Yap FM Atlantic/Faeroe FO Europe/Paris FR Africa/Libreville GA Europe/Belfast GB Europe/London GB America/Grenada GD Asia/Tbilisi GE America/Cayenne GF Africa/Accra GH Europe/Gibraltar GI America/Godthab GL America/Scoresbysund GL America/Thule GL Africa/Banjul GM Newman [Page 13] Internet Draft Date and Time January 1997 Africa/Conakry GN America/Guadeloupe GP Africa/Malabo GQ Europe/Athens GR Atlantic/South_Georgia GS America/Guatemala GT Pacific/Guam GU Africa/Bissau GW America/Guyana GY Asia/Hong_Kong HK America/Tegucigalpa HN Europe/Zagreb HR America/Port-au-Prince HT Europe/Budapest HU Asia/Jakarta ID Asia/Jayapura ID Asia/Ujung_Pandang ID Europe/Dublin IE Asia/Gaza IL Asia/Jerusalem IL Asia/Calcutta IN Indian/Chagos IO Asia/Baghdad IQ Asia/Tehran IR Atlantic/Reykjavik IS Europe/Rome IT America/Jamaica JM Asia/Amman JO Asia/Ishigaki JP Asia/Tokyo JP Africa/Nairobi KE Asia/Bishkek KG Asia/Phnom_Penh KH Pacific/Enderbury KI Pacific/Kiritimati KI Pacific/Tarawa KI Indian/Comoro KM America/St_Kitts KN Asia/Pyongyang KP Asia/Seoul KR Asia/Kuwait KW America/Cayman KY Asia/Alma-Ata KZ Asia/Aqtau KZ Asia/Aqtobe KZ Asia/Vientiane LA Asia/Beirut LB America/St_Lucia LC Newman [Page 14] Internet Draft Date and Time January 1997 Europe/Vaduz LI Asia/Colombo LK Africa/Monrovia LR Africa/Maseru LS Europe/Vilnius LT Europe/Luxembourg LU Europe/Riga LV Africa/Tripoli LY Africa/Casablanca MA Europe/Monaco MC Europe/Chisinau MD Indian/Antananarivo MG Pacific/Kwajalein MH Pacific/Majuro MH Europe/Skopje MK Africa/Bamako ML Africa/Timbuktu ML Asia/Rangoon MM Asia/Ulan_Bator MN Asia/Macao MO Pacific/Saipan MP America/Martinique MQ Africa/Nouakchott MR America/Montserrat MS Europe/Malta MT Indian/Mauritius MU Indian/Maldives MV Africa/Blantyre MW America/Ensenada MX America/Mazatlan MX America/Mexico_City MX America/Tijuana MX Asia/Kuala_Lumpur MY Asia/Kuching MY Africa/Maputo MZ Africa/Windhoek NA Pacific/Noumea NC Africa/Niamey NE Pacific/Norfolk NF Africa/Lagos NG America/Managua NI Europe/Amsterdam NL Europe/Oslo NO Asia/Katmandu NP Pacific/Nauru NR Pacific/Niue NU Pacific/Auckland NZ Pacific/Chatham NZ Newman [Page 15] Internet Draft Date and Time January 1997 Asia/Muscat OM America/Panama PA America/Lima PE Pacific/Gambier PF Pacific/Marquesas PF Pacific/Tahiti PF Pacific/Port_Moresby PG Asia/Manila PH Asia/Karachi PK Europe/Warsaw PL America/Miquelon PM Pacific/Pitcairn PN America/Puerto_Rico PR Atlantic/Azores PT Atlantic/Madeira PT Europe/Lisbon PT Pacific/Palau PW America/Asuncion PY Asia/Qatar QA Indian/Reunion RE Europe/Bucharest RO Asia/Anadyr RU Asia/Irkutsk RU Asia/Kamchatka RU Asia/Krasnoyarsk RU Asia/Magadan RU Asia/Novosibirsk RU Asia/Omsk RU Asia/Vladivostok RU Asia/Yakutsk RU Asia/Yekaterinburg RU Europe/Kaliningrad RU Europe/Moscow RU Europe/Samara RU Africa/Kigali RW Asia/Riyadh SA Pacific/Guadalcanal SB Indian/Mahe SC Africa/Khartoum SD Europe/Stockholm SE Asia/Singapore SG Atlantic/St_Helena SH Europe/Ljubljana SI Arctic/Longyearbyen SJ Atlantic/Jan_Mayen SJ Europe/Bratislava SK Africa/Freetown SL Europe/San_Marino SM Newman [Page 16] Internet Draft Date and Time January 1997 Africa/Dakar SN Africa/Mogadishu SO America/Paramaribo SR Africa/Sao_Tome ST America/El_Salvador SV Asia/Damascus SY Africa/Mbabane SZ America/Grand_Turk TC Africa/Ndjamena TD Indian/Kerguelen TF Africa/Lome TG Asia/Bangkok TH Asia/Dushanbe TJ Pacific/Fakaofo TK Asia/Ashkhabad TM Africa/Tunis TN Pacific/Tongatapu TO Europe/Istanbul TR America/Port_of_Spain TT Pacific/Funafuti TV Asia/Taipei TW Africa/Dar_es_Salaam TZ Europe/Kiev UA Europe/Simferopol UA Africa/Kampala UG Pacific/Johnston UM Pacific/Midway UM Pacific/Wake UM America/Adak US America/Anchorage US America/Boise US America/Chicago US America/Denver US America/Detroit US America/Indianapolis US America/Juneau US America/Los_Angeles US America/Louisville US America/Menominee US America/New_York US America/Nome US America/Phoenix US America/Shiprock US America/Yakutat US Pacific/Honolulu US America/Montevideo UY Asia/Tashkent UZ Europe/Vatican VA Newman [Page 17] Internet Draft Date and Time January 1997 America/St_Vincent VC America/Caracas VE America/Tortola VG America/St_Thomas VI Asia/Saigon VN Pacific/Efate VU Pacific/Wallis WF Pacific/Apia WS Asia/Aden YE Indian/Mayotte YT Europe/Belgrade YU Africa/Johannesburg ZA Africa/Lusaka ZM Africa/Kinshasa ZR Africa/Lubumbashi ZR Africa/Harare ZW 6.7. Local Date/Time Format The following format MAY be used to refer to future dates in a local timezone. This is defined based on the format in section 5.6. zone-char = ALPHA / DIGIT / "-" / "_" / "/" zone-name = 1*zone_char ; case insensitive interpretation offset-hint = time-numoffset local-datetime = full-date "T" partial-time " " zone-name [" " offset-hint] A local-datetime represents an event relative to a specific local timezone. The offset-hint represents the generator's prediction of what the UTC offset will be at that local time, and may become incorrect if the rules for the specified zone are changed. The offset-hint MAY be omitted if the generating program only knows local time, but the zone-name is REQUIRED. This format SHOULD NOT be used for timestamps or past events. 6.8. Examples Here are some examples of Local Date/Time Format: 1999-12-31T23:59:59 America/New_York -05:00 This represents a time one (or two if there's a leap second) second Newman [Page 18] Internet Draft Date and Time January 1997 before the year 2000 in the timezone used in New York City in North America (currently U.S. Eastern Time). The offset-hint is the number to add to the local time to get an estimate UTC for that date, so this will probably be equivalent to 2000-01-01T04:59:59Z. 2000-12-31T23:59:59 Australia/Adelaide +09:30 This represents a time one (or two if there's a leap second) second before the 21st century in Adelaide, Australia. The hint suggests that this will be equivalent to 2000-12-31T14:29:59Z. 2000-03-31T02:00:00 America/Los_Angeles -08:00 The represents a time of the 2nd hour on the 31st of March in Los Angeles, USA. The hint suggests that would be equivalent to 2000- 03-31T10:00:00Z. However, if the U.S. government were to adopt the daylight savings rules currently used by the European Union, which change daylight savings on the last Sunday of March, then the time would be equivalent to 2000-03-31T09:00:00Z. 7. Acknowledgements May thanks to the following people who have provided helpful advice for this document: Ned Freed, Neal McBurnett, David Keegel, Markus Kuhn, Paul Eggert and Robert Elz. Thanks are also due to participants of the IETF Calendaring/Scheduling working group mailing list, and participants of the timezone mailing list. 8. References [Zeller] Chr. Zeller, "Kalender-Formeln", Acta Mathematica, Vol. 9, Nov 1886. [IMAIL] Crocker, D., "Standard for the Format of Arpa Internet Text Messages", RFC 822, University of Delaware, August 1982. [ISO8601] "Data elements and interchange formats -- Information interchange -- Representation of dates and times", ISO 8601:1988(E), International Organization for Standardization, June, 1988. [HOST-REQ] Braden, R., "Requirements for Internet Hosts -- Application and Support", RFC 1123, Internet Engineering Task Force, October 1989. Newman [Page 19] Internet Draft Date and Time January 1997 [NTP] Mills, D., "Network Time Protocol (Version 3) Specification, Implementation and Analysis", RFC 1305, University of Delaware, March 1992. [ITU-R-TF] International Telecommunication Union Recommendations for Time Signals and Frequency Standards Emissions. 9. Security Considerations Since the local time zone of a site may be useful for determining a time when systems are less likely to be monitored and might be more susceptible to a security probe, some sites may wish to emit times in UTC only. Others might consider this to be loss of useful functionality at the hands of paranoia. 10. Author's Address Chris Newman Innosoft International, Inc. 1050 East Garvey Ave. South West Covina, CA 91790 USA Email: chris.newman@innosoft.com APPENDIX A. ISO 8601 Collected ABNF ISO 8601 does not specify a formal grammar for the date and time formats it defines. The following is an attempt to create a formal grammar from ISO 8601. This is informational only and may contain errors. ISO 8601 remains the authoratative reference. Note that due to ambiguities in ISO 8601, some interpretations had to be made. First, ISO 8601 is not clear if mixtures of basic and extended format are permissible. This grammar permits mixtures. ISO 8601 is not clear on whether an hour of 24 is permissible only if minutes and seconds are 0. This assumes that an hour of 24 is permissible in any context. Restrictions on date-mday in section 5.7 apply. ISO 8601 states that the "T" may be omitted under some circumstances. This grammar requires the "T" to avoid ambiguity. Newman [Page 20] Internet Draft Date and Time January 1997 ISO 8601 also requires (in section 5.3.1.3) that a decimal fraction be proceeded by a "0" if less than unity. Annex B.2 of ISO 8601 gives examples where the decimal fractions are not preceeded by a "0". This grammar assumes section 5.3.1.3 is correct and that Annex B.2 is in error. date-century = 2DIGIT ; 00-99 date-decade = DIGIT ; 0-9 date-subdecade = DIGIT ; 0-9 date-year = date-decade date-subdecade date-fullyear = date-century date-year date-month = 2DIGIT ; 01-12 date-wday = DIGIT ; 1-7 ; 1 is Monday, 7 is Sunday date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year date-yday = 3DIGIT ; 001-365, 001-366 based on year date-week = 2DIGIT ; 01-52, 01-53 based on year datepart-fullyear = [date-century] date-year ["-"] datepart-ptyear = "-" [date-subdecade ["-"]] datepart-wkyear = datepart-ptyear / datepart-fullyear dateopt-century = "-" / date-century dateopt-fullyear = "-" / datepart-fullyear dateopt-year = "-" / (date-year ["-"]) dateopt-month = "-" / (date-month ["-"]) dateopt-week = "-" / (date-week ["-"]) datespec-full = datepart-fullyear date-month ["-"] date-mday datespec-year = date-century / dateopt-century date-year datespec-month = "-" dateopt-year date-month [["-"] date-mday] datespec-mday = "--" dateopt-month date-mday datespec-week = datepart-wkyear "W" (date-week / dateopt-week date-wday) datespec-wday = "---" date-wday datespec-yday = dateopt-fullyear date-yday date = datespec-full / datespec-year / datespec-month / datespec-mday / datespec-week / datespec-wday / datespec-yday Time: time-hour = 2DIGIT ; 00-24 time-minute = 2DIGIT ; 00-59 time-second = 2DIGIT ; 00-59, 00-60 based on leap-second rules time-fraction = ("," / ".") 1*DIGIT time-numoffset = ("+" / "-") time-hour [[":"] time-minute] time-zone = "Z" / time-numoffset Newman [Page 21] Internet Draft Date and Time January 1997 timeopt-hour = "-" / (time-hour [":"]) timeopt-minute = "-" / (time-minute [":"]) timespec-hour = time-hour [[":"] time-minute [[":"] time-second]] timespec-minute = timeopt-hour time-minute [[":"] time-second] timespec-second = "-" timeopt-minute time-second timespec-base = timespec-hour / timespec-minute / timespec-second time = timespec-base [time-fraction] [time-zone] iso-date-time = date "T" time Durations (periods): dur-second = 1*DIGIT "S" dur-minute = 1*DIGIT "M" [dur-second] dur-hour = 1*DIGIT "H" [dur-minute] dur-time = "T" (dur-hour / dur-minute / dur-second) dur-day = 1*DIGIT "D" dur-week = 1*DIGIT "W" dur-month = 1*DIGIT "M" [dur-day] dur-year = 1*DIGIT "Y" [dur-month] dur-date = (dur-day / dur-month / dur-year) [dur-time] duration = "P" (dur-date / dur-time / dur-week) Periods: period-explicit = date-time "/" date-time period-start = date-time "/" duration period-end = duration "/" date-time period = period-explicit / period-start / period-end B. Day of the Week The following is a sample C subroutine loosly based on Zeller's Congruence [Zeller] which may be used to obtain the day of the week: Newman [Page 22] Internet Draft Date and Time January 1997 char *day_of_week(int day, int month, int year) { char *dayofweek[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; /* adjust months so February is the last one */ month -= 2; if (month < 1) { month += 12; --year; } /* split by century */ cent = year / 100; year %= 100; return (dayofweek[((26 * month - 2) / 10 + day + year + year / 4 + cent / 4 - 2 * cent) % 7]); } C. Leap Years Here's a sample C subroutine to calculate if a year is a leap year: /* This returns non-zero if year is a leap year. Must use 4 digit year. */ int leap_year(int year) { return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); } Newman [Page 23]