SDS Time Data Type and Representations of Dates and Times

SOI TN 94-116

R S Bogart

1994.06.30_15:59:60_PST

N.B. This document has been superseded by JSOC TN-07-001

1. Description of the SDS_TIME Data Type

The SOI dataset structure (SDS) recognizes a data type SDS_TIME along with the standard numeric, boolean, and character string data types. Internally, data of type SDS_TIME are equivalent to data of type SDS_DOUBLE, i.e, they are stored as IEEE double-precision floating-point numbers, and obey all the rules of floating-point arithmetic. The rules that apply to representation of missing data of type SDS_DOUBLE also apply to data of type SDS_TIME.

Physically, data of type SDS_TIME are to be taken as representing in double-precision floating point format, the elapsed time measured in Système International (SI) seconds from a standard epoch. The epoch is chosen as the instant at which the year 1977 as recorded under Temps Atomique International (TAI) began: 00:00:00.0 on Jan 1, 1977 (TAI). This epoch is selected because it is the epoch used by the IAU for the definition of dynamical time (used by the Astronomical Almanac and by NASA).

Representation of times as IEEE double-precision numbers provides a relative numeric precision of 2 * 10-16, which is roughly two orders of magnitude better than the estimated accuracy of atomic clocks; it should thus be adequate for representation of all absolute times. For times within about 36 years of the epoch (1941 < year < 2013), that translates to an absolute accuracy of 0.1 usec. It also allows for an absolute accuracy of 27 sec for all times in the age of the solar system (± 4.5 Gyr). If greater accuracy is required, for example in the measurements of elapsed time, then we suggest using type SDS_DOUBLE to represent elapsed times referred to an arbitrary epoch; if the epoch is within one day of the time specified, then time intervals can be thus expressed to an accuracy of 26 psec (0.6 cm).

2. Representation of Dates and Times

The expression of dates and times externally is complicated by the dual aims of supporting a broad variety of "natural" representations and of being able to use multiple time scales. The representations should include customary designations of year. month, day of month, hour, minute, second as well as the less common but useful designations of day of year, Julian day number, and Carrington rotation. The time scales supported must include, besides TAI, Terrestrial Time (or Terrestrial Dynamical Time) (TT, TDT), (Coordinated) Universal Time (UT, UTC), Ephemeris Time (ET) and Civil (Zone) Time. It is important also to distinguish the representations accepted in the environment of SOI software, i.e. key values and parameter values, from the representations required or allowed in various formats for the external representation of data, such as FITS.

TDT differs from TAI by a variable amount, but for times of interest the difference is within 10 usec of its exact value at the 1977.0 TAI epoch of 32.184 sec = 0.0003725 day. For our purposes we will define TT = TAI + 32.184 sec.

The correspondence between Coordinated Universal Time (UTC), upon which all civil times are based, and TAI is even more complicated. Since 1972, it has been based on intercalation of whole seconds immediately prior to the commencement of Jan. 1 or Jul. 1 at intervals selected so that the accumulated difference between observed Universal Time (UT1) and UTC does not exceed 0.9 second at the time of intercalation. In principle seconds can be intercalated (or dropped) at the quarters of the year as well. Since the adjustment is based on observations and since the rotation rate of the Earth is not constant, it is not possible to predict with absolute accuracy when future adjustments will have to be made (also, there is no fixed formula for deciding when to intercalate). Furthermore, prior to 1972, the adjustments were made more frequently and the allowed accumulated differences were much smaller. For our purposes, however, it should be sufficient to use a fictitious UTC based on past projection of the present formula for intercalation. Adjustment dates should be made according to table 1. Prior to 1960.0 there should be no difference between TAI and UTC. I don't know what to do about dates after 2005.0. Neglecting secular deceleration of the Earth it is clear that the present rate is consistent with an average correction rate of one second per year. It is best when referring to both future times and times in the distant past to use dynamical or atomic time.

Two alternative forms are available for full specification of a time. One uses the Julian Day number or modified Julian Day number and fraction to represent the time as a virtual floating-point number (although not the internal number); the other specifies the time in customary calendar date / time of day format.

A fully specified time in the Julian Day notation is of the form:

{MJD|JD}_X[.Y][_{TAI|TT|TDT|UT|UTC}]

The notation is that square brackets [] enclose optional fields, braces {} enclose sets of alternative symbols which are separated by vertical bars |, and the characters X and Y are to be replaced by numeric values representing respectively the day number and the fraction of a day, where a day is 86400 TAI seconds except when the time scale is Universal Time and the day happens to be one in which a leap second occurs. I don't know what to do about that case.

The initial string designates whether the day number X, the integer part of the real number, is a Julian Day or a Modified Julian Day. The optional string at the end specifies which time scale is referred to. The default is that Terrestrial Time (TT or TDT) is assumed. Thus the following forms are all valid as Julian Day representations of the same time:

JD_2450000

JD_2450000.25_TT

JD_2450000.2496275_TAI

MJD_49999.75_TDT

Note that TAI and TT are the only sensible time scales to use with this representation, as they are the only ones in which a day is always equal to 86,400 seconds (by definition).

A fully specified time in the Calendar Date / Time of Day notation is of the form:

{YYYY|YY}.{L|R|nnn}.D[{.X|_HH:MM[:SS[.Y]]}[_{TAI|TT|TDT|UT|UTC|zone}]]

In this notation, the initial two- or four-digit integer represents the year number of the Common Era (ce or AD). Negative integers are used for dates before the Common Era (BC) despite the fact that there is no year 0. If the year number is a two digit number greater than 9, it should be interpreted as the year number minus 1900; two digit numbers less than 10 should be interpreted as the year number minus 2000. Years earlier than 1000 AD should be expressed as four-digit integers with leading zeroes.

The second field represents the month number or name. It is either an integer in the range [1, 12], the Roman numeral for such an integer, or a three-letter designation for the month consisting of the the first three letters of its English name. (The Roman numeral and the three-letter designation can be in any combination of upper and lower case). Leading zeroes in the integer representation are optional.

The third field is the day number of the month, an integer. The use of day numbers less than 1 or greater than the length of the month should be discouraged, as in certain cases it can lead to erroneous results.

The fourth field of the date can be either an integer representing the fraction of the 86,400 second TAI day or a composite field for the clock time of day. As before, the use of fractional day designations with time scales other than TAI or TT should be avoided. The clock time is expressed in the customary colon-separated fields, with an optional decimal point and fractional part of a second. Note that the third (second) field of the clock time itself is optional (but not the second (minute) field); if absent it is assumed to be 0. Leading zeroes to make each integer field two-digits long are encouraged but not required. Times should be expressed in 24-hour time, not 12-hour meridian time. On days when leap seconds occur in time scales based on earth rotation (UT and civil time), the extra second should be expressed as time 23:59:60. For this reason, the use of hour, minute, and second numbers beyond the normal range ([0,23], [0,59], and [0,59] or [0,60]) should be avoided. If the fourth field is absent its value is assumed to be 0 (or 00:00:00.0).

The final (optional) field, beginning with an underscore ("_"), is a string designating the time scale. Upper-case characters are preferred but not required. If the time scale designation is not provided, the default is to interpret the date time as in Universal Time (UT, UTC). If zone time is used, no check for agreement with civil time is implied; the date-time 1995.07.27_12:00:00_MST is valid and refers to the same instant regardless of whether the event referred to (if any) occurs in Colorado, Arizona, or Sonora. Valid values for the zone time string are listed in Table 2. The following strings should all be valid representations of the same time:

1995.10.09_18:00:00

1995.X.09_18:00:00.0_UT

1995.10.09_18:00:29.0_TAI

1995.10.09_18:01:01.184_TT

95.Oct.9.7500_Z

1995.10.09_10:00:00_PST

It should be noted that these formats are not consistent with the ANSI and ISO standards for representation of date and time of day. In the event that dates and times in standard formats are encountered, we should be prepared to translate them. In particular all-numeric and hyphen separated strings, commas used for the decimal point, and civil time differentials, of the forms

19951009-180000

1995-10-09-18-00-00,0

19951009200000+0200

could all be employed consistent with standards. These should be handled as needed. (The same remark applies to civil time designations and alphabetic and Roman numeral month designators; their use should be discouraged.)

In calendric calculations, the Gregorian reckoning (400 years = 146097 days) is to be used for all dates on or after 1582.10.15.0 = JD_2299160.5. For all dates prior to this the proleptic Julian reckoning (4 years = 1461 days) is to be used. The second immediately preceeding JD_2299160.5 is designated 1582.10.04_23:59:59.

Designation of times with time differential notation (e.g. 95.1.1_142350+0500) is not included in this revision. Neither is representation by Carrington times or longitudes, e.g. CR_1336.59 or CL_1337.184.

It should be noted that these notes apply exclusively to the reprentations of dates and times within the SOI analysis environment, as for example in module argument lists. FITS does not recognize a data type of type "Time" for either data or data attributes. The FITS standard does reserve certain keywords for the representation of loosely-defined dates (days only) as character strings (e.g. DATE-OBS) , and of reference times as floating-point numbers (e.g. EPOCH). CDF does define an "EPOCH" data type similar to the present definition, but also loosely defined in terms of the reference calendar and time scale. The standard representation for EPOCH data types in CDF,

9-Oct-1995 10:00:00.000

is unsuitable for SOI environment use because of the embedded space and because of the lack of flexibility in specifying the time scale. When encoded in external data representations, SDS_TIME data must be encoded as character strings, with information on their appropriate parsing as dates and times based on registration of the relevant keywords as being of type SDS_TIME. This only applies to data attributes. Data values themselves are of course represented as double-precision numbers.

For the sake of preserving time representation information, it may be necessary to set up a pair of reserved keywords for the project:

keyword TIMETYPE:
ET, TAI, TDT, TT, GMT*, UT, UTC, UT1*, GMAT*, LCT*, UT2*

keyword TIMEZONE:
A-I,K-Z, PST etc., +{1-12}, 0, -{1-12}


Table 1: Dates and times of adjustments in UTC

(Except for the first two entries, the extra second occurs one second prior to the time of each entry.)

(a) fictitious
1959.12.31_23:59:59_UTC = 1959.12.31_23:59:59_TAI

1959.12.31_23:59:60_UTC = 1960.01.01_00:00:00_TAI

1960.01.01_00:00:00_UTC = 1960.01.01_00:00:01_TAI

1962.07.01_00:00:00_UTC = 1962.07.01_00:00:02_TAI

1964.07.01_00:00:00_UTC = 1964.07.01_00:00:03_TAI

1965.07.01_00:00:00_UTC = 1965.07.01_00:00:04_TAI

1966.07.01_00:00:00_UTC = 1966.07.01_00:00:05_TAI

1968.01.01_00:00:00_UTC = 1968.01.01_00:00:06_TAI

1969.01.01_00:00:00_UTC = 1969.01.01_00:00:07_TAI

1970.01.01_00:00:00_UTC = 1970.01.01_00:00:08_TAI

1971.01.01_00:00:00_UTC = 1971.01.01_00:00:09_TAI

(b) actual
1972.01.01_00:00:00_UTC = 1972.01.01_00:00:10_TAI

1972.07.01_00:00:00_UTC = 1972.07.01_00:00:11_TAI

1973.01.01_00:00:00_UTC = 1973.01.01_00:00:12_TAI

1974.01.01_00:00:00_UTC = 1974.01.01_00:00:13_TAI

1975.01.01_00:00:00_UTC = 1975.01.01_00:00:14_TAI

1976.01.01_00:00:00_UTC = 1976.01.01_00:00:15_TAI

1977.01.01_00:00:00_UTC = 1977.01.01_00:00:16_TAI

1978.01.01_00:00:00_UTC = 1978.01.01_00:00:17_TAI

1979.01.01_00:00:00_UTC = 1979.01.01_00:00:18_TAI

1980.01.01_00:00:00_UTC = 1980.01.01_00:00:19_TAI

1981.07.01_00:00:00_UTC = 1981.07.01_00:00:20_TAI

1982.07.01_00:00:00_UTC = 1982.07.01_00:00:21_TAI

1983.07.01_00:00:00_UTC = 1983.07.01_00:00:22_TAI

1985.07.01_00:00:00_UTC = 1985.07.01_00:00:23_TAI

1988.01.01_00:00:00_UTC = 1988.01.01_00:00:24_TAI

1990.01.01_00:00:00_UTC = 1990.01.01_00:00:25_TAI

1991.01.01_00:00:00_UTC = 1991.01.01_00:00:26_TAI

1992.07.01_00:00:00_UTC = 1992.07.01_00:00:27_TAI

1993.07.01_00:00:00_UTC = 1993.07.01_00:00:28_TAI

1994.07.01_00:00:00_UTC = 1994.07.01_00:00:29_TAI

(c) projected
1996.01.01_00:00:00_UTC = 1996.01.01_00:00:30_TAI

1997.01.01_00:00:00_UTC = 1997.01.01_00:00:31_TAI

1998.01.01_00:00:00_UTC = 1998.01.01_00:00:32_TAI

1999.01.01_00:00:00_UTC = 1999.01.01_00:00:33_TAI

2000.01.01_00:00:00_UTC = 2000.01.01_00:00:34_TAI

2001.01.01_00:00:00_UTC = 2001.01.01_00:00:35_TAI

2002.01.01_00:00:00_UTC = 2002.01.01_00:00:36_TAI

2003.01.01_00:00:00_UTC = 2003.01.01_00:00:37_TAI

2004.01.01_00:00:00_UTC = 2004.01.01_00:00:38_TAI

2005.01.01_00:00:00_UTC = 2005.01.01_00:00:39_TAI


Table 2: Valid Civil Time Zone Designations

Abbrev.   Zone (UTC)    Abbrev.   Zone (UTC)    Abbrev.   Zone (UTC)

U, PST, YDT     -8      Z, GMT, WET      0      H, SST, WST       8
T, MST, PDT     -7      A, CET, BST      1      I, JST            9
S, CST, MDT     -6      B, EET           2      K, JDT           10
R, EST, CDT     -5      C                3      L                11
Q, AST, EDT     -4      D                4      M, NZST          12
P, ADT          -3      E                5      X, BST          -11
O               -2      F                6      W, HST, BDT     -10
N               -1      G                7      V, YST, HDT      -9
                                                NZDT             13
                                                Y               -12


References:

ANSI standard X3.30-1985: Representation for calendar date and ordinal date for information interchange. 1985-07-30

ANSI standard X3.43-1986: Representations of local time of day for information interchange. 1985-06-23

ANSI standard X3.51-1986: Representations of universal time, local time differentials, and United States time zone references for information interchange. 1986-06-23

Explanatory Supplement to the Astronomical Almanac, ed. K. Seidelmann, 1992.

ISO standard 2014: Writing of calendar dates in all-numeric form. 1976-04-01

ISO standard 3307: Information interchange - Representation of time of the day. 1975-03-15

ISO standard 4031: Information interchange - Representation of local time differentials. 1978-12-15

McCarthy, D.M., US Naval Observatory, private communication.

NOST Standard 100-1.0: Definition of the Flexible Image Transport System (FITS)

NSSDC: CDF Users Guide, Version 2.4, 1994.