From 459b72d3edec98488e5132d4473c4678b4ed5a73 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Mon, 12 Aug 2013 23:58:29 -0700 Subject: [PATCH] Generate the 'leapseconds' file automatically from leap-seconds.list. * leap-seconds.list: New file, copied from the NIST. * leapseconds: Remove from git; it's now generated. * leapseconds.awk: New file. * Makefile (DATA): Add leap-seconds.list. Remove leapseconds. (MISC): Add leapseconds.awk. (leapseconds): New rule. (right_posix, posix_right): Depend on leapseconds. (clean_misc): Remove leapseconds. --- Makefile | 14 ++- leap-seconds.list | 231 ++++++++++++++++++++++++++++++++++++++++++++++ leapseconds | 100 -------------------- leapseconds.awk | 68 ++++++++++++++ 4 files changed, 308 insertions(+), 105 deletions(-) create mode 100644 leap-seconds.list delete mode 100644 leapseconds create mode 100644 leapseconds.awk diff --git a/Makefile b/Makefile index db7f56e..68d7132 100644 --- a/Makefile +++ b/Makefile @@ -318,10 +318,11 @@ NDATA= systemv factory SDATA= solar87 solar88 solar89 TDATA= $(YDATA) $(NDATA) $(SDATA) TABDATA= iso3166.tab zone.tab -DATA= $(YDATA) $(NDATA) $(SDATA) $(TABDATA) leapseconds yearistype.sh +DATA= $(YDATA) $(NDATA) $(SDATA) $(TABDATA) \ + leap-seconds.list yearistype.sh WEB_PAGES= tz-art.htm tz-link.htm MISC= usno1988 usno1989 usno1989a usno1995 usno1997 usno1998 \ - $(WEB_PAGES) checktab.awk workman.sh \ + $(WEB_PAGES) checktab.awk leapseconds.awk workman.sh \ zoneinfo2tdf.pl ENCHILADA= $(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC) @@ -375,6 +376,9 @@ yearistype: yearistype.sh cp yearistype.sh yearistype chmod +x yearistype +leapseconds: leapseconds.awk leap-seconds.list + $(AWK) -f leapseconds.awk leap-seconds.list >$@ + posix_only: zic $(TDATA) $(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L /dev/null $(TDATA) @@ -390,14 +394,14 @@ right_only: zic leapseconds $(TDATA) # Therefore, the other two directories are now siblings of $(TZDIR). # You must replace all of $(TZDIR) to switch from not using leap seconds # to using them, or vice versa. -right_posix: right_only +right_posix: right_only leapseconds rm -fr $(TZDIR)-leaps ln -s $(TZDIR_BASENAME) $(TZDIR)-leaps || \ $(ZIC) -y $(YEARISTYPE) \ -d $(TZDIR)-leaps -L leapseconds $(TDATA) $(ZIC) -y $(YEARISTYPE) -d $(TZDIR)-posix -L /dev/null $(TDATA) -posix_right: posix_only +posix_right: posix_only leapseconds rm -fr $(TZDIR)-posix ln -s $(TZDIR_BASENAME) $(TZDIR)-posix || \ $(ZIC) -y $(YEARISTYPE) \ @@ -440,7 +444,7 @@ check_web: $(WEB_PAGES) clean_misc: rm -f core *.o *.out \ - date tzselect version.h zdump zic yearistype + date leapseconds tzselect version.h zdump zic yearistype clean: clean_misc rm -f -r tzpublic diff --git a/leap-seconds.list b/leap-seconds.list new file mode 100644 index 0000000..7df3de6 --- /dev/null +++ b/leap-seconds.list @@ -0,0 +1,231 @@ +# +# In the following text, the symbol '#' introduces +# a comment, which continues from that symbol until +# the end of the line. A plain comment line has a +# whitespace character following the comment indicator. +# There are also special comment lines defined below. +# A special comment will always have a non-whitespace +# character in column 2. +# +# A blank line should be ignored. +# +# The following table shows the corrections that must +# be applied to compute International Atomic Time (TAI) +# from the Coordinated Universal Time (UTC) values that +# are transmitted by almost all time services. +# +# The first column shows an epoch as a number of seconds +# since 1900.0 and the second column shows the number of +# seconds that must be added to UTC to compute TAI for +# any timestamp at or after that epoch. The value on +# each line is valid from the indicated initial instant +# until the epoch given on the next one or indefinitely +# into the future if there is no next line. +# (The comment on each line shows the representation of +# the corresponding initial epoch in the usual +# day-month-year format. The epoch always begins at +# 00:00:00 UTC on the indicated day. See Note 5 below.) +# +# Important notes: +# +# 1. Coordinated Universal Time (UTC) is often referred to +# as Greenwich Mean Time (GMT). The GMT time scale is no +# longer used, and the use of GMT to designate UTC is +# discouraged. +# +# 2. The UTC time scale is realized by many national +# laboratories and timing centers. Each laboratory +# identifies its realization with its name: Thus +# UTC(NIST), UTC(USNO), etc. The differences among +# these different realizations are typically on the +# order of a few nanoseconds (i.e., 0.000 000 00x s) +# and can be ignored for many purposes. These differences +# are tabulated in Circular T, which is published monthly +# by the International Bureau of Weights and Measures +# (BIPM). See www.bipm.fr for more information. +# +# 3. The current defintion of the relationship between UTC +# and TAI dates from 1 January 1972. A number of different +# time scales were in use before than epoch, and it can be +# quite difficult to compute precise timestamps and time +# intervals in those "prehistoric" days. For more information, +# consult: +# +# The Explanatory Supplement to the Astronomical +# Ephemeris. +# or +# Terry Quinn, "The BIPM and the Accurate Measurement +# of Time," Proc. of the IEEE, Vol. 79, pp. 894-905, +# July, 1991. +# +# 4. The insertion of leap seconds into UTC is currently the +# responsibility of the International Earth Rotation Service, +# which is located at the Paris Observatory: +# +# Central Bureau of IERS +# 61, Avenue de l'Observatoire +# 75014 Paris, France. +# +# Leap seconds are announced by the IERS in its Bulletin C +# +# See hpiers.obspm.fr or www.iers.org for more details. +# +# All national laboratories and timing centers use the +# data from the BIPM and the IERS to construct their +# local realizations of UTC. +# +# Although the definition also includes the possibility +# of dropping seconds ("negative" leap seconds), this has +# never been done and is unlikely to be necessary in the +# foreseeable future. +# +# 5. If your system keeps time as the number of seconds since +# some epoch (e.g., NTP timestamps), then the algorithm for +# assigning a UTC time stamp to an event that happens during a positive +# leap second is not well defined. The official name of that leap +# second is 23:59:60, but there is no way of representing that time +# in these systems. +# Many systems of this type effectively stop the system clock for +# one second during the leap second and use a time that is equivalent +# to 23:59:59 UTC twice. For these systems, the corresponding TAI +# timestamp would be obtained by advancing to the next entry in the +# following table when the time equivalent to 23:59:59 UTC +# is used for the second time. Thus the leap second which +# occurred on 30 June 1972 at 23:59:59 UTC would have TAI +# timestamps computed as follows: +# +# ... +# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds +# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds +# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds +# ... +# +# If your system realizes the leap second by repeating 00:00:00 UTC twice +# (this is possible but not usual), then the advance to the next entry +# in the table must occur the second time that a time equivlent to +# 00:00:00 UTC is used. Thus, using the same example as above: +# +# ... +# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds +# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds +# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds +# ... +# +# in both cases the use of timestamps based on TAI produces a smooth +# time scale with no discontinuity in the time interval. +# +# This complexity would not be needed for negative leap seconds (if they +# are ever used). The UTC time would skip 23:59:59 and advance from +# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by +# 1 second at the same instant. This is a much easier situation to deal +# with, since the difficulty of unambiguously representing the epoch +# during the leap second does not arise. +# +# Questions or comments to: +# Judah Levine +# Time and Frequency Division +# NIST +# Boulder, Colorado +# jlevine@boulder.nist.gov +# +# Last Update of leap second values: 11 January 2012 +# +# The following line shows this last update date in NTP timestamp +# format. This is the date on which the most recent change to +# the leap second data was added to the file. This line can +# be identified by the unique pair of characters in the first two +# columns as shown below. +# +#$ 3535228800 +# +# The NTP timestamps are in units of seconds since the NTP epoch, +# which is 1900.0. The Modified Julian Day number corresponding +# to the NTP time stamp, X, can be computed as +# +# X/86400 + 15020 +# +# where the first term converts seconds to days and the second +# term adds the MJD corresponding to 1900.0. The integer portion +# of the result is the integer MJD for that day, and any remainder +# is the time of day, expressed as the fraction of the day since 0 +# hours UTC. The conversion from day fraction to seconds or to +# hours, minutes, and seconds may involve rounding or truncation, +# depending on the method used in the computation. +# +# The data in this file will be updated periodically as new leap +# seconds are announced. In addition to being entered on the line +# above, the update time (in NTP format) will be added to the basic +# file name leap-seconds to form the name leap-seconds.. +# In addition, the generic name leap-seconds.list will always point to +# the most recent version of the file. +# +# This update procedure will be performed only when a new leap second +# is announced. +# +# The following entry specifies the expiration date of the data +# in this file in units of seconds since 1900.0. This expiration date +# will be changed at least twice per year whether or not a new leap +# second is announced. These semi-annual changes will be made no +# later than 1 June and 1 December of each year to indicate what +# action (if any) is to be taken on 30 June and 31 December, +# respectively. (These are the customary effective dates for new +# leap seconds.) This expiration date will be identified by a +# unique pair of characters in columns 1 and 2 as shown below. +# In the unlikely event that a leap second is announced with an +# effective date other than 30 June or 31 December, then this +# file will be edited to include that leap second as soon as it is +# announced or at least one month before the effective date +# (whichever is later). +# If an announcement by the IERS specifies that no leap second is +# scheduled, then only the expiration date of the file will +# be advanced to show that the information in the file is still +# current -- the update time stamp, the data and the name of the file +# will not change. +# +# Updated through IERS Bulletin C46 +# File expires on: 28 June 2014 +# +#@ 3612902400 +# +2272060800 10 # 1 Jan 1972 +2287785600 11 # 1 Jul 1972 +2303683200 12 # 1 Jan 1973 +2335219200 13 # 1 Jan 1974 +2366755200 14 # 1 Jan 1975 +2398291200 15 # 1 Jan 1976 +2429913600 16 # 1 Jan 1977 +2461449600 17 # 1 Jan 1978 +2492985600 18 # 1 Jan 1979 +2524521600 19 # 1 Jan 1980 +2571782400 20 # 1 Jul 1981 +2603318400 21 # 1 Jul 1982 +2634854400 22 # 1 Jul 1983 +2698012800 23 # 1 Jul 1985 +2776982400 24 # 1 Jan 1988 +2840140800 25 # 1 Jan 1990 +2871676800 26 # 1 Jan 1991 +2918937600 27 # 1 Jul 1992 +2950473600 28 # 1 Jul 1993 +2982009600 29 # 1 Jul 1994 +3029443200 30 # 1 Jan 1996 +3076704000 31 # 1 Jul 1997 +3124137600 32 # 1 Jan 1999 +3345062400 33 # 1 Jan 2006 +3439756800 34 # 1 Jan 2009 +3550089600 35 # 1 Jul 2012 +# +# the following special comment contains the +# hash value of the data in this file computed +# use the secure hash algorithm as specified +# by FIPS 180-1. See the files in ~/pub/sha for +# the details of how this hash value is +# computed. Note that the hash computation +# ignores comments and whitespace characters +# in data lines. It includes the NTP values +# of both the last modification time and the +# expiration time of the file, but not the +# white space on those lines. +# the hash line is also ignored in the +# computation. +# +#h 1151a8f e85a5069 9000fcdb 3d5e5365 1d505b37 diff --git a/leapseconds b/leapseconds deleted file mode 100644 index 5b5c70e..0000000 --- a/leapseconds +++ /dev/null @@ -1,100 +0,0 @@ -#
-# This file is in the public domain, so clarified as of
-# 2009-05-17 by Arthur David Olson.
-
-# Allowance for leapseconds added to each timezone file.
-
-# The International Earth Rotation Service periodically uses leap seconds
-# to keep UTC to within 0.9 s of UT1
-# (which measures the true angular orientation of the earth in space); see
-# Terry J Quinn, The BIPM and the accurate measure of time,
-# Proc IEEE 79, 7 (July 1991), 894-905.
-# There were no leap seconds before 1972, because the official mechanism
-# accounting for the discrepancy between atomic time and the earth's rotation
-# did not exist until the early 1970s.
-
-# The correction (+ or -) is made at the given time, so lines
-# will typically look like:
-#	Leap	YEAR	MON	DAY	23:59:60	+	R/S
-# or
-#	Leap	YEAR	MON	DAY	23:59:59	-	R/S
-
-# If the leapsecond is Rolling (R) the given time is local time
-# If the leapsecond is Stationary (S) the given time is UTC
-
-# Leap	YEAR	MONTH	DAY	HH:MM:SS	CORR	R/S
-Leap	1972	Jun	30	23:59:60	+	S
-Leap	1972	Dec	31	23:59:60	+	S
-Leap	1973	Dec	31	23:59:60	+	S
-Leap	1974	Dec	31	23:59:60	+	S
-Leap	1975	Dec	31	23:59:60	+	S
-Leap	1976	Dec	31	23:59:60	+	S
-Leap	1977	Dec	31	23:59:60	+	S
-Leap	1978	Dec	31	23:59:60	+	S
-Leap	1979	Dec	31	23:59:60	+	S
-Leap	1981	Jun	30	23:59:60	+	S
-Leap	1982	Jun	30	23:59:60	+	S
-Leap	1983	Jun	30	23:59:60	+	S
-Leap	1985	Jun	30	23:59:60	+	S
-Leap	1987	Dec	31	23:59:60	+	S
-Leap	1989	Dec	31	23:59:60	+	S
-Leap	1990	Dec	31	23:59:60	+	S
-Leap	1992	Jun	30	23:59:60	+	S
-Leap	1993	Jun	30	23:59:60	+	S
-Leap	1994	Jun	30	23:59:60	+	S
-Leap	1995	Dec	31	23:59:60	+	S
-Leap	1997	Jun	30	23:59:60	+	S
-Leap	1998	Dec	31	23:59:60	+	S
-Leap	2005	Dec	31	23:59:60	+	S
-Leap	2008	Dec	31	23:59:60	+	S
-Leap	2012	Jun	30	23:59:60	+	S
-
-# INTERNATIONAL EARTH ROTATION AND REFERENCE SYSTEMS SERVICE (IERS)
-#
-# SERVICE INTERNATIONAL DE LA ROTATION TERRESTRE ET DES SYSTEMES DE REFERENCE
-#
-#
-# SERVICE DE LA ROTATION TERRESTRE
-# OBSERVATOIRE DE PARIS
-# 61, Av. de l'Observatoire 75014 PARIS (France)
-# Tel.      : 33 (0) 1 40 51 22 26
-# FAX       : 33 (0) 1 40 51 22 91
-# e-mail    : (E-Mail Removed)
-# http://hpiers.obspm.fr/eop-pc
-#
-# Paris, 5 January 2012
-#
-#
-# Bulletin C 43
-#
-# To authorities responsible
-# for the measurement and
-# distribution of time
-#
-#
-# UTC TIME STEP
-# on the 1st of July 2012
-#
-#
-# A positive leap second will be introduced at the end of June 2012.
-# The sequence of dates of the UTC second markers will be:
-#
-#                          2012 June 30,     23h 59m 59s
-#                          2012 June 30,     23h 59m 60s
-#                          2012 July  1,      0h  0m  0s
-#
-# The difference between UTC and the International Atomic Time TAI is:
-#
-# from 2009 January 1, 0h UTC, to 2012 July 1  0h UTC  : UTC-TAI = - 34s
-# from 2012 July 1,    0h UTC, until further notice    : UTC-TAI = - 35s
-#
-# Leap seconds can be introduced in UTC at the end of the months of December
-# or June, depending on the evolution of UT1-TAI. Bulletin C is mailed every
-# six months, either to announce a time step in UTC or to confirm that there
-# will be no time step at the next possible date.
-#
-#
-# Daniel GAMBIS
-# Head
-# Earth Orientation Center of IERS
-# Observatoire de Paris, France
diff --git a/leapseconds.awk b/leapseconds.awk
new file mode 100644
index 0000000..732db99
--- /dev/null
+++ b/leapseconds.awk
@@ -0,0 +1,68 @@
+# Generate the 'leapseconds' file from 'leap-seconds.list'.
+
+# This file is in the public domain.
+
+BEGIN {
+    printf "%s", "\
+# Allowance for leapseconds added to each timezone file.\n\
+\n\
+# This file is in the public domain.\n\
+\n\
+# This file is generated automatically from the data in the public-domain\n\
+# leap-seconds.list file available from most NIST time servers.\n\
+# If the URL  does not work,\n\
+# you should be able to pick up leap-seconds.list from a secondary NIST server.\n\
+# For more about leap-seconds.list, please see\n\
+# The NTP Timescale and Leap Seconds\n\
+# .\n\
+\n\
+# The International Earth Rotation Service periodically uses leap seconds\n\
+# to keep UTC to within 0.9 s of UT1\n\
+# (which measures the true angular orientation of the earth in space); see\n\
+# Terry J Quinn, The BIPM and the accurate measure of time,\n\
+# Proc IEEE 79, 7 (July 1991), 894-905 .\n\
+# There were no leap seconds before 1972, because the official mechanism\n\
+# accounting for the discrepancy between atomic time and the earth's rotation\n\
+# did not exist until the early 1970s.\n\
+\n\
+# The correction (+ or -) is made at the given time, so lines\n\
+# will typically look like:\n\
+#	Leap	YEAR	MON	DAY	23:59:60	+	R/S\n\
+# or\n\
+#	Leap	YEAR	MON	DAY	23:59:59	-	R/S\n\
+\n\
+# If the leapsecond is Rolling (R) the given time is local time.\n\
+# If the leapsecond is Stationary (S) the given time is UTC.\n\
+\n\
+# Leap	YEAR	MONTH	DAY	HH:MM:SS	CORR	R/S\n\
+"
+}
+
+/^ *$/ { next }
+/^#/ { next }
+
+{
+    NTP_timestamp = $1
+    TAI_minus_UTC = $2
+    hash_mark = $3
+    one = $4
+    month = $5
+    year = $6
+    if (old_TAI_minus_UTC) {
+	if (old_TAI_minus_UTC < TAI_minus_UTC) {
+	    sign = "23:59:60\t+"
+	} else {
+	    sign = "23:59:59\t-"
+	}
+	if (month == "Jan") {
+	    year--;
+	    month = "Dec";
+	    day = 31
+	} else if (month == "Jul") {
+	    month = "Jun";
+	    day = 30
+	}
+	printf "Leap\t%s\t%s\t%s\t%s\tS\n", year, month, day, sign
+    }
+    old_TAI_minus_UTC = TAI_minus_UTC
+}