[tz] [PATCH] New file 'pre1970' for zones that differ only in pre-1970 time stamps.
Paul Eggert
eggert at cs.ucla.edu
Fri Aug 30 08:09:13 UTC 2013
This lets us preserve information about pre-1970 time stamps when
we change a Zone to a Link to another zone whose time stamps agree
after 1970. This should address concerns about some recent
changes that removed this information. This implementation is a
stripped-down version of a suggestion by Andrew Main (Zefram) in
<http://mm.icann.org/pipermail/tz/2013-August/019615.html> and
<http://mm.icann.org/pipermail/tz/2013-August/019639.html> to
allow filtering tz data by date range. Unlike Zefram's
suggestion, this implementation supports only two date ranges,
namely 1970 on, using 'make BACKWARD=backward'; and all dates,
using 'make BACKWARD="pre1970 back-pre1970"'. At some point I'd
like to improve it to support arbitrary date ranges, but at least
we've now restored the data whose loss was of some concern.
* .gitignore: Add back-pre1970.
* Makefile (BACKWARD): New macro.
(YDATA): Use it instead of 'backward'.
(AWK_SCRIPTS): New macro, with additional script back-pre1970.awk.
(MISC): Use it.
(back-pre1970): New rule.
(clean_misc): Clean back-pre1970. Also clean time.tab, while we're
at it.
(check_public): Don't require pre1970 to stand alone.
* pre1970, back-pre1970.awk: New files.
---
.gitignore | 1 +
Makefile | 32 +++++-
back-pre1970.awk | 18 ++++
pre1970 | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 337 insertions(+), 5 deletions(-)
create mode 100644 back-pre1970.awk
create mode 100644 pre1970
diff --git a/.gitignore b/.gitignore
index 18dbbcc..28b1bc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
*.txt
*~
ChangeLog
+back-pre1970
date
leapseconds
time.tab
diff --git a/Makefile b/Makefile
index a74d1a7..ffddb08 100644
--- a/Makefile
+++ b/Makefile
@@ -49,6 +49,22 @@ POSIXRULES= America/New_York
ZONETABTYPE= zone
+# How to support obsolescent time zones in a backward-compatible way.
+# This variable affects only pre-1970 time stamps, on hosts that support them.
+# It has two possible values, 'backward' and 'pre1970 back-pre1970'.
+#
+# 'backward' is the traditional approach, and is simpler and more efficient;
+# it is designed to generate one zone for each region where clocks have agreed
+# since 1970.
+#
+# 'pre1970 back-pre1970' can generate more than one zone in that situation,
+# which means it can preserve a bit of pre-1970 data that 'backward' does not;
+# almost all pre-1970 data is missing, though, so don't get your hopes up.
+#
+# Sometimes 'backward' is more-compatible with earlier versions of this database,
+# and sometimes 'pre1970 back-pre1970' is; it depends on the situation.
+BACKWARD= backward
+
# Also see TZDEFRULESTRING below, which takes effect only
# if the time zone files cannot be accessed.
@@ -322,7 +338,7 @@ COMMON= Makefile
DOCS= README Theory $(MANS) date.1
PRIMARY_YDATA= africa antarctica asia australasia \
europe northamerica southamerica
-YDATA= $(PRIMARY_YDATA) pacificnew etcetera backward
+YDATA= $(PRIMARY_YDATA) pacificnew etcetera $(BACKWARD)
NDATA= systemv factory
SDATA= solar87 solar88 solar89
TDATA= $(YDATA) $(NDATA) $(SDATA)
@@ -330,9 +346,10 @@ TABDATA= iso3166.tab time.tab zone.tab
DATA= $(YDATA) $(NDATA) $(SDATA) $(TABDATA) \
leap-seconds.list yearistype.sh
WEB_PAGES= tz-art.htm tz-link.htm
+AWK_SCRIPTS= back-pre1970.awk checktab.awk leapseconds.awk zone-time.awk
MISC= usno1988 usno1989 usno1989a usno1995 usno1997 usno1998 \
- $(WEB_PAGES) checktab.awk leapseconds.awk workman.sh \
- zoneinfo2tdf.pl
+ $(WEB_PAGES) $(AWK_SCRIPTS) \
+ workman.sh zoneinfo2tdf.pl
ENCHILADA= $(COMMON) $(DOCS) $(SOURCES) $(DATA) $(MISC)
# And for the benefit of csh users on systems that assume the user
@@ -423,6 +440,9 @@ zones: $(REDO)
time.tab: $(YDATA) zone.tab zone-time.awk
$(AWK) -f zone-time.awk $(YDATA) >$@
+back-pre1970: pre1970 backward
+ $(AWK) -v pre1970=pre1970 -f $@.awk backward >$@
+
$(TZLIB): $(LIBOBJS)
-mkdir $(TOPDIR) $(LIBDIR)
ar ru $@ $(LIBOBJS)
@@ -457,6 +477,7 @@ check_web: $(WEB_PAGES)
clean_misc:
rm -f core *.o *.out \
+ back-pre1970 time.tab \
date leapseconds tzselect version.h zdump zic yearistype
clean: clean_misc
rm -f -r tzpublic
@@ -488,7 +509,7 @@ set-timestamps:
$$cmd || exit; \
done
-# The zics below ensure that each data file can stand on its own.
+# The zics below ensure that each non-pre1970 data file can stand on its own.
# We also do an all-files run to catch links to links.
check_public: $(ENCHILADA)
@@ -496,7 +517,8 @@ check_public: $(ENCHILADA)
make "CFLAGS=$(GCC_DEBUG_FLAGS)"
mkdir tzpublic
for i in $(TDATA) ; do \
- $(zic) -v -d tzpublic $$i 2>&1 || exit; \
+ test $$i = pre1970 || $(zic) -v -d tzpublic $$i 2>&1 \
+ || exit; \
done
$(zic) -v -d tzpublic $(TDATA)
rm -f -r tzpublic
diff --git a/back-pre1970.awk b/back-pre1970.awk
new file mode 100644
index 0000000..f7c54fc
--- /dev/null
+++ b/back-pre1970.awk
@@ -0,0 +1,18 @@
+# Generate 'back-pre1970' from the two input files 'pre1970' and 'backward'.
+# The output consists of all lines in 'backward' that are not links to
+# files mentioned in 'pre1970'. Think of it as 'backward' minus 'pre1970'.
+
+# The 'backward' file is the input.
+# The awk variable 'pre1970' contains the name of the pre1970 file.
+
+# This file is in the public domain.
+
+# Contributed by Paul Eggert.
+
+BEGIN {
+ while ((getline <pre1970) == 1)
+ if ($1 == "Zone")
+ pre1970_zone[$2] = 1
+}
+
+! (/^Link/ && pre1970_zone[$3]) { print }
diff --git a/pre1970 b/pre1970
new file mode 100644
index 0000000..d8b8f34
--- /dev/null
+++ b/pre1970
@@ -0,0 +1,291 @@
+# Pre-1970 data
+
+# This file is in the public domain.
+
+# This file contains zones that were formerly in other source files,
+# but were later removed or replaced by backward-compatibility links
+# as they differ from other zones only in pre-1970 time stamps.
+
+# Although the tz database focuses on post-1970 time stamps, these
+# entries are retained here as they may be of some use to people
+# interested in pre-1970 time stamps, even though they cover only a
+# tiny sliver of pre-1970 data and are unreliable for that data.
+# Also, these entries can help with backward compatibility with some
+# old versions of the tz database. They are incompatible with other
+# old versions of the database, though; it depends on which old
+# version you're interested in.
+
+# Entries are sorted by Zone name. Each entry is preceded by the name
+# of the country that the entry is in, along with any other commentary
+# and rules associated with the entry. Some rules, e.g., 'Canada',
+# are defined by other source files; this file is not intended to be
+# used without those other files.
+
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+
+# Mali
+# no longer different from Bamako, but too famous to omit
+Zone Africa/Timbuktu -0:12:04 - LMT 1912
+ 0:00 - GMT
+
+# Anguilla
+Zone America/Anguilla -4:12:16 - LMT 1912 Mar 2
+ -4:00 - AST
+
+# Antigua and Barbuda
+Zone America/Antigua -4:07:12 - LMT 1912 Mar 2
+ -5:00 - EST 1951
+ -4:00 - AST
+
+# Argentina
+# Chubut (CH)
+# The name "Comodoro Rivadavia" exceeds the 14-byte POSIX limit.
+Zone America/Argentina/ComodRivadavia -4:30:00 - LMT 1894 Oct 31
+ -4:16:48 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Mar 3
+ -4:00 - WART 1991 Oct 20
+ -3:00 Arg AR%sT 1999 Oct 3
+ -4:00 Arg AR%sT 2000 Mar 3
+ -3:00 - ART 2004 Jun 1
+ -4:00 - WART 2004 Jun 20
+ -3:00 - ART
+
+# Aruba
+Zone America/Aruba -4:40:24 - LMT 1912 Feb 12 # Oranjestad
+ -4:30 - ANT 1965 # Netherlands Antilles Time
+ -4:00 - AST
+
+# Canada
+
+Zone America/Atikokan -6:06:28 - LMT 1895
+ -6:00 Canada C%sT 1940 Sep 29
+ -6:00 1:00 CDT 1942 Feb 9 2:00s
+ -6:00 Canada C%sT 1945 Sep 30 2:00
+ -5:00 - EST
+
+Zone America/Blanc-Sablon -3:48:28 - LMT 1884
+ -4:00 Canada A%sT 1970
+ -4:00 - AST
+
+# Cayman Is
+Zone America/Cayman -5:25:32 - LMT 1890 # Georgetown
+ -5:07:12 - KMT 1912 Feb # Kingston Mean Time
+ -5:00 - EST
+
+# Canada
+Zone America/Coral_Harbour -5:32:40 - LMT 1884
+ -5:00 NT_YK E%sT 1946
+ -5:00 - EST
+
+# Curacao
+Zone America/Curacao -4:35:47 - LMT 1912 Feb 12 # Willemstad
+ -4:30 - ANT 1965 # Netherlands Antilles Time
+ -4:00 - AST
+
+# Dominica
+Zone America/Dominica -4:05:36 - LMT 1911 Jul 1 0:01 # Roseau
+ -4:00 - AST
+
+# Mexico
+Zone America/Ensenada -7:46:28 - LMT 1922 Jan 1 0:13:32
+ -8:00 - PST 1927 Jun 10 23:00
+ -7:00 - MST 1930 Nov 16
+ -8:00 - PST 1942 Apr
+ -7:00 - MST 1949 Jan 14
+ -8:00 - PST 1996
+ -8:00 Mexico P%sT
+
+# US
+Zone America/Fort_Wayne -5:00 US E%sT 1946
+ -5:00 - EST # Always EST as of 1986
+
+# Grenada
+Zone America/Grenada -4:07:00 - LMT 1911 Jul # St George's
+ -4:00 - AST
+
+# Guadeloupe
+Zone America/Guadeloupe -4:06:08 - LMT 1911 Jun 8 # Pointe a Pitre
+ -4:00 - AST
+
+# Canada
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Mont 1917 only - Mar 25 2:00 1:00 D
+Rule Mont 1917 only - Apr 24 0:00 0 S
+Rule Mont 1919 only - Mar 31 2:30 1:00 D
+Rule Mont 1919 only - Oct 25 2:30 0 S
+Rule Mont 1920 only - May 2 2:30 1:00 D
+Rule Mont 1920 1922 - Oct Sun>=1 2:30 0 S
+Rule Mont 1921 only - May 1 2:00 1:00 D
+Rule Mont 1922 only - Apr 30 2:00 1:00 D
+Rule Mont 1924 only - May 17 2:00 1:00 D
+Rule Mont 1924 1926 - Sep lastSun 2:30 0 S
+Rule Mont 1925 1926 - May Sun>=1 2:00 1:00 D
+# The 1927-to-1937 rules can be expressed more simply as
+# Rule Mont 1927 1937 - Apr lastSat 24:00 1:00 D
+# Rule Mont 1927 1937 - Sep lastSat 24:00 0 S
+# The rules below avoid use of 24:00
+# (which pre-1998 versions of zic cannot handle).
+Rule Mont 1927 only - May 1 0:00 1:00 D
+Rule Mont 1927 1932 - Sep lastSun 0:00 0 S
+Rule Mont 1928 1931 - Apr lastSun 0:00 1:00 D
+Rule Mont 1932 only - May 1 0:00 1:00 D
+Rule Mont 1933 1940 - Apr lastSun 0:00 1:00 D
+Rule Mont 1933 only - Oct 1 0:00 0 S
+Rule Mont 1934 1939 - Sep lastSun 0:00 0 S
+Rule Mont 1946 1973 - Apr lastSun 2:00 1:00 D
+Rule Mont 1945 1948 - Sep lastSun 2:00 0 S
+Rule Mont 1949 1950 - Oct lastSun 2:00 0 S
+Rule Mont 1951 1956 - Sep lastSun 2:00 0 S
+Rule Mont 1957 1973 - Oct lastSun 2:00 0 S
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Montreal -4:54:16 - LMT 1884
+ -5:00 Mont E%sT 1918
+ -5:00 Canada E%sT 1919
+ -5:00 Mont E%sT 1942 Feb 9 2:00s
+ -5:00 Canada E%sT 1946
+ -5:00 Mont E%sT 1974
+ -5:00 Canada E%sT
+
+# Montserrat
+Zone America/Montserrat -4:08:52 - LMT 1911 Jul 1 0:01 # Cork Hill
+ -4:00 - AST
+
+# Bahamas
+# Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+Rule Bahamas 1964 1975 - Oct lastSun 2:00 0 S
+Rule Bahamas 1964 1975 - Apr lastSun 2:00 1:00 D
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone America/Nassau -5:09:30 - LMT 1912 Mar 2
+ -5:00 Bahamas E%sT 1976
+ -5:00 US E%sT
+
+# Trinidad and Tobago
+Zone America/Port_of_Spain -4:06:04 - LMT 1912 Mar 2
+ -4:00 - AST
+
+# Brazil
+# Rio_Branco is too ambiguous, since there's a Rio Branco in Uruguay too.
+Zone America/Porto_Acre -4:31:12 - LMT 1914
+ -5:00 Brazil AC%sT 1988 Sep 12
+ -5:00 - ACT
+
+# Argentina
+# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC),
+# Formosa (FM), La Pampa (LP), Chubut (CH)
+Zone America/Rosario -4:02:40 - LMT 1894 Nov
+ -4:16:44 - CMT 1920 May
+ -4:00 - ART 1930 Dec
+ -4:00 Arg AR%sT 1969 Oct 5
+ -3:00 Arg AR%sT 1991 Jul
+ -3:00 - ART 1999 Oct 3 0:00
+ -4:00 Arg AR%sT 2000 Mar 3 0:00
+ -3:00 - ART
+
+# St Kitts-Nevis
+Zone America/St_Kitts -4:10:52 - LMT 1912 Mar 2 # Basseterre
+ -4:00 - AST
+
+# St Lucia
+Zone America/St_Lucia -4:04:00 - LMT 1890 # Castries
+ -4:04:00 - CMT 1912 # Castries Mean Time
+ -4:00 - AST
+
+# Virgin Is
+Zone America/St_Thomas -4:19:44 - LMT 1911 Jul # Charlotte Amalie
+ -4:00 - AST
+
+# St Vincent and the Grenadines
+Zone America/St_Vincent -4:04:56 - LMT 1890 # Kingstown
+ -4:04:56 - KMT 1912 # Kingstown Mean Time
+ -4:00 - AST
+
+# British Virgin Is
+Zone America/Tortola -4:18:28 - LMT 1911 Jul # Road Town
+ -4:00 - AST
+
+# McMurdo, Ross Island, since 1955-12
+Zone Antarctica/McMurdo 0 - zzz 1956
+ 12:00 NZAQ NZ%sT
+
+# Japan
+Zone Asia/Ishigaki 8:16:36 - LMT 1896
+ 8:00 - CST
+
+# Israel
+Zone Asia/Tel_Aviv 2:19:04 - LMT 1880
+ 2:21 - JMT 1918
+ 2:00 Zion I%sT
+
+# Russia
+Zone Asia/Tomsk 5:39:52 - LMT 1924 May 2
+ 6:00 - TSK 1957 Mar
+ 7:00 Russia TS%s 1991 Mar 31 2:00s
+ 6:00 1:00 TSD 1991 Sep 29 2:00s
+ 6:00 - TSK 1992 Jan 19 2:00s
+ 7:00 Russia TS%s
+
+# Svalbard & Jan Mayen
+Zone Atlantic/Jan_Mayen -1:00 - EGT
+
+# Australia
+Zone Australia/Canberra 9:56:32 - LMT 1895 Feb
+ 10:00 - EST 1917 Jan 1 0:01
+ 10:00 Aus EST 1971 Oct 31 2:00
+ 10:00 AN EST 1981 Oct 25 2:00
+ 10:00 1:00 EST 1982 Apr 4 3:00
+ 10:00 AN EST
+
+# UK
+Zone Europe/Belfast -0:23:40 - LMT 1880 Aug 2
+ -0:25:21 - DMT 1916 May 21 2:00 # Dublin/Dunsink MT
+ -0:25:21 1:00 IST 1916 Oct 1 2:00s # Irish Summer Time
+ 0:00 GB-Eire %s 1968 Oct 27
+ 1:00 - BST 1971 Oct 31 2:00u
+ 0:00 GB-Eire %s 1996
+ 0:00 EU GMT/BST
+
+# Slovenia
+Zone Europe/Ljubljana 0:58:04 - LMT 1884
+ 1:00 - CET 1941 Apr 18 23:00
+ 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 1:00 CEST 1945 Sep 16 2:00s
+ 1:00 - CET 1982 Nov 27
+ 1:00 EU CE%sT
+
+# Bosnia and Herzegovina
+Zone Europe/Sarajevo 1:13:40 - LMT 1884
+ 1:00 - CET 1941 Apr 18 23:00
+ 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 1:00 CEST 1945 Sep 16 2:00s
+ 1:00 - CET 1982 Nov 27
+ 1:00 EU CE%sT
+
+# Macedonia
+Zone Europe/Skopje 1:25:44 - LMT 1884
+ 1:00 - CET 1941 Apr 18 23:00
+ 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 1:00 CEST 1945 Sep 16 2:00s
+ 1:00 - CET 1982 Nov 27
+ 1:00 EU CE%sT
+
+# Moldova
+Zone Europe/Tiraspol 1:58:32 - LMT 1880
+ 1:55 - CMT 1918 Feb 15 # Chisinau MT
+ 1:44:24 - BMT 1931 Jul 24 # Bucharest MT
+ 2:00 Romania EE%sT 1940 Aug 15
+ 2:00 1:00 EEST 1941 Jul 17
+ 1:00 C-Eur CE%sT 1944 Aug 24
+ 3:00 Russia MSK/MSD 1991 Mar 31 2:00
+ 2:00 Russia EE%sT 1992 Jan 19 2:00
+ 3:00 Russia MSK/MSD
+
+# Croatia
+# Zone NAME GMTOFF RULES FORMAT [UNTIL]
+Zone Europe/Zagreb 1:03:52 - LMT 1884
+ 1:00 - CET 1941 Apr 18 23:00
+ 1:00 C-Eur CE%sT 1945 May 8 2:00s
+ 1:00 1:00 CEST 1945 Sep 16 2:00s
+ 1:00 - CET 1982 Nov 27
+ 1:00 EU CE%sT
--
1.8.1.2
More information about the tz
mailing list