]> Zhao Yanbai Git Server - minix.git/commitdiff
Import of original zoneinfo code and database - tzcode
authorBen Gras <ben@minix3.org>
Mon, 26 Mar 2007 10:55:16 +0000 (10:55 +0000)
committerBen Gras <ben@minix3.org>
Mon, 26 Mar 2007 10:55:16 +0000 (10:55 +0000)
old-tzcode-32-bit-output and tzdata2007d.

64 files changed:
commands/zoneinfo/Makefile [new file with mode: 0644]
commands/zoneinfo/README [new file with mode: 0644]
commands/zoneinfo/Theory [new file with mode: 0644]
commands/zoneinfo/africa [new file with mode: 0644]
commands/zoneinfo/antarctica [new file with mode: 0644]
commands/zoneinfo/asctime.c [new file with mode: 0644]
commands/zoneinfo/asia [new file with mode: 0644]
commands/zoneinfo/australasia [new file with mode: 0644]
commands/zoneinfo/backward [new file with mode: 0644]
commands/zoneinfo/checktab.awk [new file with mode: 0644]
commands/zoneinfo/date.1 [new file with mode: 0644]
commands/zoneinfo/date.1.txt [new file with mode: 0644]
commands/zoneinfo/date.c [new file with mode: 0644]
commands/zoneinfo/difftime.c [new file with mode: 0644]
commands/zoneinfo/etcetera [new file with mode: 0644]
commands/zoneinfo/europe [new file with mode: 0644]
commands/zoneinfo/factory [new file with mode: 0644]
commands/zoneinfo/ialloc.c [new file with mode: 0644]
commands/zoneinfo/iso3166.tab [new file with mode: 0644]
commands/zoneinfo/itca.jpg [new file with mode: 0644]
commands/zoneinfo/leapseconds [new file with mode: 0644]
commands/zoneinfo/localtime.c [new file with mode: 0644]
commands/zoneinfo/logwtmp.c [new file with mode: 0644]
commands/zoneinfo/newctime.3 [new file with mode: 0644]
commands/zoneinfo/newctime.3.txt [new file with mode: 0644]
commands/zoneinfo/newstrftime.3 [new file with mode: 0644]
commands/zoneinfo/newstrftime.3.txt [new file with mode: 0644]
commands/zoneinfo/newtzset.3 [new file with mode: 0644]
commands/zoneinfo/newtzset.3.txt [new file with mode: 0644]
commands/zoneinfo/northamerica [new file with mode: 0644]
commands/zoneinfo/pacificnew [new file with mode: 0644]
commands/zoneinfo/private.h [new file with mode: 0644]
commands/zoneinfo/scheck.c [new file with mode: 0644]
commands/zoneinfo/solar87 [new file with mode: 0644]
commands/zoneinfo/solar88 [new file with mode: 0644]
commands/zoneinfo/solar89 [new file with mode: 0644]
commands/zoneinfo/southamerica [new file with mode: 0644]
commands/zoneinfo/strftime.c [new file with mode: 0644]
commands/zoneinfo/systemv [new file with mode: 0644]
commands/zoneinfo/time2posix.3 [new file with mode: 0644]
commands/zoneinfo/time2posix.3.txt [new file with mode: 0644]
commands/zoneinfo/tz-art.htm [new file with mode: 0644]
commands/zoneinfo/tz-link.htm [new file with mode: 0644]
commands/zoneinfo/tzfile.5 [new file with mode: 0644]
commands/zoneinfo/tzfile.5.txt [new file with mode: 0644]
commands/zoneinfo/tzfile.h [new file with mode: 0644]
commands/zoneinfo/tzselect.8 [new file with mode: 0644]
commands/zoneinfo/tzselect.8.txt [new file with mode: 0644]
commands/zoneinfo/tzselect.ksh [new file with mode: 0644]
commands/zoneinfo/usno1988 [new file with mode: 0644]
commands/zoneinfo/usno1989 [new file with mode: 0644]
commands/zoneinfo/usno1989a [new file with mode: 0644]
commands/zoneinfo/usno1995 [new file with mode: 0644]
commands/zoneinfo/usno1997 [new file with mode: 0644]
commands/zoneinfo/usno1998 [new file with mode: 0644]
commands/zoneinfo/workman.sh [new file with mode: 0644]
commands/zoneinfo/yearistype.sh [new file with mode: 0644]
commands/zoneinfo/zdump.8 [new file with mode: 0644]
commands/zoneinfo/zdump.8.txt [new file with mode: 0644]
commands/zoneinfo/zdump.c [new file with mode: 0644]
commands/zoneinfo/zic.8 [new file with mode: 0644]
commands/zoneinfo/zic.8.txt [new file with mode: 0644]
commands/zoneinfo/zic.c [new file with mode: 0644]
commands/zoneinfo/zone.tab [new file with mode: 0644]

diff --git a/commands/zoneinfo/Makefile b/commands/zoneinfo/Makefile
new file mode 100644 (file)
index 0000000..a2ae4af
--- /dev/null
@@ -0,0 +1,424 @@
+# @(#)Makefile 7.109
+
+# Change the line below for your time zone (after finding the zone you want in
+# the time zone files, or adding it to a time zone file).
+# Alternately, if you discover you've got the wrong time zone, you can just
+#      zic -l rightzone
+# to correct things.
+# Use the command
+#      make zonenames
+# to get a list of the values you can use for LOCALTIME.
+
+LOCALTIME=     Factory
+
+# If you want something other than Eastern United States time as a template
+# for handling POSIX-style time zone environment variables,
+# change the line below (after finding the zone you want in the
+# time zone files, or adding it to a time zone file).
+# (When a POSIX-style environment variable is handled, the rules in the
+# template file are used to determine "spring forward" and "fall back" days and
+# times; the environment variable itself specifies UTC offsets of standard and
+# summer time.)
+# Alternately, if you discover you've got the wrong time zone, you can just
+#      zic -p rightzone
+# to correct things.
+# Use the command
+#      make zonenames
+# to get a list of the values you can use for POSIXRULES.
+# If you want POSIX compatibility, use "America/New_York".
+
+POSIXRULES=    America/New_York
+
+# Also see TZDEFRULESTRING below, which takes effect only
+# if the time zone files cannot be accessed.
+
+# Everything gets put in subdirectories of. . .
+
+TOPDIR=                /usr/local
+
+# "Compiled" time zone information is placed in the "TZDIR" directory
+# (and subdirectories).
+# Use an absolute path name for TZDIR unless you're just testing the software.
+
+TZDIR=         $(TOPDIR)/etc/zoneinfo
+
+# The "tzselect", "zic", and "zdump" commands get installed in. . .
+
+ETCDIR=                $(TOPDIR)/etc
+
+# If you "make INSTALL", the "date" command gets installed in. . .
+
+BINDIR=                $(TOPDIR)/bin
+
+# Manual pages go in subdirectories of. . .
+
+MANDIR=                $(TOPDIR)/man
+
+# Library functions are put in an archive in LIBDIR.
+
+LIBDIR=                $(TOPDIR)/lib
+TZLIB=         $(LIBDIR)/libtz.a
+
+# If you always want time values interpreted as "seconds since the epoch
+# (not counting leap seconds)", use
+#      REDO=           posix_only
+# below.  If you always want right time values interpreted as "seconds since
+# the epoch" (counting leap seconds)", use
+#      REDO=           right_only
+# below.  If you want both sets of data available, with leap seconds not
+# counted normally, use
+#      REDO=           posix_right
+# below.  If you want both sets of data available, with leap seconds counted
+# normally, use
+#      REDO=           right_posix
+# below.
+# POSIX mandates that leap seconds not be counted; for compatibility with it,
+# use either "posix_only" or "posix_right".
+
+REDO=          posix_right
+
+# Since "." may not be in PATH...
+
+YEARISTYPE=    ./yearistype
+
+# Non-default libraries needed to link.
+# Add -lintl if you want to use `gettext' on Solaris.
+LDLIBS=
+
+# Add the following to the end of the "CFLAGS=" line as needed.
+#  -Dconst= if `const' does not work (SunOS 4.x cc, OSF1 V5.0 cc)
+#  -DHAVE_ADJTIME=0 if `adjtime' does not exist (SVR0?)
+#  -DHAVE_GETTEXT=1 if `gettext' works (GNU, Linux, Solaris); also see LDLIBS
+#  -DHAVE_INCOMPATIBLE_CTIME_R=1 if your system's time.h declares
+#      ctime_r and asctime_r incompatibly with the POSIX standard (Solaris 8).
+#  -DHAVE_SETTIMEOFDAY=0 if settimeofday does not exist (SVR0?)
+#  -DHAVE_SETTIMEOFDAY=1 if settimeofday has just 1 arg (SVR4)
+#  -DHAVE_SETTIMEOFDAY=2 if settimeofday uses 2nd arg (4.3BSD)
+#  -DHAVE_SETTIMEOFDAY=3 if settimeofday ignores 2nd arg (4.4BSD)
+#  -DHAVE_STRERROR=0 if your system lacks the strerror function
+#  -DHAVE_SYMLINK=0 if your system lacks the symlink function
+#  -DHAVE_SYS_STAT_H=0 if your compiler lacks a "sys/stat.h"
+#  -DHAVE_SYS_WAIT_H=0 if your compiler lacks a "sys/wait.h"
+#  -DLOCALE_HOME=\"path\" if locales are in "path", not "/usr/lib/locale"
+#  -DHAVE_UNISTD_H=0 if your compiler lacks a "unistd.h" (Microsoft C++ 7?)
+#  -DHAVE_UTMPX_H=1 if your compiler has a "utmpx.h"
+#  -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
+#      DST transitions if the time zone files cannot be accessed
+#  -DTZ_DOMAIN=\"foo\" to use "foo" for gettext domain name; default is "tz"
+#  -TTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
+#      the default is system-supplied, typically "/usr/lib/locale"
+#  $(GCC_DEBUG_FLAGS) if you are using GCC and want lots of checking
+#  -DNO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU=1
+#      if you do not want run time warnings about formats that may cause
+#      year 2000 grief
+#  -DZIC_MAX_ABBR_LEN_WO_WARN=3
+#      (or some other number) to set the maximum time zone abbreviation length
+#      that zic will accept without a warning (the default is 6)
+GCC_DEBUG_FLAGS = -Dlint -g -O -fno-common \
+       -Wall -Wcast-qual -Wconversion -Wmissing-prototypes \
+       -Wnested-externs -Wpointer-arith -Wshadow \
+       -Wtraditional # -Wstrict-prototypes -Wwrite-strings
+#
+# If you want to use System V compatibility code, add
+#      -DUSG_COMPAT
+# to the end of the "CFLAGS=" line.  This arrange for "timezone" and "daylight"
+# variables to be kept up-to-date by the time conversion functions.  Neither
+# "timezone" nor "daylight" is described in X3J11's work.
+#
+# If your system has a "GMT offset" field in its "struct tm"s
+# (or if you decide to add such a field in your system's "time.h" file),
+# add the name to a define such as
+#      -DTM_GMTOFF=tm_gmtoff
+# or
+#      -DTM_GMTOFF=_tm_gmtoff
+# to the end of the "CFLAGS=" line.
+# Neither tm_gmtoff nor _tm_gmtoff is described in X3J11's work;
+# in its work, use of "tm_gmtoff" is described as non-conforming.
+# Both Linux and BSD have done the equivalent of defining TM_GMTOFF in
+# their recent releases.
+#
+# If your system has a "zone abbreviation" field in its "struct tm"s
+# (or if you decide to add such a field in your system's "time.h" file),
+# add the name to a define such as
+#      -DTM_ZONE=tm_zone
+# or
+#      -DTM_ZONE=_tm_zone
+# to the end of the "CFLAGS=" line.
+# Neither tm_zone nor _tm_zone is described in X3J11's work;
+# in its work, use of "tm_zone" is described as non-conforming.
+# Both UCB and Sun have done the equivalent of defining TM_ZONE in
+# their recent releases.
+#
+# If you want functions that were inspired by early versions of X3J11's work,
+# add
+#      -DSTD_INSPIRED
+# to the end of the "CFLAGS=" line.  This arranges for the functions
+# "tzsetwall", "offtime", "timelocal", "timegm", "timeoff",
+# "posix2time", and "time2posix" to be added to the time conversion library.
+# "tzsetwall" is like "tzset" except that it arranges for local wall clock
+# time (rather than the time specified in the TZ environment variable)
+# to be used.
+# "offtime" is like "gmtime" except that it accepts a second (long) argument
+# that gives an offset to add to the time_t when converting it.
+# "timelocal" is equivalent to "mktime".
+# "timegm" is like "timelocal" except that it turns a struct tm into
+# a time_t using UTC (rather than local time as "timelocal" does).
+# "timeoff" is like "timegm" except that it accepts a second (long) argument
+# that gives an offset to use when converting to a time_t.
+# "posix2time" and "time2posix" are described in an included manual page.
+# X3J11's work does not describe any of these functions.
+# Sun has provided "tzsetwall", "timelocal", and "timegm" in SunOS 4.0.
+# These functions may well disappear in future releases of the time
+# conversion package.
+#
+# If you want Source Code Control System ID's left out of object modules, add
+#      -DNOID
+# to the end of the "CFLAGS=" line.
+#
+# If you'll never want to handle solar-time-based time zones, add
+#      -DNOSOLAR
+# to the end of the "CFLAGS=" line
+# (and comment out the "SDATA=" line below).
+# This reduces (slightly) the run-time data-space requirements of
+# the time conversion functions; it may reduce the acceptability of your system
+# to folks in oil- and cash-rich places.
+#
+# If you want to allocate state structures in localtime, add
+#      -DALL_STATE
+# to the end of the "CFLAGS=" line.  Storage is obtained by calling malloc.
+#
+# If you want an "altzone" variable (a la System V Release 3.1), add
+#      -DALTZONE
+# to the end of the "CFLAGS=" line.
+# This variable is not described in X3J11's work.
+#
+# If you want a "gtime" function (a la MACH), add
+#      -DCMUCS
+# to the end of the "CFLAGS=" line
+# This function is not described in X3J11's work.
+#
+# NIST-PCTS:151-2, Version 1.4, (1993-12-03) is a test suite put
+# out by the National Institute of Standards and Technology
+# which claims to test C and Posix conformance.  If you want to pass PCTS, add
+#      -DPCTS
+# to the end of the "CFLAGS=" line.
+#
+# If you want strict compliance with XPG4 as of 1994-04-09, add
+#      -DXPG4_1994_04_09
+# to the end of the "CFLAGS=" line.  This causes "strftime" to always return
+# 53 as a week number (rather than 52 or 53) for those days in January that
+# before the first Monday in January when a "%V" format is used and January 1
+# falls on a Friday, Saturday, or Sunday.
+
+CFLAGS=
+
+# If you want zic's -s option used when installing, uncomment the next line
+# ZFLAGS=      -s
+
+zic=           ./zic
+ZIC=           $(zic) $(ZFLAGS)
+
+# The name of a Posix-compliant `awk' on your system.
+AWK=           nawk
+
+# The path where SGML DTDs are kept.
+SGML_SEARCH_PATH= $(TOPDIR)/share/doc/sgml-lib/REC-xhtml1-20000126/
+
+# The catalog file(s) to use when validating XHTML.
+SGML_CATALOG_FILES= xhtml.soc
+
+# The name, arguments and environment of a program to validate your web pages.
+# See <http://www.jclark.com/sp/> for a validator, and
+# <http://validator.w3.org/source/> for a validation library.
+VALIDATE = nsgmls
+VALIDATE_FLAGS = -s -B -wall -wno-unused-param -wxml
+VALIDATE_ENV = \
+  SGML_CATALOG_FILES=$(SGML_CATALOG_FILES) \
+  SGML_SEARCH_PATH=$(SGML_SEARCH_PATH) \
+  SP_CHARSET_FIXED=YES \
+  SP_ENCODING=UTF-8
+
+###############################################################################
+
+cc=            cc
+CC=            $(cc) -DTZDIR=\"$(TZDIR)\"
+
+TZCSRCS=       zic.c localtime.c asctime.c scheck.c ialloc.c
+TZCOBJS=       zic.o localtime.o asctime.o scheck.o ialloc.o
+TZDSRCS=       zdump.c localtime.c ialloc.c
+TZDOBJS=       zdump.o localtime.o ialloc.o
+DATESRCS=      date.c localtime.c logwtmp.c strftime.c asctime.c
+DATEOBJS=      date.o localtime.o logwtmp.o strftime.o asctime.o
+LIBSRCS=       localtime.c asctime.c difftime.c
+LIBOBJS=       localtime.o asctime.o difftime.o
+HEADERS=       tzfile.h private.h
+NONLIBSRCS=    zic.c zdump.c scheck.c ialloc.c
+NEWUCBSRCS=    date.c logwtmp.c strftime.c
+SOURCES=       $(HEADERS) $(LIBSRCS) $(NONLIBSRCS) $(NEWUCBSRCS) tzselect.ksh
+MANS=          newctime.3 newstrftime.3 newtzset.3 time2posix.3 \
+                       tzfile.5 tzselect.8 zic.8 zdump.8
+DOCS=          README Theory $(MANS) date.1 Makefile
+PRIMARY_YDATA= africa antarctica asia australasia \
+               europe northamerica southamerica
+YDATA=         $(PRIMARY_YDATA) pacificnew etcetera factory backward
+NDATA=         systemv
+SDATA=         solar87 solar88 solar89
+TDATA=         $(YDATA) $(NDATA) $(SDATA)
+TABDATA=       iso3166.tab zone.tab
+DATA=          $(YDATA) $(NDATA) $(SDATA) $(TABDATA) leapseconds yearistype.sh
+WEB_PAGES=     tz-art.htm tz-link.htm
+MISC=          usno1988 usno1989 usno1989a usno1995 usno1997 usno1998 \
+                       itca.jpg $(WEB_PAGES) checktab.awk workman.sh
+ENCHILADA=     $(DOCS) $(SOURCES) $(DATA) $(MISC)
+
+# And for the benefit of csh users on systems that assume the user
+# shell should be used to handle commands in Makefiles. . .
+
+SHELL=         /bin/sh
+
+all:           tzselect zic zdump $(LIBOBJS)
+
+ALL:           all date
+
+install:       all $(DATA) $(REDO) $(TZLIB) $(MANS) $(TABDATA)
+               $(ZIC) -y $(YEARISTYPE) \
+                       -d $(TZDIR) -l $(LOCALTIME) -p $(POSIXRULES)
+               -rm -f $(TZDIR)/iso3166.tab $(TZDIR)/zone.tab
+               cp iso3166.tab zone.tab $(TZDIR)/.
+               -mkdir $(TOPDIR) $(ETCDIR)
+               cp tzselect zic zdump $(ETCDIR)/.
+               -mkdir $(TOPDIR) $(MANDIR) \
+                       $(MANDIR)/man3 $(MANDIR)/man5 $(MANDIR)/man8
+               -rm -f $(MANDIR)/man3/newctime.3 \
+                       $(MANDIR)/man3/newtzset.3 \
+                       $(MANDIR)/man5/tzfile.5 \
+                       $(MANDIR)/man8/tzselect.8 \
+                       $(MANDIR)/man8/zdump.8 \
+                       $(MANDIR)/man8/zic.8
+               cp newctime.3 newtzset.3 $(MANDIR)/man3/.
+               cp tzfile.5 $(MANDIR)/man5/.
+               cp tzselect.8 zdump.8 zic.8 $(MANDIR)/man8/.
+
+INSTALL:       ALL install date.1
+               -mkdir $(TOPDIR) $(BINDIR)
+               cp date $(BINDIR)/.
+               -mkdir $(TOPDIR) $(MANDIR) $(MANDIR)/man1
+               -rm -f $(MANDIR)/man1/date.1
+               cp date.1 $(MANDIR)/man1/.
+
+zdump:         $(TZDOBJS)
+               $(CC) $(CFLAGS) $(LFLAGS) $(TZDOBJS) $(LDLIBS) -o $@
+
+zic:           $(TZCOBJS) yearistype
+               $(CC) $(CFLAGS) $(LFLAGS) $(TZCOBJS) $(LDLIBS) -o $@
+
+yearistype:    yearistype.sh
+               cp yearistype.sh yearistype
+               chmod +x yearistype
+
+posix_only:    zic $(TDATA)
+               $(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L /dev/null $(TDATA)
+
+right_only:    zic leapseconds $(TDATA)
+               $(ZIC) -y $(YEARISTYPE) -d $(TZDIR) -L leapseconds $(TDATA)
+
+# In earlier versions of this makefile, the other two directories were
+# subdirectories of $(TZDIR).  However, this led to configuration errors.
+# For example, with posix_right under the earlier scheme,
+# TZ='right/Australia/Adelaide' got you localtime with leap seconds,
+# but gmtime without leap seconds, which led to problems with applications
+# like sendmail that subtract gmtime from localtime.
+# 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.
+other_two:     zic leapseconds $(TDATA)
+               $(ZIC) -y $(YEARISTYPE) -d $(TZDIR)-posix -L /dev/null $(TDATA)
+               $(ZIC) -y $(YEARISTYPE) \
+                       -d $(TZDIR)-leaps -L leapseconds $(TDATA)
+
+posix_right:   posix_only other_two
+
+right_posix:   right_only other_two
+
+zones:         $(REDO)
+
+$(TZLIB):      $(LIBOBJS)
+               -mkdir $(TOPDIR) $(LIBDIR)
+               ar ru $@ $(LIBOBJS)
+               if [ -x /usr/ucb/ranlib -o -x /usr/bin/ranlib ] ; \
+                       then ranlib $@ ; fi
+
+# We use the system's logwtmp in preference to ours if available.
+
+date:          $(DATEOBJS)
+               ar r ,lib.a logwtmp.o
+               if [ -x /usr/ucb/ranlib -o -x /usr/bin/ranlib ] ; \
+                       then ranlib ,lib.a ; fi
+               $(CC) $(CFLAGS) date.o localtime.o asctime.o strftime.o \
+                       $(LDLIBS) -lc ,lib.a -o $@
+               rm -f ,lib.a
+
+tzselect:      tzselect.ksh
+               sed \
+                       -e 's|AWK=[^}]*|AWK=$(AWK)|g' \
+                       -e 's|TZDIR=[^}]*|TZDIR=$(TZDIR)|' \
+                       <$? >$@
+               chmod +x $@
+
+check:         check_tables check_web
+
+check_tables:  checktab.awk $(PRIMARY_YDATA)
+               $(AWK) -f checktab.awk $(PRIMARY_YDATA)
+
+check_web:     $(WEB_PAGES)
+               $(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) $(WEB_PAGES)
+
+clean:
+               rm -f core *.o *.out tzselect zdump zic yearistype date
+
+maintainer-clean: clean
+               @echo 'This command is intended for maintainers to use; it'
+               @echo 'deletes files that may need special tools to rebuild.'
+               rm -f *.[1-8].txt tzcode.tar.gz tzdata.tar.gz
+
+names:
+               @echo $(ENCHILADA)
+
+# The zics below ensure that each data file can stand on its own.
+# We also do an all-files run to catch links to links.
+
+public:                $(ENCHILADA)
+               make maintainer-clean
+               make "CFLAGS=$(GCC_DEBUG_FLAGS)"
+               -mkdir /tmp/,tzpublic
+               -for i in $(TDATA) ; do zic -v -d /tmp/,tzpublic $$i 2>&1 | grep -v "starting year" ; done
+               for i in $(TDATA) ; do zic -d /tmp/,tzpublic $$i || exit; done
+               zic -v -d /tmp/,tzpublic $(TDATA) || exit
+               rm -f -r /tmp/,tzpublic
+               for i in *.[1-8] ; do sh workman.sh $$i > $$i.txt || exit; done
+               $(AWK) -f checktab.awk $(PRIMARY_YDATA)
+               tar cf - $(DOCS) $(SOURCES) $(MISC) *.[1-8].txt | gzip -9 > tzcode.tar.gz
+               tar cf - $(DATA) | gzip -9 > tzdata.tar.gz
+
+typecheck:
+               make clean
+               for i in "long long" unsigned double; \
+               do \
+                       make CFLAGS="-DTYPECHECK -D_TIME_T \"-Dtime_t=$$i\"" ; \
+                       ./zdump -v Europe/Rome ; \
+                       make clean ; \
+               done
+
+zonenames:     $(TDATA)
+               @$(AWK) '/^Zone/ { print $$2 } /^Link/ { print $$3 }' $(TDATA)
+
+asctime.o:     private.h tzfile.h
+date.o:                private.h
+difftime.o:    private.h
+ialloc.o:      private.h
+localtime.o:   private.h tzfile.h
+scheck.o:      private.h
+strftime.o:    tzfile.h
+zic.o:         private.h tzfile.h
+
+.KEEP_STATE:
diff --git a/commands/zoneinfo/README b/commands/zoneinfo/README
new file mode 100644 (file)
index 0000000..e868f6d
--- /dev/null
@@ -0,0 +1,84 @@
+@(#)README     7.12
+
+"What time is it?" -- Richard Deacon as The King
+"Any time you want it to be." -- Frank Baxter as The Scientist
+                                       (from the Bell System film "About Time")
+
+The 1989 update of the time zone package featured
+
+*      POSIXization (including interpretation of POSIX-style TZ environment
+       variables, provided by Guy Harris),
+*      ANSIfication (including versions of "mktime" and "difftime"),
+*      SVIDulation (an "altzone" variable)
+*      MACHination (the "gtime" function)
+*      corrections to some time zone data (including corrections to the rules
+       for Great Britain and New Zealand)
+*      reference data from the United States Naval Observatory for folks who
+       want to do additional time zones
+*      and the 1989 data for Saudi Arabia.
+
+(Since this code will be treated as "part of the implementation" in some places
+and as "part of the application" in others, there's no good way to name
+functions, such as timegm, that are not part of the proposed ANSI C standard;
+such functions have kept their old, underscore-free names in this update.)
+
+And the "dysize" function has disappeared; it was present to allow compilation
+of the "date" command on old BSD systems, and a version of "date" is now
+provided in the package.  The "date" command is not created when you "make all"
+since it may lack options provided by the version distributed with your
+operating system, or may not interact with the system in the same way the
+native version does.
+
+Since POSIX frowns on correct leap second handling, the default behavior of
+the "zic" command (in the absence of a "-L" option) has been changed to omit
+leap second information from its output files.
+
+Here is a recipe for acquiring, building, installing, and testing the
+tz distribution on a GNU/Linux or similar host.
+
+       mkdir tz
+       cd tz
+       wget 'ftp://elsie.nci.nih.gov/pub/tz*.tar.gz'
+       gzip -dc tzcode*.tar.gz | tar -xf -
+       gzip -dc tzdata*.tar.gz | tar -xf -
+
+Be sure to read the comments in "Makefile" and make any changes needed
+to make things right for your system, especially if you are using some
+platform other than GNU/Linux.  Then run the following commands,
+substituting your desired installation directory for "$HOME/tzdir":
+
+       make TOPDIR=$HOME/tzdir install
+       $HOME/tzdir/etc/zdump -v America/Los_Angeles
+
+To use the new functions, use a "-ltz" option when compiling or linking.
+
+Historical local time information has been included here to:
+
+*      provide a compendium of data about the history of civil time
+       that is useful even if the data are not 100% accurate;
+
+*      give an idea of the variety of local time rules that have
+       existed in the past and thus an idea of the variety that may be
+       expected in the future;
+
+*      provide a test of the generality of the local time rule description
+       system.
+
+The information in the time zone data files is by no means authoritative;
+the files currently do not even attempt to covar all time stamps before
+1970, and there are undoubtedly errors even for time stamps since 1970.
+If you know that the rules are different from those in a file, by all means
+feel free to change file (and please send the changed version to
+tz@elsie.nci.nih.gov for use in the future).  Europeans take note!
+
+Thanks to these Timezone Caballeros who've made major contributions to the
+time conversion package:  Keith Bostic; Bob Devine; Paul Eggert; Robert Elz;
+Guy Harris; Mark Horton; John Mackin; and Bradley White.  Thanks also to
+Michael Bloom, Art Neilson, Stephen Prince, John Sovereign, and Frank Wales
+for testing work, and to Gwillim Law for checking local mean time data.
+None of them are responsible for remaining errors.
+
+Look in the ~ftp/pub directory of elsie.nci.nih.gov
+for updated versions of these files.
+
+Please send comments or information to tz@elsie.nci.nih.gov.
diff --git a/commands/zoneinfo/Theory b/commands/zoneinfo/Theory
new file mode 100644 (file)
index 0000000..23faf30
--- /dev/null
@@ -0,0 +1,569 @@
+@(#)Theory     7.19
+
+
+----- Outline -----
+
+       Time and date functions
+       Names of time zone regions
+       Time zone abbreviations
+       Calendrical issues
+       Time and time zones on Mars
+
+
+----- Time and date functions -----
+
+These time and date functions are upwards compatible with POSIX,
+an international standard for UNIX-like systems.
+As of this writing, the current edition of POSIX is:
+
+  Standard for Information technology
+  -- Portable Operating System Interface (POSIX (R))
+  -- System Interfaces
+  IEEE Std 1003.1, 2004 Edition
+  <http://www.opengroup.org/online-pubs?DOC=7999959899>
+  <http://www.opengroup.org/pubs/catalog/t041.htm>
+
+POSIX has the following properties and limitations.
+
+*      In POSIX, time display in a process is controlled by the
+       environment variable TZ.  Unfortunately, the POSIX TZ string takes
+       a form that is hard to describe and is error-prone in practice.
+       Also, POSIX TZ strings can't deal with other (for example, Israeli)
+       daylight saving time rules, or situations where more than two
+       time zone abbreviations are used in an area.
+
+       The POSIX TZ string takes the following form:
+
+               stdoffset[dst[offset],date[/time],date[/time]]
+
+       where:
+
+       std and dst
+               are 3 or more characters specifying the standard
+               and daylight saving time (DST) zone names.
+               Starting with POSIX.1-2001, std and dst may also be
+               in a quoted form like "<UTC+10>"; this allows
+               "+" and "-" in the names.
+       offset
+               is of the form `[-]hh:[mm[:ss]]' and specifies the
+               offset west of UTC.  The default DST offset is one hour
+               ahead of standard time.
+       date[/time],date[/time]
+               specifies the beginning and end of DST.  If this is absent,
+               the system supplies its own rules for DST, and these can
+               differ from year to year; typically US DST rules are used.
+       time
+               takes the form `hh:[mm[:ss]]' and defaults to 02:00.
+       date
+               takes one of the following forms:
+               Jn (1<=n<=365)
+                       origin-1 day number not counting February 29
+               n (0<=n<=365)
+                       origin-0 day number counting February 29 if present
+               Mm.n.d (0[Sunday]<=d<=6[Saturday], 1<=n<=5, 1<=m<=12)
+                       for the dth day of week n of month m of the year,
+                       where week 1 is the first week in which day d appears,
+                       and `5' stands for the last week in which day d appears
+                       (which may be either the 4th or 5th week).
+       
+       Here is an example POSIX TZ string, for US Pacific time using rules
+       appropriate from 1987 through 2006:
+
+               TZ='PST8PDT,M4.1.0/02:00,M10.5.0/02:00'  
+
+       This POSIX TZ string is hard to remember, and mishandles time stamps
+       before 1987 and after 2006.  With this package you can use this
+       instead:
+
+               TZ='America/Los_Angeles'
+
+*      POSIX does not define the exact meaning of TZ values like "EST5EDT".
+       Typically the current US DST rules are used to interpret such values,
+       but this means that the US DST rules are compiled into each program
+       that does time conversion.  This means that when US time conversion
+       rules change (as in the United States in 1987), all programs that
+       do time conversion must be recompiled to ensure proper results.
+
+*      In POSIX, there's no tamper-proof way for a process to learn the
+       system's best idea of local wall clock.  (This is important for
+       applications that an administrator wants used only at certain times--
+       without regard to whether the user has fiddled the "TZ" environment
+       variable.  While an administrator can "do everything in UTC" to get
+       around the problem, doing so is inconvenient and precludes handling
+       daylight saving time shifts--as might be required to limit phone
+       calls to off-peak hours.)
+
+*      POSIX requires that systems ignore leap seconds.
+
+These are the extensions that have been made to the POSIX functions:
+
+*      The "TZ" environment variable is used in generating the name of a file
+       from which time zone information is read (or is interpreted a la
+       POSIX); "TZ" is no longer constrained to be a three-letter time zone
+       name followed by a number of hours and an optional three-letter
+       daylight time zone name.  The daylight saving time rules to be used
+       for a particular time zone are encoded in the time zone file;
+       the format of the file allows U.S., Australian, and other rules to be
+       encoded, and allows for situations where more than two time zone
+       abbreviations are used.
+
+       It was recognized that allowing the "TZ" environment variable to
+       take on values such as "America/New_York" might cause "old" programs
+       (that expect "TZ" to have a certain form) to operate incorrectly;
+       consideration was given to using some other environment variable
+       (for example, "TIMEZONE") to hold the string used to generate the
+       time zone information file name.  In the end, however, it was decided
+       to continue using "TZ":  it is widely used for time zone purposes;
+       separately maintaining both "TZ" and "TIMEZONE" seemed a nuisance;
+       and systems where "new" forms of "TZ" might cause problems can simply
+       use TZ values such as "EST5EDT" which can be used both by
+       "new" programs (a la POSIX) and "old" programs (as zone names and
+       offsets).
+
+*      To handle places where more than two time zone abbreviations are used,
+       the functions "localtime" and "gmtime" set tzname[tmp->tm_isdst]
+       (where "tmp" is the value the function returns) to the time zone
+       abbreviation to be used.  This differs from POSIX, where the elements
+       of tzname are only changed as a result of calls to tzset.
+
+*      Since the "TZ" environment variable can now be used to control time
+       conversion, the "daylight" and "timezone" variables are no longer
+       needed.  (These variables are defined and set by "tzset"; however, their
+       values will not be used by "localtime.")
+
+*      The "localtime" function has been set up to deliver correct results
+       for near-minimum or near-maximum time_t values.  (A comment in the
+       source code tells how to get compatibly wrong results).
+
+*      A function "tzsetwall" has been added to arrange for the system's
+       best approximation to local wall clock time to be delivered by
+       subsequent calls to "localtime."  Source code for portable
+       applications that "must" run on local wall clock time should call
+       "tzsetwall();" if such code is moved to "old" systems that don't
+       provide tzsetwall, you won't be able to generate an executable program.
+       (These time zone functions also arrange for local wall clock time to be
+       used if tzset is called--directly or indirectly--and there's no "TZ"
+       environment variable; portable applications should not, however, rely
+       on this behavior since it's not the way SVR2 systems behave.)
+
+*      These functions can account for leap seconds, thanks to Bradley White.
+
+Points of interest to folks with other systems:
+
+*      This package is already part of many POSIX-compliant hosts,
+       including BSD, HP, Linux, Network Appliance, SCO, SGI, and Sun.
+       On such hosts, the primary use of this package
+       is to update obsolete time zone rule tables.
+       To do this, you may need to compile the time zone compiler
+       `zic' supplied with this package instead of using the system `zic',
+       since the format of zic's input changed slightly in late 1994,
+       and many vendors still do not support the new input format.
+
+*      The UNIX Version 7 "timezone" function is not present in this package;
+       it's impossible to reliably map timezone's arguments (a "minutes west
+       of GMT" value and a "daylight saving time in effect" flag) to a
+       time zone abbreviation, and we refuse to guess.
+       Programs that in the past used the timezone function may now examine
+       tzname[localtime(&clock)->tm_isdst] to learn the correct time
+       zone abbreviation to use.  Alternatively, use
+       localtime(&clock)->tm_zone if this has been enabled.
+
+*      The 4.2BSD gettimeofday function is not used in this package.
+       This formerly let users obtain the current UTC offset and DST flag,
+       but this functionality was removed in later versions of BSD.
+
+*      In SVR2, time conversion fails for near-minimum or near-maximum
+       time_t values when doing conversions for places that don't use UTC.
+       This package takes care to do these conversions correctly.
+
+The functions that are conditionally compiled if STD_INSPIRED is defined
+should, at this point, be looked on primarily as food for thought.  They are
+not in any sense "standard compatible"--some are not, in fact, specified in
+*any* standard.  They do, however, represent responses of various authors to
+standardization proposals.
+
+Other time conversion proposals, in particular the one developed by folks at
+Hewlett Packard, offer a wider selection of functions that provide capabilities
+beyond those provided here.  The absence of such functions from this package
+is not meant to discourage the development, standardization, or use of such
+functions.  Rather, their absence reflects the decision to make this package
+contain valid extensions to POSIX, to ensure its broad acceptability.  If
+more powerful time conversion functions can be standardized, so much the
+better.
+
+
+----- Names of time zone rule files -----
+
+The time zone rule file naming conventions attempt to strike a balance
+among the following goals:
+
+ * Uniquely identify every national region where clocks have all
+   agreed since 1970.  This is essential for the intended use: static
+   clocks keeping local civil time.
+
+ * Indicate to humans as to where that region is.  This simplifes use.
+
+ * Be robust in the presence of political changes.  This reduces the
+   number of updates and backward-compatibility hacks.  For example,
+   names of countries are ordinarily not used, to avoid
+   incompatibilities when countries change their name
+   (e.g. Zaire->Congo) or when locations change countries
+   (e.g. Hong Kong from UK colony to China).
+
+ * Be portable to a wide variety of implementations.
+   This promotes use of the technology.
+
+ * Use a consistent naming convention over the entire world.
+   This simplifies both use and maintenance.
+
+This naming convention is not intended for use by inexperienced users
+to select TZ values by themselves (though they can of course examine
+and reuse existing settings).  Distributors should provide
+documentation and/or a simple selection interface that explains the
+names; see the 'tzselect' program supplied with this distribution for
+one example.
+
+Names normally have the form AREA/LOCATION, where AREA is the name
+of a continent or ocean, and LOCATION is the name of a specific
+location within that region.  North and South America share the same
+area, `America'.  Typical names are `Africa/Cairo', `America/New_York',
+and `Pacific/Honolulu'.
+
+Here are the general rules used for choosing location names,
+in decreasing order of importance:
+
+       Use only valid POSIX file name components (i.e., the parts of
+               names other than `/').  Within a file name component,
+               use only ASCII letters, `.', `-' and `_'.  Do not use
+               digits, as that might create an ambiguity with POSIX
+               TZ strings.  A file name component must not exceed 14
+               characters or start with `-'.  E.g., prefer `Brunei'
+               to `Bandar_Seri_Begawan'.
+       Include at least one location per time zone rule set per country.
+               One such location is enough.  Use ISO 3166 (see the file
+               iso3166.tab) to help decide whether something is a country.
+               However, uninhabited ISO 3166 regions like Bouvet Island
+               do not need locations, since local time is not defined there.
+       If all the clocks in a country's region have agreed since 1970,
+               don't bother to include more than one location
+               even if subregions' clocks disagreed before 1970.
+               Otherwise these tables would become annoyingly large.
+       If a name is ambiguous, use a less ambiguous alternative;
+               e.g. many cities are named San Jose and Georgetown, so
+               prefer `Costa_Rica' to `San_Jose' and `Guyana' to `Georgetown'.
+       Keep locations compact.  Use cities or small islands, not countries
+               or regions, so that any future time zone changes do not split
+               locations into different time zones.  E.g. prefer `Paris'
+               to `France', since France has had multiple time zones.
+       Use mainstream English spelling, e.g. prefer `Rome' to `Roma', and
+               prefer `Athens' to the true name (which uses Greek letters).
+               The POSIX file name restrictions encourage this rule.
+       Use the most populous among locations in a country's time zone,
+               e.g. prefer `Shanghai' to `Beijing'.  Among locations with
+               similar populations, pick the best-known location,
+               e.g. prefer `Rome' to `Milan'.
+       Use the singular form, e.g. prefer `Canary' to `Canaries'.
+       Omit common suffixes like `_Islands' and `_City', unless that
+               would lead to ambiguity.  E.g. prefer `Cayman' to
+               `Cayman_Islands' and `Guatemala' to `Guatemala_City',
+               but prefer `Mexico_City' to `Mexico' because the country
+               of Mexico has several time zones.
+       Use `_' to represent a space.
+       Omit `.' from abbreviations in names, e.g. prefer `St_Helena'
+               to `St._Helena'.
+       Do not change established names if they only marginally
+               violate the above rules.  For example, don't change
+               the existing name `Rome' to `Milan' merely because
+               Milan's population has grown to be somewhat greater
+               than Rome's.
+       If a name is changed, put its old spelling in the `backward' file.
+
+The file `zone.tab' lists the geographical locations used to name
+time zone rule files.  It is intended to be an exhaustive list
+of canonical names for geographic regions.
+
+Older versions of this package used a different naming scheme,
+and these older names are still supported.
+See the file `backward' for most of these older names
+(e.g. `US/Eastern' instead of `America/New_York').
+The other old-fashioned names still supported are
+`WET', `CET', `MET', `EET' (see the file `europe'),
+and `Factory' (see the file `factory').
+
+
+----- Time zone abbreviations -----
+
+When this package is installed, it generates time zone abbreviations
+like `EST' to be compatible with human tradition and POSIX.
+Here are the general rules used for choosing time zone abbreviations,
+in decreasing order of importance:
+
+       Use abbreviations that consist of three or more ASCII letters.
+               Previous editions of this database also used characters like
+               ' ' and '?', but these characters have a special meaning to
+               the shell and cause commands like
+                       set `date`
+               to have unexpected effects.
+               Previous editions of this rule required upper-case letters,
+               but the Congressman who introduced Chamorro Standard Time
+               preferred "ChST", so the rule has been relaxed.
+
+               This rule guarantees that all abbreviations could have
+               been specified by a POSIX TZ string.  POSIX
+               requires at least three characters for an
+               abbreviation.  POSIX through 2000 says that an abbreviation
+               cannot start with ':', and cannot contain ',', '-',
+               '+', NUL, or a digit.  POSIX from 2001 on changes this
+               rule to say that an abbreviation can contain only '-', '+',
+               and alphanumeric characters from the portable character set
+               in the current locale.  To be portable to both sets of
+               rules, an abbreviation must therefore use only ASCII
+               letters.
+
+       Use abbreviations that are in common use among English-speakers,
+               e.g. `EST' for Eastern Standard Time in North America.
+               We assume that applications translate them to other languages
+               as part of the normal localization process; for example,
+               a French application might translate `EST' to `HNE'.
+
+       For zones whose times are taken from a city's longitude, use the
+               traditional xMT notation, e.g. `PMT' for Paris Mean Time.
+               The only name like this in current use is `GMT'.
+
+       If there is no common English abbreviation, abbreviate the English
+               translation of the usual phrase used by native speakers.
+               If this is not available or is a phrase mentioning the country
+               (e.g. ``Cape Verde Time''), then:
+
+               When a country has a single or principal time zone region,
+                       append `T' to the country's ISO code, e.g. `CVT' for
+                       Cape Verde Time.  For summer time append `ST';
+                       for double summer time append `DST'; etc.
+               When a country has multiple time zones, take the first three
+                       letters of an English place name identifying each zone
+                       and then append `T', `ST', etc. as before;
+                       e.g. `VLAST' for VLAdivostok Summer Time.
+
+       Use UTC (with time zone abbreviation "zzz") for locations while
+               uninhabited.  The "zzz" mnemonic is that these locations are,
+               in some sense, asleep.
+
+Application writers should note that these abbreviations are ambiguous
+in practice: e.g. `EST' has a different meaning in Australia than
+it does in the United States.  In new applications, it's often better
+to use numeric UTC offsets like `-0500' instead of time zone
+abbreviations like `EST'; this avoids the ambiguity.
+
+
+----- Calendrical issues -----
+
+Calendrical issues are a bit out of scope for a time zone database,
+but they indicate the sort of problems that we would run into if we
+extended the time zone database further into the past.  An excellent
+resource in this area is Edward M. Reingold and Nachum Dershowitz,
+<a href="http://emr.cs.uiuc.edu/home/reingold/calendar-book/second-edition/">
+Calendrical Calculations: The Millennium Edition
+</a>, Cambridge University Press (2001).  Other information and
+sources are given below.  They sometimes disagree.
+
+
+France
+
+Gregorian calendar adopted 1582-12-20.
+French Revolutionary calendar used 1793-11-24 through 1805-12-31,
+and (in Paris only) 1871-05-06 through 1871-05-23.
+
+
+Russia
+
+From Chris Carrier (1996-12-02):
+On 1929-10-01 the Soviet Union instituted an ``Eternal Calendar''
+with 30-day months plus 5 holidays, with a 5-day week.
+On 1931-12-01 it changed to a 6-day week; in 1934 it reverted to the
+Gregorian calendar while retaining the 6-day week; on 1940-06-27 it
+reverted to the 7-day week.  With the 6-day week the usual days
+off were the 6th, 12th, 18th, 24th and 30th of the month.
+(Source: Evitiar Zerubavel, _The Seven Day Circle_)
+
+
+Mark Brader reported a similar story in "The Book of Calendars", edited
+by Frank Parise (1982, Facts on File, ISBN 0-8719-6467-8), page 377.  But:
+
+From: Petteri Sulonen (via Usenet)
+Date: 14 Jan 1999 00:00:00 GMT
+...
+
+If your source is correct, how come documents between 1929 -- 1940 were
+still dated using the conventional, Gregorian calendar?
+
+I can post a scan of a document dated December 1, 1934, signed by
+Yenukidze, the secretary, on behalf of Kalinin, the President of the
+Executive Committee of the Supreme Soviet, if you like.
+
+
+
+Sweden (and Finland)
+
+From: Mark Brader
+<a href="news:1996Jul6.012937.29190@sq.com">
+Subject: Re: Gregorian reform -- a part of locale?
+</a>
+Date: 1996-07-06
+
+In 1700, Denmark made the transition from Julian to Gregorian.  Sweden
+decided to *start* a transition in 1700 as well, but rather than have one of
+those unsightly calendar gaps :-), they simply decreed that the next leap
+year after 1696 would be in 1744 -- putting the whole country on a calendar
+different from both Julian and Gregorian for a period of 40 years.
+
+However, in 1704 something went wrong and the plan was not carried through;
+they did, after all, have a leap year that year.  And one in 1708.  In 1712
+they gave it up and went back to Julian, putting 30 days in February that
+year!...
+
+Then in 1753, Sweden made the transition to Gregorian in the usual manner,
+getting there only 13 years behind the original schedule.
+
+(A previous posting of this story was challenged, and Swedish readers
+produced the following references to support it: "Tiderakning och historia"
+by Natanael Beckman (1924) and "Tid, en bok om tiderakning och
+kalendervasen" by Lars-Olof Lode'n (no date was given).)
+
+
+Grotefend's data
+
+From: "Michael Palmer" [with one obvious typo fixed]
+Subject: Re: Gregorian Calendar (was Re: Another FHC related question
+Newsgroups: soc.genealogy.german
+Date: Tue, 9 Feb 1999 02:32:48 -800
+...
+
+The following is a(n incomplete) listing, arranged chronologically, of
+European states, with the date they converted from the Julian to the
+Gregorian calendar:
+
+04/15 Oct 1582 - Italy (with exceptions), Spain, Portugal, Poland (Roman
+                 Catholics and Danzig only)
+09/20 Dec 1582 - France, Lorraine
+
+21 Dec 1582/
+   01 Jan 1583 - Holland, Brabant, Flanders, Hennegau
+10/21 Feb 1583 - bishopric of Liege (L"uttich)
+13/24 Feb 1583 - bishopric of Augsburg
+04/15 Oct 1583 - electorate of Trier
+05/16 Oct 1583 - Bavaria, bishoprics of Freising, Eichstedt, Regensburg,
+                 Salzburg, Brixen
+13/24 Oct 1583 - Austrian Oberelsass and Breisgau
+20/31 Oct 1583 - bishopric of Basel
+02/13 Nov 1583 - duchy of J"ulich-Berg
+02/13 Nov 1583 - electorate and city of K"oln
+04/15 Nov 1583 - bishopric of W"urzburg
+11/22 Nov 1583 - electorate of Mainz
+16/27 Nov 1583 - bishopric of Strassburg and the margraviate of Baden
+17/28 Nov 1583 - bishopric of M"unster and duchy of Cleve
+14/25 Dec 1583 - Steiermark
+
+06/17 Jan 1584 - Austria and Bohemia
+11/22 Jan 1584 - Luzern, Uri, Schwyz, Zug, Freiburg, Solothurn
+12/23 Jan 1584 - Silesia and the Lausitz
+22 Jan/
+   02 Feb 1584 - Hungary (legally on 21 Oct 1587)
+      Jun 1584 - Unterwalden
+01/12 Jul 1584 - duchy of Westfalen
+
+16/27 Jun 1585 - bishopric of Paderborn
+
+14/25 Dec 1590 - Transylvania
+
+22 Aug/
+   02 Sep 1612 - duchy of Prussia
+
+13/24 Dec 1614 - Pfalz-Neuburg
+
+          1617 - duchy of Kurland (reverted to the Julian calendar in
+                 1796)
+
+          1624 - bishopric of Osnabr"uck
+
+          1630 - bishopric of Minden
+
+15/26 Mar 1631 - bishopric of Hildesheim
+
+          1655 - Kanton Wallis
+
+05/16 Feb 1682 - city of Strassburg
+
+18 Feb/
+   01 Mar 1700 - Protestant Germany (including Swedish possessions in
+                 Germany), Denmark, Norway
+30 Jun/
+   12 Jul 1700 - Gelderland, Zutphen
+10 Nov/
+   12 Dec 1700 - Utrecht, Overijssel
+
+31 Dec 1700/
+   12 Jan 1701 - Friesland, Groningen, Z"urich, Bern, Basel, Geneva,
+                 Turgau, and Schaffhausen
+
+          1724 - Glarus, Appenzell, and the city of St. Gallen
+
+01 Jan 1750    - Pisa and Florence
+
+02/14 Sep 1752 - Great Britain
+
+17 Feb/
+   01 Mar 1753 - Sweden
+
+1760-1812      - Graub"unden
+
+The Russian empire (including Finland and the Baltic states) did not
+convert to the Gregorian calendar until the Soviet revolution of 1917.
+
+Source:  H. Grotefend, _Taschenbuch der Zeitrechnung des deutschen
+Mittelalters und der Neuzeit_, herausgegeben von Dr. O. Grotefend
+(Hannover:  Hahnsche Buchhandlung, 1941), pp. 26-28.
+
+
+----- Time and time zones on Mars -----
+
+Some people have adjusted their work schedules to fit Mars time.
+Dozens of special Mars watches were built for Jet Propulsion
+Laboratory workers who kept Mars time during the Mars Exploration
+Rovers mission (2004).  These timepieces look like normal Seikos and
+Citizens but use Mars seconds rather than terrestrial seconds.
+
+A Mars solar day is called a "sol" and has a mean period equal to
+about 24 hours 39 minutes 35.244 seconds in terrestrial time.  It is
+divided into a conventional 24-hour clock, so each Mars second equals
+about 1.02749125 terrestrial seconds.
+
+The prime meridian of Mars goes through the center of the crater
+Airy-0, named in honor of the British astronomer who built the
+Greenwich telescope that defines Earth's prime meridian.  Mean solar
+time on the Mars prime meridian is called Mars Coordinated Time (MTC).
+
+Each landed mission on Mars has adopted a different reference for
+solar time keeping, so there is no real standard for Mars time zones.
+For example, the Mars Exploration Rover project (2004) defined two
+time zones "Local Solar Time A" and "Local Solar Time B" for its two
+missions, each zone designed so that its time equals local true solar
+time at approximately the middle of the nominal mission.  Such a "time
+zone" is not particularly suited for any application other than the
+mission itself.
+
+Many calendars have been proposed for Mars, but none have achieved
+wide acceptance.  Astronomers often use Mars Sol Date (MSD) which is a
+sequential count of Mars solar days elapsed since about 1873-12-29
+12:00 GMT.
+
+The tz database does not currently support Mars time, but it is
+documented here in the hopes that support will be added eventually.
+
+Sources:
+
+Michael Allison and Robert Schmunk,
+"Technical Notes on Mars Solar Time as Adopted by the Mars24 Sunclock"
+<http://www.giss.nasa.gov/tools/mars24/help/notes.html> (2004-07-30).
+
+Jia-Rui Chong, "Workdays Fit for a Martian", Los Angeles Times
+(2004-01-14), pp A1, A20-A21.
diff --git a/commands/zoneinfo/africa b/commands/zoneinfo/africa
new file mode 100644 (file)
index 0000000..141365c
--- /dev/null
@@ -0,0 +1,641 @@
+# @(#)africa   8.7
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+#
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# Previous editions of this database used WAT, CAT, SAT, and EAT
+# for +0:00 through +3:00, respectively,
+# but Mark R V Murray reports that
+# `SAST' is the official abbreviation for +2:00 in the country of South Africa,
+# `CAT' is commonly used for +2:00 in countries north of South Africa, and
+# `WAT' is probably the best name for +1:00, as the common phrase for
+# the area that includes Nigeria is ``West Africa''.
+# He has heard of ``Western Sahara Time'' for +0:00 but can find no reference.
+#
+# To make things confusing, `WAT' seems to have been used for -1:00 long ago;
+# I'd guess that this was because people needed _some_ name for -1:00,
+# and at the time, far west Africa was the only major land area in -1:00.
+# This usage is now obsolete, as the last use of -1:00 on the African
+# mainland seems to have been 1976 in Western Sahara.
+#
+# To summarize, the following abbreviations seem to have some currency:
+#      -1:00   WAT     West Africa Time (no longer used)
+#       0:00   GMT     Greenwich Mean Time
+#       2:00   CAT     Central Africa Time
+#       2:00   SAST    South Africa Standard Time
+# and Murray suggests the following abbreviation:
+#       1:00   WAT     West Africa Time
+# I realize that this leads to `WAT' being used for both -1:00 and 1:00
+# for times before 1976, but this is the best I can think of
+# until we get more information.
+#
+# I invented the following abbreviations; corrections are welcome!
+#       2:00   WAST    West Africa Summer Time
+#       2:30   BEAT    British East Africa Time (no longer used)
+#       2:44:45 BEAUT  British East Africa Unified Time (no longer used)
+#       3:00   CAST    Central Africa Summer Time (no longer used)
+#       3:00   SAST    South Africa Summer Time (no longer used)
+#       3:00   EAT     East Africa Time
+#       4:00   EAST    East Africa Summer Time (no longer used)
+
+# Algeria
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Algeria 1916    only    -       Jun     14      23:00s  1:00    S
+Rule   Algeria 1916    1919    -       Oct     Sun>=1  23:00s  0       -
+Rule   Algeria 1917    only    -       Mar     24      23:00s  1:00    S
+Rule   Algeria 1918    only    -       Mar      9      23:00s  1:00    S
+Rule   Algeria 1919    only    -       Mar      1      23:00s  1:00    S
+Rule   Algeria 1920    only    -       Feb     14      23:00s  1:00    S
+Rule   Algeria 1920    only    -       Oct     23      23:00s  0       -
+Rule   Algeria 1921    only    -       Mar     14      23:00s  1:00    S
+Rule   Algeria 1921    only    -       Jun     21      23:00s  0       -
+Rule   Algeria 1939    only    -       Sep     11      23:00s  1:00    S
+Rule   Algeria 1939    only    -       Nov     19       1:00   0       -
+Rule   Algeria 1944    1945    -       Apr     Mon>=1   2:00   1:00    S
+Rule   Algeria 1944    only    -       Oct      8       2:00   0       -
+Rule   Algeria 1945    only    -       Sep     16       1:00   0       -
+Rule   Algeria 1971    only    -       Apr     25      23:00s  1:00    S
+Rule   Algeria 1971    only    -       Sep     26      23:00s  0       -
+Rule   Algeria 1977    only    -       May      6       0:00   1:00    S
+Rule   Algeria 1977    only    -       Oct     21       0:00   0       -
+Rule   Algeria 1978    only    -       Mar     24       1:00   1:00    S
+Rule   Algeria 1978    only    -       Sep     22       3:00   0       -
+Rule   Algeria 1980    only    -       Apr     25       0:00   1:00    S
+Rule   Algeria 1980    only    -       Oct     31       2:00   0       -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Algiers  0:12:12 -       LMT     1891 Mar 15 0:01
+                       0:09:21 -       PMT     1911 Mar 11    # Paris Mean Time
+                       0:00    Algeria WE%sT   1940 Feb 25 2:00
+                       1:00    Algeria CE%sT   1946 Oct  7
+                       0:00    -       WET     1956 Jan 29
+                       1:00    -       CET     1963 Apr 14
+                       0:00    Algeria WE%sT   1977 Oct 21
+                       1:00    Algeria CE%sT   1979 Oct 26
+                       0:00    Algeria WE%sT   1981 May
+                       1:00    -       CET
+
+# Angola
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Luanda   0:52:56 -       LMT     1892
+                       0:52:04 -       AOT     1911 May 26 # Angola Time
+                       1:00    -       WAT
+
+# Benin
+# Whitman says they switched to 1:00 in 1946, not 1934;
+# go with Shanks & Pottenger.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Porto-Novo 0:10:28 -       LMT     1912
+                       0:00    -       GMT     1934 Feb 26
+                       1:00    -       WAT
+
+# Botswana
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Gaborone 1:43:40 -       LMT     1885
+                       2:00    -       CAT     1943 Sep 19 2:00
+                       2:00    1:00    CAST    1944 Mar 19 2:00
+                       2:00    -       CAT
+
+# Burkina Faso
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Ouagadougou        -0:06:04 -      LMT     1912
+                        0:00   -       GMT
+
+# Burundi
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Bujumbura  1:57:28 -       LMT     1890
+                       2:00    -       CAT
+
+# Cameroon
+# Whitman says they switched to 1:00 in 1920; go with Shanks & Pottenger.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Douala   0:38:48 -       LMT     1912
+                       1:00    -       WAT
+
+# Cape Verde
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/Cape_Verde -1:34:04 -    LMT     1907                    # Praia
+                       -2:00   -       CVT     1942 Sep
+                       -2:00   1:00    CVST    1945 Oct 15
+                       -2:00   -       CVT     1975 Nov 25 2:00
+                       -1:00   -       CVT
+
+# Central African Republic
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Bangui   1:14:20 -       LMT     1912
+                       1:00    -       WAT
+
+# Chad
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Ndjamena 1:00:12 -       LMT     1912
+                       1:00    -       WAT     1979 Oct 14
+                       1:00    1:00    WAST    1980 Mar  8
+                       1:00    -       WAT
+
+# Comoros
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Comoro   2:53:04 -       LMT     1911 Jul   # Moroni, Gran Comoro
+                       3:00    -       EAT
+
+# Democratic Republic of Congo
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Kinshasa   1:01:12 -       LMT     1897 Nov 9
+                       1:00    -       WAT
+Zone Africa/Lubumbashi 1:49:52 -       LMT     1897 Nov 9
+                       2:00    -       CAT
+
+# Republic of the Congo
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Brazzaville        1:01:08 -       LMT     1912
+                       1:00    -       WAT
+
+# Cote D'Ivoire
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Abidjan  -0:16:08 -      LMT     1912
+                        0:00   -       GMT
+
+# Djibouti
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Djibouti 2:52:36 -       LMT     1911 Jul
+                       3:00    -       EAT
+
+###############################################################################
+
+# Egypt
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Egypt   1940    only    -       Jul     15      0:00    1:00    S
+Rule   Egypt   1940    only    -       Oct      1      0:00    0       -
+Rule   Egypt   1941    only    -       Apr     15      0:00    1:00    S
+Rule   Egypt   1941    only    -       Sep     16      0:00    0       -
+Rule   Egypt   1942    1944    -       Apr      1      0:00    1:00    S
+Rule   Egypt   1942    only    -       Oct     27      0:00    0       -
+Rule   Egypt   1943    1945    -       Nov      1      0:00    0       -
+Rule   Egypt   1945    only    -       Apr     16      0:00    1:00    S
+Rule   Egypt   1957    only    -       May     10      0:00    1:00    S
+Rule   Egypt   1957    1958    -       Oct      1      0:00    0       -
+Rule   Egypt   1958    only    -       May      1      0:00    1:00    S
+Rule   Egypt   1959    1981    -       May      1      1:00    1:00    S
+Rule   Egypt   1959    1965    -       Sep     30      3:00    0       -
+Rule   Egypt   1966    1994    -       Oct      1      3:00    0       -
+Rule   Egypt   1982    only    -       Jul     25      1:00    1:00    S
+Rule   Egypt   1983    only    -       Jul     12      1:00    1:00    S
+Rule   Egypt   1984    1988    -       May      1      1:00    1:00    S
+Rule   Egypt   1989    only    -       May      6      1:00    1:00    S
+Rule   Egypt   1990    1994    -       May      1      1:00    1:00    S
+# IATA (after 1990) says transitions are at 0:00.
+# Go with IATA starting in 1995, except correct 1995 entry from 09-30 to 09-29.
+Rule   Egypt   1995    max     -       Apr     lastFri  0:00s  1:00    S
+Rule   Egypt   1995    2005    -       Sep     lastThu 23:00s  0       -
+# From Steffen Thorsen (2006-09-19):
+# The Egyptian Gazette, issue 41,090 (2006-09-18), page 1, reports:
+# Egypt will turn back clocks by one hour at the midnight of Thursday
+# after observing the daylight saving time since May.
+# http://news.gom.com.eg/gazette/pdf/2006/09/18/01.pdf
+Rule   Egypt   2006    only    -       Sep     21      23:00s  0       -
+Rule   Egypt   2007    max     -       Sep     lastThu 23:00s  0       -
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Cairo    2:05:00 -       LMT     1900 Oct
+                       2:00    Egypt   EE%sT
+
+# Equatorial Guinea
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Malabo   0:35:08 -       LMT     1912
+                       0:00    -       GMT     1963 Dec 15
+                       1:00    -       WAT
+
+# Eritrea
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Asmara   2:35:32 -       LMT     1870
+                       2:35:32 -       AMT     1890          # Asmara Mean Time
+                       2:35:20 -       ADMT    1936 May 5    # Adis Dera MT
+                       3:00    -       EAT
+
+# Ethiopia
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that Ethiopia had six narrowly-spaced time zones
+# between 1870 and 1890, and that they merged to 38E50 (2:35:20) in 1890.
+# We'll guess that 38E50 is for Adis Dera.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Addis_Ababa        2:34:48 -       LMT     1870
+                       2:35:20 -       ADMT    1936 May 5    # Adis Dera MT
+                       3:00    -       EAT
+
+# Gabon
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Libreville 0:37:48 -       LMT     1912
+                       1:00    -       WAT
+
+# Gambia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Banjul   -1:06:36 -      LMT     1912
+                       -1:06:36 -      BMT     1935    # Banjul Mean Time
+                       -1:00   -       WAT     1964
+                        0:00   -       GMT
+
+# Ghana
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Whitman says DST was observed from 1931 to ``the present'';
+# go with Shanks & Pottenger.
+Rule   Ghana   1936    1942    -       Sep      1      0:00    0:20    GHST
+Rule   Ghana   1936    1942    -       Dec     31      0:00    0       GMT
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Accra    -0:00:52 -      LMT     1918
+                        0:00   Ghana   %s
+
+# Guinea
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Conakry  -0:54:52 -      LMT     1912
+                        0:00   -       GMT     1934 Feb 26
+                       -1:00   -       WAT     1960
+                        0:00   -       GMT
+
+# Guinea-Bissau
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Bissau   -1:02:20 -      LMT     1911 May 26
+                       -1:00   -       WAT     1975
+                        0:00   -       GMT
+
+# Kenya
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Nairobi  2:27:16 -       LMT     1928 Jul
+                       3:00    -       EAT     1930
+                       2:30    -       BEAT    1940
+                       2:44:45 -       BEAUT   1960
+                       3:00    -       EAT
+
+# Lesotho
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Maseru   1:50:00 -       LMT     1903 Mar
+                       2:00    -       SAST    1943 Sep 19 2:00
+                       2:00    1:00    SAST    1944 Mar 19 2:00
+                       2:00    -       SAST
+
+# Liberia
+# From Paul Eggert (2006-03-22):
+# In 1972 Liberia was the last country to switch
+# from a UTC offset that was not a multiple of 15 or 20 minutes.
+# Howse reports that it was in honor of their president's birthday.
+# Shank & Pottenger report the date as May 1, whereas Howse reports Jan;
+# go with Shanks & Pottenger.
+# For Liberia before 1972, Shanks & Pottenger report -0:44, whereas Howse and
+# Whitman each report -0:44:30; go with the more precise figure.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Monrovia -0:43:08 -      LMT     1882
+                       -0:43:08 -      MMT     1919 Mar # Monrovia Mean Time
+                       -0:44:30 -      LRT     1972 May # Liberia Time
+                        0:00   -       GMT
+
+###############################################################################
+
+# Libya
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Libya   1951    only    -       Oct     14      2:00    1:00    S
+Rule   Libya   1952    only    -       Jan      1      0:00    0       -
+Rule   Libya   1953    only    -       Oct      9      2:00    1:00    S
+Rule   Libya   1954    only    -       Jan      1      0:00    0       -
+Rule   Libya   1955    only    -       Sep     30      0:00    1:00    S
+Rule   Libya   1956    only    -       Jan      1      0:00    0       -
+Rule   Libya   1982    1984    -       Apr      1      0:00    1:00    S
+Rule   Libya   1982    1985    -       Oct      1      0:00    0       -
+Rule   Libya   1985    only    -       Apr      6      0:00    1:00    S
+Rule   Libya   1986    only    -       Apr      4      0:00    1:00    S
+Rule   Libya   1986    only    -       Oct      3      0:00    0       -
+Rule   Libya   1987    1989    -       Apr      1      0:00    1:00    S
+Rule   Libya   1987    1989    -       Oct      1      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Tripoli  0:52:44 -       LMT     1920
+                       1:00    Libya   CE%sT   1959
+                       2:00    -       EET     1982
+                       1:00    Libya   CE%sT   1990 May  4
+# The following entries are from Shanks & Pottenger;
+# the IATA SSIM data contain some obvious errors.
+                       2:00    -       EET     1996 Sep 30
+                       1:00    -       CET     1997 Apr  4
+                       1:00    1:00    CEST    1997 Oct  4
+                       2:00    -       EET
+
+# Madagascar
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Indian/Antananarivo 3:10:04 -     LMT     1911 Jul
+                       3:00    -       EAT     1954 Feb 27 23:00s
+                       3:00    1:00    EAST    1954 May 29 23:00s
+                       3:00    -       EAT
+
+# Malawi
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Blantyre 2:20:00 -       LMT     1903 Mar
+                       2:00    -       CAT
+
+# Mali
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Bamako   -0:32:00 -      LMT     1912
+                        0:00   -       GMT     1934 Feb 26
+                       -1:00   -       WAT     1960 Jun 20
+                        0:00   -       GMT
+
+# Mauritania
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Nouakchott -1:03:48 -      LMT     1912
+                        0:00   -       GMT     1934 Feb 26
+                       -1:00   -       WAT     1960 Nov 28
+                        0:00   -       GMT
+
+# Mauritius
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Indian/Mauritius  3:50:00 -       LMT     1907            # Port Louis
+                       4:00    -       MUT     # Mauritius Time
+# Agalega Is, Rodriguez
+# no information; probably like Indian/Mauritius
+
+# Mayotte
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Mayotte  3:00:56 -       LMT     1911 Jul        # Mamoutzou
+                       3:00    -       EAT
+
+# Morocco
+# See the `europe' file for Spanish Morocco (Africa/Ceuta).
+# RULE NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Morocco 1939    only    -       Sep     12       0:00   1:00    S
+Rule   Morocco 1939    only    -       Nov     19       0:00   0       -
+Rule   Morocco 1940    only    -       Feb     25       0:00   1:00    S
+Rule   Morocco 1945    only    -       Nov     18       0:00   0       -
+Rule   Morocco 1950    only    -       Jun     11       0:00   1:00    S
+Rule   Morocco 1950    only    -       Oct     29       0:00   0       -
+Rule   Morocco 1967    only    -       Jun      3      12:00   1:00    S
+Rule   Morocco 1967    only    -       Oct      1       0:00   0       -
+Rule   Morocco 1974    only    -       Jun     24       0:00   1:00    S
+Rule   Morocco 1974    only    -       Sep      1       0:00   0       -
+Rule   Morocco 1976    1977    -       May      1       0:00   1:00    S
+Rule   Morocco 1976    only    -       Aug      1       0:00   0       -
+Rule   Morocco 1977    only    -       Sep     28       0:00   0       -
+Rule   Morocco 1978    only    -       Jun      1       0:00   1:00    S
+Rule   Morocco 1978    only    -       Aug      4       0:00   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Casablanca -0:30:20 -      LMT     1913 Oct 26
+                        0:00   Morocco WE%sT   1984 Mar 16
+                        1:00   -       CET     1986
+                        0:00   -       WET
+# Western Sahara
+Zone Africa/El_Aaiun   -0:52:48 -      LMT     1934 Jan
+                       -1:00   -       WAT     1976 Apr 14
+                        0:00   -       WET
+
+# Mozambique
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Maputo   2:10:20 -       LMT     1903 Mar
+                       2:00    -       CAT
+
+# Namibia
+# The 1994-04-03 transition is from Shanks & Pottenger.
+# Shanks & Pottenger report no DST after 1998-04; go with IATA.
+# RULE NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Namibia 1994    max     -       Sep     Sun>=1  2:00    1:00    S
+Rule   Namibia 1995    max     -       Apr     Sun>=1  2:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Windhoek 1:08:24 -       LMT     1892 Feb 8
+                       1:30    -       SWAT    1903 Mar        # SW Africa Time
+                       2:00    -       SAST    1942 Sep 20 2:00
+                       2:00    1:00    SAST    1943 Mar 21 2:00
+                       2:00    -       SAST    1990 Mar 21 # independence
+                       2:00    -       CAT     1994 Apr  3
+                       1:00    Namibia WA%sT
+
+# Niger
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Niamey    0:08:28 -      LMT     1912
+                       -1:00   -       WAT     1934 Feb 26
+                        0:00   -       GMT     1960
+                        1:00   -       WAT
+
+# Nigeria
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Lagos    0:13:36 -       LMT     1919 Sep
+                       1:00    -       WAT
+
+# Reunion
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Reunion  3:41:52 -       LMT     1911 Jun        # Saint-Denis
+                       4:00    -       RET     # Reunion Time
+#
+# Scattered Islands (Iles Eparses) administered from Reunion are as follows.
+# The following information about them is taken from
+# Iles Eparses (www.outre-mer.gouv.fr/domtom/ile.htm, 1997-07-22, in French;
+# no longer available as of 1999-08-17).
+# We have no info about their time zone histories.
+#
+# Bassas da India - uninhabited
+# Europa Island - inhabited from 1905 to 1910 by two families
+# Glorioso Is - inhabited until at least 1958
+# Juan de Nova - uninhabited
+# Tromelin - inhabited until at least 1958
+
+# Rwanda
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Kigali   2:00:16 -       LMT     1935 Jun
+                       2:00    -       CAT
+
+# St Helena
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/St_Helena        -0:22:48 -      LMT     1890            # Jamestown
+                       -0:22:48 -      JMT     1951    # Jamestown Mean Time
+                        0:00   -       GMT
+# The other parts of the St Helena territory are similar:
+#      Tristan da Cunha: on GMT, say Whitman and the CIA
+#      Ascension: on GMT, says usno1995 and the CIA
+#      Gough (scientific station since 1955; sealers wintered previously):
+#              on GMT, says the CIA
+#      Inaccessible, Nightingale: no information, but probably GMT
+
+# Sao Tome and Principe
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Sao_Tome  0:26:56 -      LMT     1884
+                       -0:36:32 -      LMT     1912    # Lisbon Mean Time
+                        0:00   -       GMT
+
+# Senegal
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Dakar    -1:09:44 -      LMT     1912
+                       -1:00   -       WAT     1941 Jun
+                        0:00   -       GMT
+
+# Seychelles
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Mahe     3:41:48 -       LMT     1906 Jun        # Victoria
+                       4:00    -       SCT     # Seychelles Time
+# From Paul Eggert (2001-05-30):
+# Aldabra, Farquhar, and Desroches, originally dependencies of the
+# Seychelles, were transferred to the British Indian Ocean Territory
+# in 1965 and returned to Seychelles control in 1976.  We don't know
+# whether this affected their time zone, so omit this for now.
+# Possibly the islands were uninhabited.
+
+# Sierra Leone
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Whitman gives Mar 31 - Aug 31 for 1931 on; go with Shanks & Pottenger.
+Rule   SL      1935    1942    -       Jun      1      0:00    0:40    SLST
+Rule   SL      1935    1942    -       Oct      1      0:00    0       WAT
+Rule   SL      1957    1962    -       Jun      1      0:00    1:00    SLST
+Rule   SL      1957    1962    -       Sep      1      0:00    0       GMT
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Freetown -0:53:00 -      LMT     1882
+                       -0:53:00 -      FMT     1913 Jun # Freetown Mean Time
+                       -1:00   SL      %s      1957
+                        0:00   SL      %s
+
+# Somalia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Mogadishu  3:01:28 -       LMT     1893 Nov
+                       3:00    -       EAT     1931
+                       2:30    -       BEAT    1957
+                       3:00    -       EAT
+
+# South Africa
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   SA      1942    1943    -       Sep     Sun>=15 2:00    1:00    -
+Rule   SA      1943    1944    -       Mar     Sun>=15 2:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Johannesburg 1:52:00 -     LMT     1892 Feb 8
+                       1:30    -       SAST    1903 Mar
+                       2:00    SA      SAST
+# Marion and Prince Edward Is
+# scientific station since 1947
+# no information
+
+# Sudan
+#
+# From <a href="http://www.sunanews.net/sn13jane.html">
+# Sudan News Agency (2000-01-13)
+# </a>, also reported by Michael De Beukelaer-Dossche via Steffen Thorsen:
+# Clocks will be moved ahead for 60 minutes all over the Sudan as of noon
+# Saturday....  This was announced Thursday by Caretaker State Minister for
+# Manpower Abdul-Rahman Nur-Eddin.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Sudan   1970    only    -       May      1      0:00    1:00    S
+Rule   Sudan   1970    1985    -       Oct     15      0:00    0       -
+Rule   Sudan   1971    only    -       Apr     30      0:00    1:00    S
+Rule   Sudan   1972    1985    -       Apr     lastSun 0:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Khartoum 2:10:08 -       LMT     1931
+                       2:00    Sudan   CA%sT   2000 Jan 15 12:00
+                       3:00    -       EAT
+
+# Swaziland
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Mbabane  2:04:24 -       LMT     1903 Mar
+                       2:00    -       SAST
+
+# Tanzania
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Africa/Dar_es_Salaam 2:37:08 -    LMT     1931
+                       3:00    -       EAT     1948
+                       2:44:45 -       BEAUT   1961
+                       3:00    -       EAT
+
+# Togo
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Lome     0:04:52 -       LMT     1893
+                       0:00    -       GMT
+
+# Tunisia
+
+# From Gwillim Law (2005-04-30):
+# My correspondent, Risto Nykanen, has alerted me to another adoption of DST,
+# this time in Tunisia.  According to Yahoo France News
+# <http://fr.news.yahoo.com/050426/5/4dumk.html>, in a story attributed to AP
+# and dated 2005-04-26, "Tunisia has decided to advance its official time by
+# one hour, starting on Sunday, May 1.  Henceforth, Tunisian time will be
+# UTC+2 instead of UTC+1.  The change will take place at 23:00 UTC next
+# Saturday."  (My translation)
+#
+# From Oscar van Vlijmen (2005-05-02):
+# LaPresse, the first national daily newspaper ...
+# <http://www.lapresse.tn/archives/archives280405/actualites/lheure.html>
+# ... DST for 2005: on: Sun May 1 0h standard time, off: Fri Sept. 30,
+# 1h standard time.
+#
+# From Atef Loukil (2006-03-28):
+# The daylight saving time will be the same each year:
+# Beginning      : the last Sunday of March at 02:00
+# Ending         : the last Sunday of October at 03:00 ...
+# http://www.tap.info.tn/en/index.php?option=com_content&task=view&id=1188&Itemid=50
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Tunisia 1939    only    -       Apr     15      23:00s  1:00    S
+Rule   Tunisia 1939    only    -       Nov     18      23:00s  0       -
+Rule   Tunisia 1940    only    -       Feb     25      23:00s  1:00    S
+Rule   Tunisia 1941    only    -       Oct      6       0:00   0       -
+Rule   Tunisia 1942    only    -       Mar      9       0:00   1:00    S
+Rule   Tunisia 1942    only    -       Nov      2       3:00   0       -
+Rule   Tunisia 1943    only    -       Mar     29       2:00   1:00    S
+Rule   Tunisia 1943    only    -       Apr     17       2:00   0       -
+Rule   Tunisia 1943    only    -       Apr     25       2:00   1:00    S
+Rule   Tunisia 1943    only    -       Oct      4       2:00   0       -
+Rule   Tunisia 1944    1945    -       Apr     Mon>=1   2:00   1:00    S
+Rule   Tunisia 1944    only    -       Oct      8       0:00   0       -
+Rule   Tunisia 1945    only    -       Sep     16       0:00   0       -
+Rule   Tunisia 1977    only    -       Apr     30       0:00s  1:00    S
+Rule   Tunisia 1977    only    -       Sep     24       0:00s  0       -
+Rule   Tunisia 1978    only    -       May      1       0:00s  1:00    S
+Rule   Tunisia 1978    only    -       Oct      1       0:00s  0       -
+Rule   Tunisia 1988    only    -       Jun      1       0:00s  1:00    S
+Rule   Tunisia 1988    1990    -       Sep     lastSun  0:00s  0       -
+Rule   Tunisia 1989    only    -       Mar     26       0:00s  1:00    S
+Rule   Tunisia 1990    only    -       May      1       0:00s  1:00    S
+Rule   Tunisia 2005    only    -       May      1       0:00s  1:00    S
+Rule   Tunisia 2005    only    -       Sep     30       1:00s  0       -
+Rule   Tunisia 2006    max     -       Mar     lastSun  2:00s  1:00    S
+Rule   Tunisia 2006    max     -       Oct     lastSun  2:00s  0       -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Shanks & Pottenger say the 1911 switch was on Mar 9; go with Howse's Mar 11.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Tunis    0:40:44 -       LMT     1881 May 12
+                       0:09:21 -       PMT     1911 Mar 11    # Paris Mean Time
+                       1:00    Tunisia CE%sT
+
+# Uganda
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Kampala  2:09:40 -       LMT     1928 Jul
+                       3:00    -       EAT     1930
+                       2:30    -       BEAT    1948
+                       2:44:45 -       BEAUT   1957
+                       3:00    -       EAT
+
+# Zambia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Lusaka   1:53:08 -       LMT     1903 Mar
+                       2:00    -       CAT
+
+# Zimbabwe
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Africa/Harare   2:04:12 -       LMT     1903 Mar
+                       2:00    -       CAT
diff --git a/commands/zoneinfo/antarctica b/commands/zoneinfo/antarctica
new file mode 100644 (file)
index 0000000..2584ae4
--- /dev/null
@@ -0,0 +1,325 @@
+# @(#)antarctica       8.3
+# <pre>
+
+# From Paul Eggert (1999-11-15):
+# To keep things manageable, we list only locations occupied year-round; see
+# <a href="http://www.comnap.aq/comnap/comnap.nsf/P/Stations/">
+# COMNAP - Stations and Bases
+# </a>
+# and
+# <a href="http://www.spri.cam.ac.uk/bob/periant.htm">
+# Summary of the Peri-Antarctic Islands (1998-07-23)
+# </a>
+# for information.
+# Unless otherwise specified, we have no time zone information.
+#
+# Except for the French entries,
+# I made up all time zone abbreviations mentioned here; corrections welcome!
+# FORMAT is `zzz' and GMTOFF is 0 for locations while uninhabited.
+
+# These rules are stolen from the `europe' file.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   RussAQ  1981    1984    -       Apr      1       0:00   1:00    S
+Rule   RussAQ  1981    1983    -       Oct      1       0:00   0       -
+Rule   RussAQ  1984    1991    -       Sep     lastSun  2:00s  0       -
+Rule   RussAQ  1985    1991    -       Mar     lastSun  2:00s  1:00    S
+Rule   RussAQ  1992    only    -       Mar     lastSat  23:00  1:00    S
+Rule   RussAQ  1992    only    -       Sep     lastSat  23:00  0       -
+Rule   RussAQ  1993    max     -       Mar     lastSun  2:00s  1:00    S
+Rule   RussAQ  1993    1995    -       Sep     lastSun  2:00s  0       -
+Rule   RussAQ  1996    max     -       Oct     lastSun  2:00s  0       -
+
+# These rules are stolen from the `southamerica' file.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   ArgAQ   1964    1966    -       Mar      1      0:00    0       -
+Rule   ArgAQ   1964    1966    -       Oct     15      0:00    1:00    S
+Rule   ArgAQ   1967    only    -       Apr      2      0:00    0       -
+Rule   ArgAQ   1967    1968    -       Oct     Sun>=1  0:00    1:00    S
+Rule   ArgAQ   1968    1969    -       Apr     Sun>=1  0:00    0       -
+Rule   ArgAQ   1974    only    -       Jan     23      0:00    1:00    S
+Rule   ArgAQ   1974    only    -       May      1      0:00    0       -
+Rule   ChileAQ 1972    1986    -       Mar     Sun>=9  3:00u   0       -
+Rule   ChileAQ 1974    1987    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   ChileAQ 1987    only    -       Apr     12      3:00u   0       -
+Rule   ChileAQ 1988    1989    -       Mar     Sun>=9  3:00u   0       -
+Rule   ChileAQ 1988    only    -       Oct     Sun>=1  4:00u   1:00    S
+Rule   ChileAQ 1989    only    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   ChileAQ 1990    only    -       Mar     18      3:00u   0       -
+Rule   ChileAQ 1990    only    -       Sep     16      4:00u   1:00    S
+Rule   ChileAQ 1991    1996    -       Mar     Sun>=9  3:00u   0       -
+Rule   ChileAQ 1991    1997    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   ChileAQ 1997    only    -       Mar     30      3:00u   0       -
+Rule   ChileAQ 1998    only    -       Mar     Sun>=9  3:00u   0       -
+Rule   ChileAQ 1998    only    -       Sep     27      4:00u   1:00    S
+Rule   ChileAQ 1999    only    -       Apr      4      3:00u   0       -
+Rule   ChileAQ 1999    max     -       Oct     Sun>=9  4:00u   1:00    S
+Rule   ChileAQ 2000    max     -       Mar     Sun>=9  3:00u   0       -
+
+
+# Argentina - year-round bases
+# Belgrano II, Confin Coast, -770227-0343737, since 1972-02-05
+# Esperanza, San Martin Land, -6323-05659, since 1952-12-17
+# Jubany, Potter Peninsula, King George Island, -6414-0602320, since 1982-01
+# Marambio, Seymour I, -6414-05637, since 1969-10-29
+# Orcadas, Laurie I, -6016-04444, since 1904-02-22
+# San Martin, Debenham I, -6807-06708, since 1951-03-21
+#      (except 1960-03 / 1976-03-21)
+
+# Australia - territories
+# Heard Island, McDonald Islands (uninhabited)
+#      previously sealers and scientific personnel wintered
+#      <a href="http://web.archive.org/web/20021204222245/http://www.dstc.qut.edu.au/DST/marg/daylight.html">
+#      Margaret Turner reports
+#      </a> (1999-09-30) that they're UTC+5, with no DST;
+#      presumably this is when they have visitors.
+#
+# year-round bases
+# Casey, Bailey Peninsula, -6617+11032, since 1969
+# Davis, Vestfold Hills, -6835+07759, since 1957-01-13
+#      (except 1964-11 - 1969-02)
+# Mawson, Holme Bay, -6736+06253, since 1954-02-13
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/Casey  0       -       zzz     1969
+                       8:00    -       WST     # Western (Aus) Standard Time
+Zone Antarctica/Davis  0       -       zzz     1957 Jan 13
+                       7:00    -       DAVT    1964 Nov # Davis Time
+                       0       -       zzz     1969 Feb
+                       7:00    -       DAVT
+Zone Antarctica/Mawson 0       -       zzz     1954 Feb 13
+                       6:00    -       MAWT    # Mawson Time
+# References:
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html">
+# Casey Weather (1998-02-26)
+# </a>
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/davis/video.html">
+# Davis Station, Antarctica (1998-02-26)
+# </a>
+# <a href="http://www.antdiv.gov.au/aad/exop/sfo/mawson/video.html">
+# Mawson Station, Antarctica (1998-02-25)
+# </a>
+
+# Brazil - year-round base
+# Comandante Ferraz, King George Island, -6205+05824, since 1983/4
+
+# Chile - year-round bases and towns
+# Escudero, South Shetland Is, -621157-0585735, since 1994
+# Presidente Eduadro Frei, King George Island, -6214-05848, since 1969-03-07
+# General Bernardo O'Higgins, Antarctic Peninsula, -6319-05704, since 1948-02
+# Capitan Arturo Prat, -6230-05941
+# Villa Las Estrellas (a town), around the Frei base, since 1984-04-09
+# These locations have always used Santiago time; use TZ='America/Santiago'.
+
+# China - year-round bases
+# Great Wall, King George Island, -6213-05858, since 1985-02-20
+# Zhongshan, Larsemann Hills, Prydz Bay, -6922+07623, since 1989-02-26
+
+# France - year-round bases
+#
+# From Antoine Leca (1997-01-20):
+# Time data are from Nicole Pailleau at the IFRTP
+# (French Institute for Polar Research and Technology).
+# She confirms that French Southern Territories and Terre Adelie bases
+# don't observe daylight saving time, even if Terre Adelie supplies came
+# from Tasmania.
+#
+# French Southern Territories with year-round inhabitants
+#
+# Martin-de-Vivies Base, Amsterdam Island, -374105+0773155, since 1950
+# Alfred-Faure Base, Crozet Islands, -462551+0515152, since 1964
+# Port-aux-Francais, Kerguelen Islands, -492110+0701303, since 1951;
+#      whaling & sealing station operated 1908/1914, 1920/1929, and 1951/1956
+#
+# St Paul Island - near Amsterdam, uninhabited
+#      fishing stations operated variously 1819/1931
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Indian/Kerguelen  0       -       zzz     1950    # Port-aux-Francais
+                       5:00    -       TFT     # ISO code TF Time
+#
+# year-round base in the main continent
+# Dumont-d'Urville, Ile des Petrels, -6640+14001, since 1956-11
+#
+# Another base at Port-Martin, 50km east, began operation in 1947.
+# It was destroyed by fire on 1952-01-14.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/DumontDUrville 0 -     zzz     1947
+                       10:00   -       PMT     1952 Jan 14 # Port-Martin Time
+                       0       -       zzz     1956 Nov
+                       10:00   -       DDUT    # Dumont-d'Urville Time
+# Reference:
+# <a href="http://en.wikipedia.org/wiki/Dumont_d'Urville_Station">
+# Dumont d'Urville Station (2005-12-05)
+# </a>
+
+# Germany - year-round base
+# Georg von Neumayer, -7039-00815
+
+# India - year-round base
+# Dakshin Gangotri, -7005+01200
+
+# Japan - year-round bases
+# Dome Fuji, -7719+03942
+# Syowa, -690022+0393524
+#
+# From Hideyuki Suzuki (1999-02-06):
+# In all Japanese stations, +0300 is used as the standard time.
+#
+# Syowa station, which is the first antarctic station of Japan,
+# was established on 1957-01-29.  Since Syowa station is still the main
+# station of Japan, it's appropriate for the principal location.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/Syowa  0       -       zzz     1957 Jan 29
+                       3:00    -       SYOT    # Syowa Time
+# See:
+# <a href="http://www.nipr.ac.jp/english/ara01.html">
+# NIPR Antarctic Research Activities (1999-08-17)
+# </a>
+
+# S Korea - year-round base
+# King Sejong, King George Island, -6213-05847, since 1988
+
+# New Zealand - claims
+# Balleny Islands (never inhabited)
+# Scott Island (never inhabited)
+#
+# year-round base
+# Scott, Ross Island, since 1957-01, is like Antarctica/McMurdo.
+#
+# These rules for New Zealand are stolen from the `australasia' file.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   NZAQ    1974    only    -       Nov      3      2:00s   1:00    D
+Rule   NZAQ    1975    1988    -       Oct     lastSun 2:00s   1:00    D
+Rule   NZAQ    1989    only    -       Oct      8      2:00s   1:00    D
+Rule   NZAQ    1990    max     -       Oct     Sun>=1  2:00s   1:00    D
+Rule   NZAQ    1975    only    -       Feb     23      2:00s   0       S
+Rule   NZAQ    1976    1989    -       Mar     Sun>=1  2:00s   0       S
+Rule   NZAQ    1990    max     -       Mar     Sun>=15 2:00s   0       S
+
+# Norway - territories
+# Bouvet (never inhabited)
+#
+# claims
+# Peter I Island (never inhabited)
+
+# Poland - year-round base
+# Arctowski, King George Island, -620945-0582745, since 1977
+
+# Russia - year-round bases
+# Bellingshausen, King George Island, -621159-0585337, since 1968-02-22
+# Mirny, Davis coast, -6633+09301, since 1956-02
+# Molodezhnaya, Alasheyev Bay, -6740+04551,
+#      year-round from 1962-02 to 1999-07-01
+# Novolazarevskaya, Queen Maud Land, -7046+01150,
+#      year-round from 1960/61 to 1992
+
+# Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11
+# <a href="http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP">
+# From Craig Mundell (1994-12-15)</a>:
+# Vostok, which is one of the Russian stations, is set on the same
+# time as Moscow, Russia.
+#
+# From Lee Hotz (2001-03-08):
+# I queried the folks at Columbia who spent the summer at Vostok and this is
+# what they had to say about time there:
+# ``in the US Camp (East Camp) we have been on New Zealand (McMurdo)
+# time, which is 12 hours ahead of GMT. The Russian Station Vostok was
+# 6 hours behind that (although only 2 miles away, i.e. 6 hours ahead
+# of GMT). This is a time zone I think two hours east of Moscow. The
+# natural time zone is in between the two: 8 hours ahead of GMT.''
+#
+# From Paul Eggert (2001-05-04):
+# This seems to be hopelessly confusing, so I asked Lee Hotz about it
+# in person.  He said that some Antartic locations set their local
+# time so that noon is the warmest part of the day, and that this
+# changes during the year and does not necessarily correspond to mean
+# solar noon.  So the Vostok time might have been whatever the clocks
+# happened to be during their visit.  So we still don't really know what time
+# it is at Vostok.  But we'll guess UTC+6.
+#
+Zone Antarctica/Vostok 0       -       zzz     1957 Dec 16
+                       6:00    -       VOST    # Vostok time
+
+# S Africa - year-round bases
+# Marion Island, -4653+03752
+# Sanae, -7141-00250
+
+# UK
+#
+# British Antarctic Territories (BAT) claims
+# South Orkney Islands
+#      scientific station from 1903
+#      whaling station at Signy I 1920/1926
+# South Shetland Islands
+#
+# year-round bases
+# Bird Island, South Georgia, -5400-03803, since 1983
+# Deception Island, -6259-06034, whaling station 1912/1931,
+#      scientific station 1943/1967,
+#      previously sealers and a scientific expedition wintered by accident,
+#      and a garrison was deployed briefly
+# Halley, Coates Land, -7535-02604, since 1956-01-06
+#      Halley is on a moving ice shelf and is periodically relocated
+#      so that it is never more than 10km from its nominal location.
+# Rothera, Adelaide Island, -6734-6808, since 1976-12-01
+#
+# From Paul Eggert (2002-10-22)
+# <http://webexhibits.org/daylightsaving/g.html> says Rothera is -03 all year.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/Rothera        0       -       zzz     1976 Dec  1
+                       -3:00   -       ROTT    # Rothera time
+
+# Uruguay - year round base
+# Artigas, King George Island, -621104-0585107
+
+# USA - year-round bases
+#
+# Palmer, Anvers Island, since 1965 (moved 2 miles in 1968)
+#
+# From Ethan Dicks (1996-10-06):
+# It keeps the same time as Punta Arenas, Chile, because, just like us
+# and the South Pole, that's the other end of their supply line....
+# I verified with someone who was there that since 1980,
+# Palmer has followed Chile.  Prior to that, before the Falklands War,
+# Palmer used to be supplied from Argentina.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/Palmer 0       -       zzz     1965
+                       -4:00   ArgAQ   AR%sT   1969 Oct 5
+                       -3:00   ArgAQ   AR%sT   1982 May
+                       -4:00   ChileAQ CL%sT
+#
+#
+# McMurdo, Ross Island, since 1955-12
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Antarctica/McMurdo        0       -       zzz     1956
+                       12:00   NZAQ    NZ%sT
+#
+# Amundsen-Scott, South Pole, continuously occupied since 1956-11-20
+#
+# From Paul Eggert (1996-09-03):
+# Normally it wouldn't have a separate entry, since it's like the
+# larger Antarctica/McMurdo since 1970, but it's too famous to omit.
+#
+# From Chris Carrier (1996-06-27):
+# Siple, the first commander of the South Pole station,
+# stated that he would have liked to have kept GMT at the station,
+# but that he found it more convenient to keep GMT+12
+# as supplies for the station were coming from McMurdo Sound,
+# which was on GMT+12 because New Zealand was on GMT+12 all year
+# at that time (1957).  (Source: Siple's book 90 degrees SOUTH.)
+#
+# From Susan Smith
+# http://www.cybertours.com/whs/pole10.html
+# (1995-11-13 16:24:56 +1300, no longer available):
+# We use the same time as McMurdo does.
+# And they use the same time as Christchurch, NZ does....
+# One last quirk about South Pole time.
+# All the electric clocks are usually wrong.
+# Something about the generators running at 60.1hertz or something
+# makes all of the clocks run fast.  So every couple of days,
+# we have to go around and set them back 5 minutes or so.
+# Maybe if we let them run fast all of the time, we'd get to leave here sooner!!
+#
+Link   Antarctica/McMurdo      Antarctica/South_Pole
diff --git a/commands/zoneinfo/asctime.c b/commands/zoneinfo/asctime.c
new file mode 100644 (file)
index 0000000..f5d8f53
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+** Avoid the temptation to punt entirely to strftime;
+** the output of strftime is supposed to be locale specific
+** whereas the output of asctime is supposed to be constant.
+*/
+
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)asctime.c      7.32";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*LINTLIBRARY*/
+
+#include "private.h"
+#include "tzfile.h"
+
+/*
+** Some systems only handle "%.2d"; others only handle "%02d";
+** "%02.2d" makes (most) everybody happy.
+** At least some versions of gcc warn about the %02.2d; ignore the warning.
+*/
+/*
+** All years associated with 32-bit time_t values are exactly four digits long;
+** some years associated with 64-bit time_t values are not.
+** Vintage programs are coded for years that are always four digits long
+** and may assume that the newline always lands in the same place.
+** For years that are less than four digits, we pad the output with
+** leading zeroes to get the newline in the traditional place.
+** The -4 ensures that we get four characters of output even if
+** we call a strftime variant that produces fewer characters for some years.
+** The ISO C 1999 and POSIX 1003.1-2004 standards prohibit padding the year,
+** but many implementations pad anyway; most likely the standards are buggy.
+*/
+#define ASCTIME_FMT    "%.3s %.3s%3d %02.2d:%02.2d:%02.2d %-4s\n"
+/*
+** For years that are more than four digits we put extra spaces before the year
+** so that code trying to overwrite the newline won't end up overwriting
+** a digit within a year and truncating the year (operating on the assumption
+** that no output is better than wrong output).
+*/
+#define ASCTIME_FMT_B  "%.3s %.3s%3d %02.2d:%02.2d:%02.2d     %s\n"
+
+#define STD_ASCTIME_BUF_SIZE   26
+/*
+** Big enough for something such as
+** ??? ???-2147483648 -2147483648:-2147483648:-2147483648     -2147483648\n
+** (two three-character abbreviations, five strings denoting integers,
+** seven explicit spaces, two explicit colons, a newline,
+** and a trailing ASCII nul).
+** The values above are for systems where an int is 32 bits and are provided
+** as an example; the define below calculates the maximum for the system at
+** hand.
+*/
+#define MAX_ASCTIME_BUF_SIZE   (2*3+5*INT_STRLEN_MAXIMUM(int)+7+2+1+1)
+
+static char    buf_asctime[MAX_ASCTIME_BUF_SIZE];
+
+/*
+** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
+*/
+
+char *
+asctime_r(timeptr, buf)
+register const struct tm *     timeptr;
+char *                         buf;
+{
+       static const char       wday_name[][3] = {
+               "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+       };
+       static const char       mon_name[][3] = {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+       };
+       register const char *   wn;
+       register const char *   mn;
+       char                    year[INT_STRLEN_MAXIMUM(int) + 2];
+       char                    result[MAX_ASCTIME_BUF_SIZE];
+
+       if (timeptr->tm_wday < 0 || timeptr->tm_wday >= DAYSPERWEEK)
+               wn = "???";
+       else    wn = wday_name[timeptr->tm_wday];
+       if (timeptr->tm_mon < 0 || timeptr->tm_mon >= MONSPERYEAR)
+               mn = "???";
+       else    mn = mon_name[timeptr->tm_mon];
+       /*
+       ** Use strftime's %Y to generate the year, to avoid overflow problems
+       ** when computing timeptr->tm_year + TM_YEAR_BASE.
+       ** Assume that strftime is unaffected by other out-of-range members
+       ** (e.g., timeptr->tm_mday) when processing "%Y".
+       */
+       (void) strftime(year, sizeof year, "%Y", timeptr);
+       /*
+       ** We avoid using snprintf since it's not available on all systems.
+       */
+       (void) sprintf(result,
+               ((strlen(year) <= 4) ? ASCTIME_FMT : ASCTIME_FMT_B),
+               wn, mn,
+               timeptr->tm_mday, timeptr->tm_hour,
+               timeptr->tm_min, timeptr->tm_sec,
+               year);
+       if (strlen(result) < STD_ASCTIME_BUF_SIZE || buf == buf_asctime) {
+               (void) strcpy(buf, result);
+               return buf;
+       } else {
+#ifdef EOVERFLOW
+               errno = EOVERFLOW;
+#else /* !defined EOVERFLOW */
+               errno = EINVAL;
+#endif /* !defined EOVERFLOW */
+               return NULL;
+       }
+}
+
+/*
+** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
+*/
+
+char *
+asctime(timeptr)
+register const struct tm *     timeptr;
+{
+       return asctime_r(timeptr, buf_asctime);
+}
diff --git a/commands/zoneinfo/asia b/commands/zoneinfo/asia
new file mode 100644 (file)
index 0000000..78c2cf5
--- /dev/null
@@ -0,0 +1,1787 @@
+# @(#)asia     8.10
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+#
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+#           std  dst
+#           LMT        Local Mean Time
+#      2:00 EET  EEST  Eastern European Time
+#      2:00 IST  IDT   Israel
+#      3:00 AST  ADT   Arabia*
+#      3:30 IRST IRDT  Iran
+#      4:00 GST        Gulf*
+#      5:30 IST        India
+#      7:00 ICT        Indochina*
+#      7:00 WIT        west Indonesia
+#      8:00 CIT        central Indonesia
+#      8:00 CST        China
+#      9:00 CJT        Central Japanese Time (1896/1937)*
+#      9:00 EIT        east Indonesia
+#      9:00 JST  JDT   Japan
+#      9:00 KST  KDT   Korea
+#      9:30 CST        (Australian) Central Standard Time
+#
+# See the `europe' file for Russia and Turkey in Asia.
+
+# From Guy Harris:
+# Incorporates data for Singapore from Robert Elz' asia 1.1, as well as
+# additional information from Tom Yap, Sun Microsystems Intercontinental
+# Technical Support (including a page from the Official Airline Guide -
+# Worldwide Edition).  The names for time zones are guesses.
+
+###############################################################################
+
+# These rules are stolen from the `europe' file.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   EUAsia  1981    max     -       Mar     lastSun  1:00u  1:00    S
+Rule   EUAsia  1979    1995    -       Sep     lastSun  1:00u  0       -
+Rule   EUAsia  1996    max     -       Oct     lastSun  1:00u  0       -
+Rule E-EurAsia 1981    max     -       Mar     lastSun  0:00   1:00    S
+Rule E-EurAsia 1979    1995    -       Sep     lastSun  0:00   0       -
+Rule E-EurAsia 1996    max     -       Oct     lastSun  0:00   0       -
+Rule RussiaAsia        1981    1984    -       Apr     1        0:00   1:00    S
+Rule RussiaAsia        1981    1983    -       Oct     1        0:00   0       -
+Rule RussiaAsia        1984    1991    -       Sep     lastSun  2:00s  0       -
+Rule RussiaAsia        1985    1991    -       Mar     lastSun  2:00s  1:00    S
+Rule RussiaAsia        1992    only    -       Mar     lastSat 23:00   1:00    S
+Rule RussiaAsia        1992    only    -       Sep     lastSat 23:00   0       -
+Rule RussiaAsia        1993    max     -       Mar     lastSun  2:00s  1:00    S
+Rule RussiaAsia        1993    1995    -       Sep     lastSun  2:00s  0       -
+Rule RussiaAsia        1996    max     -       Oct     lastSun  2:00s  0       -
+
+# Afghanistan
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Kabul      4:36:48 -       LMT     1890
+                       4:00    -       AFT     1945
+                       4:30    -       AFT
+
+# Armenia
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger have Yerevan switching to 3:00 (with Russian DST)
+# in spring 1991, then to 4:00 with no DST in fall 1995, then
+# readopting Russian DST in 1997.  Go with Shanks & Pottenger, even
+# when they disagree with others.  Edgar Der-Danieliantz
+# reported (1996-05-04) that Yerevan probably wouldn't use DST
+# in 1996, though it did use DST in 1995.  IATA SSIM (1991/1998) reports that
+# Armenia switched from 3:00 to 4:00 in 1998 and observed DST after 1991,
+# but started switching at 3:00s in 1998.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Yerevan    2:58:00 -       LMT     1924 May  2
+                       3:00    -       YERT    1957 Mar    # Yerevan Time
+                       4:00 RussiaAsia YER%sT  1991 Mar 31 2:00s
+                       3:00    1:00    YERST   1991 Sep 23 # independence
+                       3:00 RussiaAsia AM%sT   1995 Sep 24 2:00s
+                       4:00    -       AMT     1997
+                       4:00 RussiaAsia AM%sT
+
+# Azerbaijan
+# From Rustam Aliyev of the Azerbaijan Internet Forum (2005-10-23):
+# According to the resolution of Cabinet of Ministers, 1997
+# Resolution available at: http://aif.az/docs/daylight_res.pdf
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Azer    1997    max     -       Mar     lastSun  4:00   1:00    S
+Rule   Azer    1997    max     -       Oct     lastSun  5:00   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Baku       3:19:24 -       LMT     1924 May  2
+                       3:00    -       BAKT    1957 Mar    # Baku Time
+                       4:00 RussiaAsia BAK%sT  1991 Mar 31 2:00s
+                       3:00    1:00    BAKST   1991 Aug 30 # independence
+                       3:00 RussiaAsia AZ%sT   1992 Sep lastSat 23:00
+                       4:00    -       AZT     1996 # Azerbaijan time
+                       4:00    EUAsia  AZ%sT   1997
+                       4:00    Azer    AZ%sT
+
+# Bahrain
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Bahrain    3:22:20 -       LMT     1920            # Al Manamah
+                       4:00    -       GST     1972 Jun
+                       3:00    -       AST
+
+# Bangladesh
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Dhaka      6:01:40 -       LMT     1890
+                       5:53:20 -       HMT     1941 Oct    # Howrah Mean Time?
+                       6:30    -       BURT    1942 May 15 # Burma Time
+                       5:30    -       IST     1942 Sep
+                       6:30    -       BURT    1951 Sep 30
+                       6:00    -       DACT    1971 Mar 26 # Dacca Time
+                       6:00    -       BDT     # Bangladesh Time
+
+# Bhutan
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Thimphu    5:58:36 -       LMT     1947 Aug 15 # or Thimbu
+                       5:30    -       IST     1987 Oct
+                       6:00    -       BTT     # Bhutan Time
+
+# British Indian Ocean Territory
+# Whitman and the 1995 CIA time zone map say 5:00, but the
+# 1997 and later maps say 6:00.  Assume the switch occurred in 1996.
+# We have no information as to when standard time was introduced;
+# assume it occurred in 1907, the same year as Mauritius (which
+# then contained the Chagos Archipelago).
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Chagos   4:49:40 -       LMT     1907
+                       5:00    -       IOT     1996 # BIOT Time
+                       6:00    -       IOT
+
+# Brunei
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Brunei     7:39:40 -       LMT     1926 Mar   # Bandar Seri Begawan
+                       7:30    -       BNT     1933
+                       8:00    -       BNT
+
+# Burma / Myanmar
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Rangoon    6:24:40 -       LMT     1880            # or Yangon
+                       6:24:36 -       RMT     1920       # Rangoon Mean Time?
+                       6:30    -       BURT    1942 May   # Burma Time
+                       9:00    -       JST     1945 May 3
+                       6:30    -       MMT                # Myanmar Time
+
+# Cambodia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Phnom_Penh 6:59:40 -       LMT     1906 Jun  9
+                       7:06:20 -       SMT     1911 Mar 11 0:01 # Saigon MT?
+                       7:00    -       ICT     1912 May
+                       8:00    -       ICT     1931 May
+                       7:00    -       ICT
+
+# China
+
+# From Guy Harris:
+# People's Republic of China.  Yes, they really have only one time zone.
+
+# From Bob Devine (1988-01-28):
+# No they don't.  See TIME mag, 1986-02-17 p.52.  Even though
+# China is across 4 physical time zones, before Feb 1, 1986 only the
+# Peking (Bejing) time zone was recognized.  Since that date, China
+# has two of 'em -- Peking's and Urumqi (named after the capital of
+# the Xinjiang Uyghur Autonomous Region).  I don't know about DST for it.
+#
+# . . .I just deleted the DST table and this editor makes it too
+# painful to suck in another copy..  So, here is what I have for
+# DST start/end dates for Peking's time zone (info from AP):
+#
+#     1986 May 4 - Sept 14
+#     1987 mid-April - ??
+
+# From U. S. Naval Observatory (1989-01-19):
+# CHINA               8 H  AHEAD OF UTC  ALL OF CHINA, INCL TAIWAN
+# CHINA               9 H  AHEAD OF UTC  APR 17 - SEP 10
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that China (except for Hong Kong and Macau)
+# has had a single time zone since 1980 May 1, observing summer DST
+# from 1986 through 1991; this contradicts Devine's
+# note about Time magazine, though apparently _something_ happened in 1986.
+# Go with Shanks & Pottenger for now.  I made up names for the other
+# pre-1980 time zones.
+
+# From Shanks & Pottenger:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Shang   1940    only    -       Jun      3      0:00    1:00    D
+Rule   Shang   1940    1941    -       Oct      1      0:00    0       S
+Rule   Shang   1941    only    -       Mar     16      0:00    1:00    D
+Rule   PRC     1986    only    -       May      4      0:00    1:00    D
+Rule   PRC     1986    1991    -       Sep     Sun>=11 0:00    0       S
+Rule   PRC     1987    1991    -       Apr     Sun>=10 0:00    1:00    D
+
+# From Anthony Fok (2001-12-20):
+# BTW, I did some research on-line and found some info regarding these five
+# historic timezones from some Taiwan websites.  And yes, there are official
+# Chinese names for these locales (before 1949).
+#
+# From Jesper Norgaard Welen (2006-07-14):
+# I have investigated the timezones around 1970 on the
+# http://www.astro.com/atlas site [with provinces and county
+# boundaries summarized below]....  A few other exceptions were two
+# counties on the Sichuan side of the Xizang-Sichuan border,
+# counties Dege and Baiyu which lies on the Sichuan side and are
+# therefore supposed to be GMT+7, Xizang region being GMT+6, but Dege
+# county is GMT+8 according to astro.com while Baiyu county is GMT+6
+# (could be true), for the moment I am assuming that those two
+# counties are mistakes in the astro.com data.
+
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Changbai Time ("Long-white Time", Long-white = Heilongjiang area)
+# Heilongjiang (except Mohe county), Jilin
+Zone   Asia/Harbin     8:26:44 -       LMT     1928 # or Haerbin
+                       8:30    -       CHAT    1932 Mar # Changbai Time
+                       8:00    -       CST     1940
+                       9:00    -       CHAT    1966 May
+                       8:30    -       CHAT    1980 May
+                       8:00    PRC     C%sT
+# Zhongyuan Time ("Central plain Time")
+# most of China
+Zone   Asia/Shanghai   8:05:52 -       LMT     1928
+                       8:00    Shang   C%sT    1949
+                       8:00    PRC     C%sT
+# Long-shu Time (probably due to Long and Shu being two names of that area)
+# Guangxi, Guizhou, Hainan, Ningxia, Sichuan, Shaanxi, and Yunnan;
+# most of Gansu; west Inner Mongolia; west Qinghai; and the Guangdong
+# counties Deqing, Enping, Kaiping, Luoding, Taishan, Xinxing,
+# Yangchun, Yangjiang, Yu'nan, and Yunfu.
+Zone   Asia/Chongqing  7:06:20 -       LMT     1928 # or Chungking
+                       7:00    -       LONT    1980 May # Long-shu Time
+                       8:00    PRC     C%sT
+# Xin-zang Time ("Xinjiang-Tibet Time")
+# The Gansu counties Aksay, Anxi, Dunhuang, Subei; west Qinghai;
+# the Guangdong counties  Xuwen, Haikang, Suixi, Lianjiang,
+# Zhanjiang, Wuchuan, Huazhou, Gaozhou, Maoming, Dianbai, and Xinyi;
+# east Tibet, including Lhasa, Chamdo, Shigaise, Jimsar, Shawan and Hutubi;
+# east Xinjiang, including Urumqi, Turpan, Karamay, Korla, Minfeng, Jinghe,
+# Wusu, Qiemo, Xinyan, Wulanwusu, Jinghe, Yumin, Tacheng, Tuoli, Emin,
+# Shihezi, Changji, Yanqi, Heshuo, Tuokexun, Tulufan, Shanshan, Hami,
+# Fukang, Kuitun, Kumukuli, Miquan, Qitai, and Turfan.
+Zone   Asia/Urumqi     5:50:20 -       LMT     1928 # or Urumchi
+                       6:00    -       URUT    1980 May # Urumqi Time
+                       8:00    PRC     C%sT
+# Kunlun Time
+# West Tibet, including Pulan, Aheqi, Shufu, Shule;
+# West Xinjiang, including Aksu, Atushi, Yining, Hetian, Cele, Luopu, Nileke,
+# Zhaosu, Tekesi, Gongliu, Chabuchaer, Huocheng, Bole, Pishan, Suiding,
+# and Yarkand.
+Zone   Asia/Kashgar    5:03:56 -       LMT     1928 # or Kashi or Kaxgar
+                       5:30    -       KAST    1940     # Kashgar Time
+                       5:00    -       KAST    1980 May
+                       8:00    PRC     C%sT
+
+# Hong Kong (Xianggang)
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   HK      1946    only    -       Apr     20      3:30    1:00    S
+Rule   HK      1946    only    -       Dec     1       3:30    0       -
+Rule   HK      1947    only    -       Apr     13      3:30    1:00    S
+Rule   HK      1947    only    -       Dec     30      3:30    0       -
+Rule   HK      1948    only    -       May     2       3:30    1:00    S
+Rule   HK      1948    1952    -       Oct     lastSun 3:30    0       -
+Rule   HK      1949    1953    -       Apr     Sun>=1  3:30    1:00    S
+Rule   HK      1953    only    -       Nov     1       3:30    0       -
+Rule   HK      1954    1964    -       Mar     Sun>=18 3:30    1:00    S
+Rule   HK      1954    only    -       Oct     31      3:30    0       -
+Rule   HK      1955    1964    -       Nov     Sun>=1  3:30    0       -
+Rule   HK      1965    1977    -       Apr     Sun>=16 3:30    1:00    S
+Rule   HK      1965    1977    -       Oct     Sun>=16 3:30    0       -
+Rule   HK      1979    1980    -       May     Sun>=8  3:30    1:00    S
+Rule   HK      1979    1980    -       Oct     Sun>=16 3:30    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Hong_Kong  7:36:36 -       LMT     1904 Oct 30
+                       8:00    HK      HK%sT
+
+
+###############################################################################
+
+# Taiwan
+
+# Shanks & Pottenger write that Taiwan observed DST during 1945, when it
+# was still controlled by Japan.  This is hard to believe, but we don't
+# have any other information.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Taiwan  1945    1951    -       May     1       0:00    1:00    D
+Rule   Taiwan  1945    1951    -       Oct     1       0:00    0       S
+Rule   Taiwan  1952    only    -       Mar     1       0:00    1:00    D
+Rule   Taiwan  1952    1954    -       Nov     1       0:00    0       S
+Rule   Taiwan  1953    1959    -       Apr     1       0:00    1:00    D
+Rule   Taiwan  1955    1961    -       Oct     1       0:00    0       S
+Rule   Taiwan  1960    1961    -       Jun     1       0:00    1:00    D
+Rule   Taiwan  1974    1975    -       Apr     1       0:00    1:00    D
+Rule   Taiwan  1974    1975    -       Oct     1       0:00    0       S
+Rule   Taiwan  1980    only    -       Jun     30      0:00    1:00    D
+Rule   Taiwan  1980    only    -       Sep     30      0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Taipei     8:06:00 -       LMT     1896 # or Taibei or T'ai-pei
+                       8:00    Taiwan  C%sT
+
+# Macau (Macao, Aomen)
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Macau   1961    1962    -       Mar     Sun>=16 3:30    1:00    S
+Rule   Macau   1961    1964    -       Nov     Sun>=1  3:30    0       -
+Rule   Macau   1963    only    -       Mar     Sun>=16 0:00    1:00    S
+Rule   Macau   1964    only    -       Mar     Sun>=16 3:30    1:00    S
+Rule   Macau   1965    only    -       Mar     Sun>=16 0:00    1:00    S
+Rule   Macau   1965    only    -       Oct     31      0:00    0       -
+Rule   Macau   1966    1971    -       Apr     Sun>=16 3:30    1:00    S
+Rule   Macau   1966    1971    -       Oct     Sun>=16 3:30    0       -
+Rule   Macau   1972    1974    -       Apr     Sun>=15 0:00    1:00    S
+Rule   Macau   1972    1973    -       Oct     Sun>=15 0:00    0       -
+Rule   Macau   1974    1977    -       Oct     Sun>=15 3:30    0       -
+Rule   Macau   1975    1977    -       Apr     Sun>=15 3:30    1:00    S
+Rule   Macau   1978    1980    -       Apr     Sun>=15 0:00    1:00    S
+Rule   Macau   1978    1980    -       Oct     Sun>=15 0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Macau      7:34:20 -       LMT     1912
+                       8:00    Macau   MO%sT   1999 Dec 20 # return to China
+                       8:00    PRC     C%sT
+
+
+###############################################################################
+
+# Cyprus
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Cyprus  1975    only    -       Apr     13      0:00    1:00    S
+Rule   Cyprus  1975    only    -       Oct     12      0:00    0       -
+Rule   Cyprus  1976    only    -       May     15      0:00    1:00    S
+Rule   Cyprus  1976    only    -       Oct     11      0:00    0       -
+Rule   Cyprus  1977    1980    -       Apr     Sun>=1  0:00    1:00    S
+Rule   Cyprus  1977    only    -       Sep     25      0:00    0       -
+Rule   Cyprus  1978    only    -       Oct     2       0:00    0       -
+Rule   Cyprus  1979    1997    -       Sep     lastSun 0:00    0       -
+Rule   Cyprus  1981    1998    -       Mar     lastSun 0:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Nicosia    2:13:28 -       LMT     1921 Nov 14
+                       2:00    Cyprus  EE%sT   1998 Sep
+                       2:00    EUAsia  EE%sT
+# IATA SSIM (1998-09) has Cyprus using EU rules for the first time.
+
+# Classically, Cyprus belongs to Asia; e.g. see Herodotus, Histories, I.72.
+# However, for various reasons many users expect to find it under Europe.
+Link   Asia/Nicosia    Europe/Nicosia
+
+# Georgia
+# From Paul Eggert (1994-11-19):
+# Today's _Economist_ (p 60) reports that Georgia moved its clocks forward
+# an hour recently, due to a law proposed by Zurab Murvanidze,
+# an MP who went on a hunger strike for 11 days to force discussion about it!
+# We have no details, but we'll guess they didn't move the clocks back in fall.
+#
+# From Mathew Englander, quoting AP (1996-10-23 13:05-04):
+# Instead of putting back clocks at the end of October, Georgia
+# will stay on daylight savings time this winter to save energy,
+# President Eduard Shevardnadze decreed Wednesday.
+#
+# From the BBC via Joseph S. Myers (2004-06-27):
+#
+# Georgia moved closer to Western Europe on Sunday...  The former Soviet
+# republic has changed its time zone back to that of Moscow.  As a result it
+# is now just four hours ahead of Greenwich Mean Time, rather than five hours
+# ahead.  The switch was decreed by the pro-Western president of Georgia,
+# Mikhail Saakashvili, who said the change was partly prompted by the process
+# of integration into Europe.
+
+# From Teimuraz Abashidze (2005-11-07):
+# Government of Georgia ... decided to NOT CHANGE daylight savings time on
+# [Oct.] 30, as it was done before during last more than 10 years.
+# Currently, we are in fact GMT +4:00, as before 30 October it was GMT
+# +3:00.... The problem is, there is NO FORMAL LAW or governmental document
+# about it.  As far as I can find, I was told, that there is no document,
+# because we just DIDN'T ISSUE document about switching to winter time....
+# I don't know what can be done, especially knowing that some years ago our
+# DST rules where changed THREE TIMES during one month.
+
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Tbilisi    2:59:16 -       LMT     1880
+                       2:59:16 -       TBMT    1924 May  2 # Tbilisi Mean Time
+                       3:00    -       TBIT    1957 Mar    # Tbilisi Time
+                       4:00 RussiaAsia TBI%sT  1991 Mar 31 2:00s
+                       3:00    1:00    TBIST   1991 Apr  9 # independence
+                       3:00 RussiaAsia GE%sT   1992 # Georgia Time
+                       3:00 E-EurAsia  GE%sT   1994 Sep lastSun
+                       4:00 E-EurAsia  GE%sT   1996 Oct lastSun
+                       4:00    1:00    GEST    1997 Mar lastSun
+                       4:00 E-EurAsia  GE%sT   2004 Jun 27
+                       3:00 RussiaAsia GE%sT   2005 Mar lastSun 2:00
+                       4:00    -       GET
+
+# East Timor
+
+# See Indonesia for the 1945 transition.
+
+# From Joao Carrascalao, brother of the former governor of East Timor, in
+# <a href="http://etan.org/et99c/december/26-31/30ETMAY.htm">
+# East Timor may be late for its millennium
+# </a> (1999-12-26/31):
+# Portugal tried to change the time forward in 1974 because the sun
+# rises too early but the suggestion raised a lot of problems with the
+# Timorese and I still don't think it would work today because it
+# conflicts with their way of life.
+
+# From Paul Eggert (2000-12-04):
+# We don't have any record of the above attempt.
+# Most likely our records are incomplete, but we have no better data.
+
+# <a href="http://www.hri.org/news/world/undh/last/00-08-16.undh.html">
+# From Manoel de Almeida e Silva, Deputy Spokesman for the UN Secretary-General
+# (2000-08-16)</a>:
+# The Cabinet of the East Timor Transition Administration decided
+# today to advance East Timor's time by one hour.  The time change,
+# which will be permanent, with no seasonal adjustment, will happen at
+# midnight on Saturday, September 16.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Dili       8:22:20 -       LMT     1912
+                       8:00    -       TLT     1942 Feb 21 23:00 # E Timor Time
+                       9:00    -       JST     1945 Sep 23
+                       9:00    -       TLT     1976 May  3
+                       8:00    -       CIT     2000 Sep 17 00:00
+                       9:00    -       TLT
+
+# India
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Calcutta   5:53:28 -       LMT     1880    # Kolkata
+                       5:53:20 -       HMT     1941 Oct    # Howrah Mean Time?
+                       6:30    -       BURT    1942 May 15 # Burma Time
+                       5:30    -       IST     1942 Sep
+                       5:30    1:00    IST     1945 Oct 15
+                       5:30    -       IST
+# The following are like Asia/Calcutta:
+#      Andaman Is
+#      Lakshadweep (Laccadive, Minicoy and Amindivi Is)
+#      Nicobar Is
+
+# Indonesia
+#
+# From Gwillim Law (2001-05-28), overriding Shanks & Pottenger:
+# <http://www.sumatera-inc.com/go_to_invest/about_indonesia.asp#standtime>
+# says that Indonesia's time zones changed on 1988-01-01.  Looking at some
+# time zone maps, I think that must refer to Western Borneo (Kalimantan Barat
+# and Kalimantan Tengah) switching from UTC+8 to UTC+7.
+#
+# From Paul Eggert (2007-03-10):
+# Here is another correction to Shanks & Pottenger.
+# JohnTWB writes that Japanese forces did not surrender control in
+# Indonesia until 1945-09-01 00:00 at the earliest (in Jakarta) and
+# other formal surrender ceremonies were September 9, 11, and 13, plus
+# September 12 for the regional surrender to Mountbatten in Singapore.
+# These would be the earliest possible times for a change.
+# Regimes horaires pour le monde entier, by Henri Le Corre, (Editions
+# Traditionnelles, 1987, Paris) says that Java and Madura switched
+# from JST to UTC+07:30 on 1945-09-23, and gives 1944-09-01 for Jayapura
+# (Hollandia).  For now, assume all Indonesian locations other than Jayapura
+# switched on 1945-09-23.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Asia/Jakarta      7:07:12 -       LMT     1867 Aug 10
+# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
+# but this must be a typo.
+                       7:07:12 -       JMT     1923 Dec 31 23:47:12 # Jakarta
+                       7:20    -       JAVT    1932 Nov         # Java Time
+                       7:30    -       WIT     1942 Mar 23
+                       9:00    -       JST     1945 Sep 23
+                       7:30    -       WIT     1948 May
+                       8:00    -       WIT     1950 May
+                       7:30    -       WIT     1964
+                       7:00    -       WIT
+Zone Asia/Pontianak    7:17:20 -       LMT     1908 May
+                       7:17:20 -       PMT     1932 Nov    # Pontianak MT
+                       7:30    -       WIT     1942 Jan 29
+                       9:00    -       JST     1945 Sep 23
+                       7:30    -       WIT     1948 May
+                       8:00    -       WIT     1950 May
+                       7:30    -       WIT     1964
+                       8:00    -       CIT     1988 Jan  1
+                       7:00    -       WIT
+Zone Asia/Makassar     7:57:36 -       LMT     1920
+                       7:57:36 -       MMT     1932 Nov    # Macassar MT
+                       8:00    -       CIT     1942 Feb  9
+                       9:00    -       JST     1945 Sep 23
+                       8:00    -       CIT
+Zone Asia/Jayapura     9:22:48 -       LMT     1932 Nov
+                       9:00    -       EIT     1944 Sep  1
+                       9:30    -       CST     1964
+                       9:00    -       EIT
+
+# Iran
+
+# From Roozbeh Pournader (2003-03-15):
+# This is an English translation of what I just found (originally in Persian).
+# The Gregorian dates in brackets are mine:
+#
+#      Official Newspaper No. 13548-1370/6/25 [1991-09-16]
+#      No. 16760/T233 H                                1370/6/10 [1991-09-01]
+#
+#      The Rule About Change of the Official Time of the Country
+#
+#      The Board of Ministers, in the meeting dated 1370/5/23 [1991-08-14],
+#      based on the suggestion number 2221/D dated 1370/4/22 [1991-07-13]
+#      of the Country's Organization for Official and Employment Affairs,
+#      and referring to the law for equating the working hours of workers
+#      and officers in the whole country dated 1359/4/23 [1980-07-14], and
+#      for synchronizing the official times of the country, agreed that:
+#
+#      The official time of the country will should move forward one hour
+#      at the 24[:00] hours of the first day of Farvardin and should return
+#      to its previous state at the 24[:00] hours of the 30th day of
+#      Shahrivar.
+#
+#      First Deputy to the President - Hassan Habibi
+#
+# From personal experience, that agrees with what has been followed
+# for at least the last 5 years.  Before that, for a few years, the
+# date used was the first Thursday night of Farvardin and the last
+# Thursday night of Shahrivar, but I can't give exact dates....
+# I have also changed the abbreviations to what is considered correct
+# here in Iran, IRST for regular time and IRDT for daylight saving time.
+#
+# From Roozbeh Pournader (2005-04-05):
+# The text of the Iranian law, in effect since 1925, clearly mentions
+# that the true solar year is the measure, and there is no arithmetic
+# leap year calculation involved.  There has never been any serious
+# plan to change that law....
+#
+# From Paul Eggert (2006-03-22):
+# Go with Shanks & Pottenger before Sept. 1991, and with Pournader thereafter.
+# I used Ed Reingold's cal-persia in GNU Emacs 21.2 to check Persian dates,
+# stopping after 2037 when 32-bit time_t's overflow.
+# That cal-persia used Birashk's approximation, which disagrees with the solar
+# calendar predictions for the year 2025, so I corrected those dates by hand.
+#
+# From Oscar van Vlijmen (2005-03-30), writing about future
+# discrepancies between cal-persia and the Iranian calendar:
+# For 2091 solar-longitude-after yields 2091-03-20 08:40:07.7 UT for
+# the vernal equinox and that gets so close to 12:00 some local
+# Iranian time that the definition of the correct location needs to be
+# known exactly, amongst other factors.  2157 is even closer:
+# 2157-03-20 08:37:15.5 UT.  But the Gregorian year 2025 should give
+# no interpretation problem whatsoever.  By the way, another instant
+# in the near future where there will be a discrepancy between
+# arithmetical and astronomical Iranian calendars will be in 2058:
+# vernal equinox on 2058-03-20 09:03:05.9 UT.  The Java version of
+# Reingold's/Dershowitz' calculator gives correctly the Gregorian date
+# 2058-03-21 for 1 Farvardin 1437 (astronomical).
+#
+# From Paul Eggert (2006-03-22):
+# The above comments about post-2006 transitions may become relevant again,
+# if Iran ever resuscitates DST, so we'll leave the comments in.
+#
+# From Steffen Thorsen (2006-03-22):
+# Several of my users have reported that Iran will not observe DST anymore:
+# http://www.irna.ir/en/news/view/line-17/0603193812164948.htm
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Iran    1978    1980    -       Mar     21      0:00    1:00    D
+Rule   Iran    1978    only    -       Oct     21      0:00    0       S
+Rule   Iran    1979    only    -       Sep     19      0:00    0       S
+Rule   Iran    1980    only    -       Sep     23      0:00    0       S
+Rule   Iran    1991    only    -       May      3      0:00    1:00    D
+Rule   Iran    1992    1995    -       Mar     22      0:00    1:00    D
+Rule   Iran    1991    1995    -       Sep     22      0:00    0       S
+Rule   Iran    1996    only    -       Mar     21      0:00    1:00    D
+Rule   Iran    1996    only    -       Sep     21      0:00    0       S
+Rule   Iran    1997    1999    -       Mar     22      0:00    1:00    D
+Rule   Iran    1997    1999    -       Sep     22      0:00    0       S
+Rule   Iran    2000    only    -       Mar     21      0:00    1:00    D
+Rule   Iran    2000    only    -       Sep     21      0:00    0       S
+Rule   Iran    2001    2003    -       Mar     22      0:00    1:00    D
+Rule   Iran    2001    2003    -       Sep     22      0:00    0       S
+Rule   Iran    2004    only    -       Mar     21      0:00    1:00    D
+Rule   Iran    2004    only    -       Sep     21      0:00    0       S
+Rule   Iran    2005    only    -       Mar     22      0:00    1:00    D
+Rule   Iran    2005    only    -       Sep     22      0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Tehran     3:25:44 -       LMT     1916
+                       3:25:44 -       TMT     1946    # Tehran Mean Time
+                       3:30    -       IRST    1977 Nov
+                       4:00    Iran    IR%sT   1979
+                       3:30    Iran    IR%sT
+
+
+# Iraq
+#
+# From Jonathan Lennox (2000-06-12):
+# An article in this week's Economist ("Inside the Saddam-free zone", p. 50 in
+# the U.S. edition) on the Iraqi Kurds contains a paragraph:
+# "The three northern provinces ... switched their clocks this spring and
+# are an hour ahead of Baghdad."
+#
+# But Rives McDow (2000-06-18) quotes a contact in Iraqi-Kurdistan as follows:
+# In the past, some Kurdish nationalists, as a protest to the Iraqi
+# Government, did not adhere to daylight saving time.  They referred
+# to daylight saving as Saddam time.  But, as of today, the time zone
+# in Iraqi-Kurdistan is on standard time with Baghdad, Iraq.
+#
+# So we'll ignore the Economist's claim.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Iraq    1982    only    -       May     1       0:00    1:00    D
+Rule   Iraq    1982    1984    -       Oct     1       0:00    0       S
+Rule   Iraq    1983    only    -       Mar     31      0:00    1:00    D
+Rule   Iraq    1984    1985    -       Apr     1       0:00    1:00    D
+Rule   Iraq    1985    1990    -       Sep     lastSun 1:00s   0       S
+Rule   Iraq    1986    1990    -       Mar     lastSun 1:00s   1:00    D
+# IATA SSIM (1991/1996) says Apr 1 12:01am UTC; guess the `:01' is a typo.
+# Shanks & Pottenger say Iraq did not observe DST 1992/1997; ignore this.
+#
+Rule   Iraq    1991    max     -       Apr      1      3:00s   1:00    D
+Rule   Iraq    1991    max     -       Oct      1      3:00s   0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Baghdad    2:57:40 -       LMT     1890
+                       2:57:36 -       BMT     1918        # Baghdad Mean Time?
+                       3:00    -       AST     1982 May
+                       3:00    Iraq    A%sT
+
+
+###############################################################################
+
+# Israel
+
+# From Ephraim Silverberg (2001-01-11):
+#
+# I coined "IST/IDT" circa 1988.  Until then there were three
+# different abbreviations in use:
+#
+# JST  Jerusalem Standard Time [Danny Braniss, Hebrew University]
+# IZT  Israel Zonal (sic) Time [Prof. Haim Papo, Technion]
+# EEST Eastern Europe Standard Time [used by almost everyone else]
+#
+# Since timezones should be called by country and not capital cities,
+# I ruled out JST.  As Israel is in Asia Minor and not Eastern Europe,
+# EEST was equally unacceptable.  Since "zonal" was not compatible with
+# any other timezone abbreviation, I felt that 'IST' was the way to go
+# and, indeed, it has received almost universal acceptance in timezone
+# settings in Israeli computers.
+#
+# In any case, I am happy to share timezone abbreviations with India,
+# high on my favorite-country list (and not only because my wife's
+# family is from India).
+
+# From Shanks & Pottenger:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    1940    only    -       Jun      1      0:00    1:00    D
+Rule   Zion    1942    1944    -       Nov      1      0:00    0       S
+Rule   Zion    1943    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    1944    only    -       Apr      1      0:00    1:00    D
+Rule   Zion    1945    only    -       Apr     16      0:00    1:00    D
+Rule   Zion    1945    only    -       Nov      1      2:00    0       S
+Rule   Zion    1946    only    -       Apr     16      2:00    1:00    D
+Rule   Zion    1946    only    -       Nov      1      0:00    0       S
+Rule   Zion    1948    only    -       May     23      0:00    2:00    DD
+Rule   Zion    1948    only    -       Sep      1      0:00    1:00    D
+Rule   Zion    1948    1949    -       Nov      1      2:00    0       S
+Rule   Zion    1949    only    -       May      1      0:00    1:00    D
+Rule   Zion    1950    only    -       Apr     16      0:00    1:00    D
+Rule   Zion    1950    only    -       Sep     15      3:00    0       S
+Rule   Zion    1951    only    -       Apr      1      0:00    1:00    D
+Rule   Zion    1951    only    -       Nov     11      3:00    0       S
+Rule   Zion    1952    only    -       Apr     20      2:00    1:00    D
+Rule   Zion    1952    only    -       Oct     19      3:00    0       S
+Rule   Zion    1953    only    -       Apr     12      2:00    1:00    D
+Rule   Zion    1953    only    -       Sep     13      3:00    0       S
+Rule   Zion    1954    only    -       Jun     13      0:00    1:00    D
+Rule   Zion    1954    only    -       Sep     12      0:00    0       S
+Rule   Zion    1955    only    -       Jun     11      2:00    1:00    D
+Rule   Zion    1955    only    -       Sep     11      0:00    0       S
+Rule   Zion    1956    only    -       Jun      3      0:00    1:00    D
+Rule   Zion    1956    only    -       Sep     30      3:00    0       S
+Rule   Zion    1957    only    -       Apr     29      2:00    1:00    D
+Rule   Zion    1957    only    -       Sep     22      0:00    0       S
+Rule   Zion    1974    only    -       Jul      7      0:00    1:00    D
+Rule   Zion    1974    only    -       Oct     13      0:00    0       S
+Rule   Zion    1975    only    -       Apr     20      0:00    1:00    D
+Rule   Zion    1975    only    -       Aug     31      0:00    0       S
+Rule   Zion    1985    only    -       Apr     14      0:00    1:00    D
+Rule   Zion    1985    only    -       Sep     15      0:00    0       S
+Rule   Zion    1986    only    -       May     18      0:00    1:00    D
+Rule   Zion    1986    only    -       Sep      7      0:00    0       S
+Rule   Zion    1987    only    -       Apr     15      0:00    1:00    D
+Rule   Zion    1987    only    -       Sep     13      0:00    0       S
+Rule   Zion    1988    only    -       Apr      9      0:00    1:00    D
+Rule   Zion    1988    only    -       Sep      3      0:00    0       S
+
+# From Ephraim Silverberg
+# (1997-03-04, 1998-03-16, 1998-12-28, 2000-01-17, 2000-07-25, 2004-12-22,
+# and 2005-02-17):
+
+# According to the Office of the Secretary General of the Ministry of
+# Interior, there is NO set rule for Daylight-Savings/Standard time changes.
+# One thing is entrenched in law, however: that there must be at least 150
+# days of daylight savings time annually.  From 1993-1998, the change to
+# daylight savings time was on a Friday morning from midnight IST to
+# 1 a.m IDT; up until 1998, the change back to standard time was on a
+# Saturday night from midnight daylight savings time to 11 p.m. standard
+# time.  1996 is an exception to this rule where the change back to standard
+# time took place on Sunday night instead of Saturday night to avoid
+# conflicts with the Jewish New Year.  In 1999, the change to
+# daylight savings time was still on a Friday morning but from
+# 2 a.m. IST to 3 a.m. IDT; furthermore, the change back to standard time
+# was also on a Friday morning from 2 a.m. IDT to 1 a.m. IST for
+# 1999 only.  In the year 2000, the change to daylight savings time was
+# similar to 1999, but although the change back will be on a Friday, it
+# will take place from 1 a.m. IDT to midnight IST.  Starting in 2001, all
+# changes to/from will take place at 1 a.m. old time, but now there is no
+# rule as to what day of the week it will take place in as the start date
+# (except in 2003) is the night after the Passover Seder (i.e. the eve
+# of the 16th of Nisan in the lunar Hebrew calendar) and the end date
+# (except in 2002) is three nights before Yom Kippur [Day of Atonement]
+# (the eve of the 7th of Tishrei in the lunar Hebrew calendar).
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    1989    only    -       Apr     30      0:00    1:00    D
+Rule   Zion    1989    only    -       Sep      3      0:00    0       S
+Rule   Zion    1990    only    -       Mar     25      0:00    1:00    D
+Rule   Zion    1990    only    -       Aug     26      0:00    0       S
+Rule   Zion    1991    only    -       Mar     24      0:00    1:00    D
+Rule   Zion    1991    only    -       Sep      1      0:00    0       S
+Rule   Zion    1992    only    -       Mar     29      0:00    1:00    D
+Rule   Zion    1992    only    -       Sep      6      0:00    0       S
+Rule   Zion    1993    only    -       Apr      2      0:00    1:00    D
+Rule   Zion    1993    only    -       Sep      5      0:00    0       S
+
+# The dates for 1994-1995 were obtained from Office of the Spokeswoman for the
+# Ministry of Interior, Jerusalem, Israel.  The spokeswoman can be reached by
+# calling the office directly at 972-2-6701447 or 972-2-6701448.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    1994    only    -       Apr      1      0:00    1:00    D
+Rule   Zion    1994    only    -       Aug     28      0:00    0       S
+Rule   Zion    1995    only    -       Mar     31      0:00    1:00    D
+Rule   Zion    1995    only    -       Sep      3      0:00    0       S
+
+# The dates for 1996 were determined by the Minister of Interior of the
+# time, Haim Ramon.  The official announcement regarding 1996-1998
+# (with the dates for 1997-1998 no longer being relevant) can be viewed at:
+#
+#   ftp://ftp.cs.huji.ac.il/pub/tz/announcements/1996-1998.ramon.ps.gz
+#
+# The dates for 1997-1998 were altered by his successor, Rabbi Eli Suissa.
+#
+# The official announcements for the years 1997-1999 can be viewed at:
+#
+#   ftp://ftp.cs.huji.ac.il/pub/tz/announcements/YYYY.ps.gz
+#
+#       where YYYY is the relevant year.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    1996    only    -       Mar     15      0:00    1:00    D
+Rule   Zion    1996    only    -       Sep     16      0:00    0       S
+Rule   Zion    1997    only    -       Mar     21      0:00    1:00    D
+Rule   Zion    1997    only    -       Sep     14      0:00    0       S
+Rule   Zion    1998    only    -       Mar     20      0:00    1:00    D
+Rule   Zion    1998    only    -       Sep      6      0:00    0       S
+Rule   Zion    1999    only    -       Apr      2      2:00    1:00    D
+Rule   Zion    1999    only    -       Sep      3      2:00    0       S
+
+# The Knesset Interior Committee has changed the dates for 2000 for
+# the third time in just over a year and have set new dates for the
+# years 2001-2004 as well.
+#
+# The official announcement for the start date of 2000 can be viewed at:
+#
+#      ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-start.ps.gz
+#
+# The official announcement for the end date of 2000 and the dates
+# for the years 2001-2004 can be viewed at:
+#
+#      ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2000-2004.ps.gz
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    2000    only    -       Apr     14      2:00    1:00    D
+Rule   Zion    2000    only    -       Oct      6      1:00    0       S
+Rule   Zion    2001    only    -       Apr      9      1:00    1:00    D
+Rule   Zion    2001    only    -       Sep     24      1:00    0       S
+Rule   Zion    2002    only    -       Mar     29      1:00    1:00    D
+Rule   Zion    2002    only    -       Oct      7      1:00    0       S
+Rule   Zion    2003    only    -       Mar     28      1:00    1:00    D
+Rule   Zion    2003    only    -       Oct      3      1:00    0       S
+Rule   Zion    2004    only    -       Apr      7      1:00    1:00    D
+Rule   Zion    2004    only    -       Sep     22      1:00    0       S
+
+# The proposed law agreed upon by the Knesset Interior Committee on
+# 2005-02-14 is that, for 2005 and beyond, DST starts at 02:00 the
+# last Friday before April 2nd (i.e. the last Friday in March or April
+# 1st itself if it falls on a Friday) and ends at 02:00 on the Saturday
+# night _before_ the fast of Yom Kippur.
+#
+# Those who can read Hebrew can view the announcement at:
+#
+#      ftp://ftp.cs.huji.ac.il/pub/tz/announcements/2005+beyond.ps
+
+# From Paul Eggert (2005-02-22):
+# I used Ephraim Silverberg's dst-israel.el program
+# <ftp://ftp.cs.huji.ac.il/pub/tz/software/dst-israel.el> (2005-02-20)
+# along with Ed Reingold's cal-hebrew in GNU Emacs 21.4,
+# to generate the transitions in this list.
+# (I replaced "lastFri" with "Fri>=26" by hand.)
+# The spring transitions below all correspond to the following Rule:
+#
+# Rule Zion    2005    max     -       Mar     Fri>=26 2:00    1:00    D
+#
+# but older zic implementations (e.g., Solaris 8) do not support
+# "Fri>=26" to mean April 1 in years like 2005, so for now we list the
+# springtime transitions explicitly.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Zion    2005    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    2005    only    -       Oct      9      2:00    0       S
+Rule   Zion    2006    2010    -       Mar     Fri>=26 2:00    1:00    D
+Rule   Zion    2006    only    -       Oct      1      2:00    0       S
+Rule   Zion    2007    only    -       Sep     16      2:00    0       S
+Rule   Zion    2008    only    -       Oct      5      2:00    0       S
+Rule   Zion    2009    only    -       Sep     27      2:00    0       S
+Rule   Zion    2010    only    -       Sep     12      2:00    0       S
+Rule   Zion    2011    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    2011    only    -       Oct      2      2:00    0       S
+Rule   Zion    2012    2015    -       Mar     Fri>=26 2:00    1:00    D
+Rule   Zion    2012    only    -       Sep     23      2:00    0       S
+Rule   Zion    2013    only    -       Sep      8      2:00    0       S
+Rule   Zion    2014    only    -       Sep     28      2:00    0       S
+Rule   Zion    2015    only    -       Sep     20      2:00    0       S
+Rule   Zion    2016    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    2016    only    -       Oct      9      2:00    0       S
+Rule   Zion    2017    2021    -       Mar     Fri>=26 2:00    1:00    D
+Rule   Zion    2017    only    -       Sep     24      2:00    0       S
+Rule   Zion    2018    only    -       Sep     16      2:00    0       S
+Rule   Zion    2019    only    -       Oct      6      2:00    0       S
+Rule   Zion    2020    only    -       Sep     27      2:00    0       S
+Rule   Zion    2021    only    -       Sep     12      2:00    0       S
+Rule   Zion    2022    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    2022    only    -       Oct      2      2:00    0       S
+Rule   Zion    2023    2032    -       Mar     Fri>=26 2:00    1:00    D
+Rule   Zion    2023    only    -       Sep     24      2:00    0       S
+Rule   Zion    2024    only    -       Oct      6      2:00    0       S
+Rule   Zion    2025    only    -       Sep     28      2:00    0       S
+Rule   Zion    2026    only    -       Sep     20      2:00    0       S
+Rule   Zion    2027    only    -       Oct     10      2:00    0       S
+Rule   Zion    2028    only    -       Sep     24      2:00    0       S
+Rule   Zion    2029    only    -       Sep     16      2:00    0       S
+Rule   Zion    2030    only    -       Oct      6      2:00    0       S
+Rule   Zion    2031    only    -       Sep     21      2:00    0       S
+Rule   Zion    2032    only    -       Sep     12      2:00    0       S
+Rule   Zion    2033    only    -       Apr      1      2:00    1:00    D
+Rule   Zion    2033    only    -       Oct      2      2:00    0       S
+Rule   Zion    2034    2037    -       Mar     Fri>=26 2:00    1:00    D
+Rule   Zion    2034    only    -       Sep     17      2:00    0       S
+Rule   Zion    2035    only    -       Oct      7      2:00    0       S
+Rule   Zion    2036    only    -       Sep     28      2:00    0       S
+Rule   Zion    2037    only    -       Sep     13      2:00    0       S
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Jerusalem  2:20:56 -       LMT     1880
+                       2:20:40 -       JMT     1918    # Jerusalem Mean Time?
+                       2:00    Zion    I%sT
+
+
+
+###############################################################################
+
+# Japan
+
+# `9:00' and `JST' is from Guy Harris.
+
+# From Paul Eggert (1995-03-06):
+# Today's _Asahi Evening News_ (page 4) reports that Japan had
+# daylight saving between 1948 and 1951, but ``the system was discontinued
+# because the public believed it would lead to longer working hours.''
+
+# From Mayumi Negishi in the 2005-08-10 Japan Times
+# <http://www.japantimes.co.jp/cgi-bin/getarticle.pl5?nn20050810f2.htm>:
+# Occupation authorities imposed daylight-saving time on Japan on
+# [1948-05-01]....  But lack of prior debate and the execution of
+# daylight-saving time just three days after the bill was passed generated
+# deep hatred of the concept....  The Diet unceremoniously passed a bill to
+# dump the unpopular system in October 1951, less than a month after the San
+# Francisco Peace Treaty was signed.  (A government poll in 1951 showed 53%
+# of the Japanese wanted to scrap daylight-saving time, as opposed to 30% who
+# wanted to keep it.)
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that DST in Japan during those years was as follows:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Japan   1948    only    -       May     Sun>=1  2:00    1:00    D
+Rule   Japan   1948    1951    -       Sep     Sat>=8  2:00    0       S
+Rule   Japan   1949    only    -       Apr     Sun>=1  2:00    1:00    D
+Rule   Japan   1950    1951    -       May     Sun>=1  2:00    1:00    D
+# but the only locations using it (for birth certificates, presumably, since
+# their audience is astrologers) were US military bases.  For now, assume
+# that for most purposes daylight-saving time was observed; otherwise, what
+# would have been the point of the 1951 poll?
+
+# From Hideyuki Suzuki (1998-11-09):
+# 'Tokyo' usually stands for the former location of Tokyo Astronomical
+# Observatory: E 139 44' 40".90 (9h 18m 58s.727), N 35 39' 16".0.
+# This data is from 'Rika Nenpyou (Chronological Scientific Tables) 1996'
+# edited by National Astronomical Observatory of Japan....
+# JST (Japan Standard Time) has been used since 1888-01-01 00:00 (JST).
+# The law is enacted on 1886-07-07.
+
+# From Hideyuki Suzuki (1998-11-16):
+# The ordinance No. 51 (1886) established "standard time" in Japan,
+# which stands for the time on E 135 degree.
+# In the ordinance No. 167 (1895), "standard time" was renamed to "central
+# standard time".  And the same ordinance also established "western standard
+# time", which stands for the time on E 120 degree....  But "western standard
+# time" was abolished in the ordinance No. 529 (1937).  In the ordinance No.
+# 167, there is no mention regarding for what place western standard time is
+# standard....
+#
+# I wrote "ordinance" above, but I don't know how to translate.
+# In Japanese it's "chokurei", which means ordinance from emperor.
+
+# Shanks & Pottenger claim JST in use since 1896, and that a few
+# places (e.g. Ishigaki) use +0800; go with Suzuki.  Guess that all
+# ordinances took effect on Jan 1.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Tokyo      9:18:59 -       LMT     1887 Dec 31 15:00u
+                       9:00    -       JST     1896
+                       9:00    -       CJT     1938
+                       9:00    Japan   J%sT
+# Since 1938, all Japanese possessions have been like Asia/Tokyo.
+
+# Jordan
+#
+# From <a href="http://star.arabia.com/990701/JO9.html">
+# Jordan Week (1999-07-01) </a> via Steffen Thorsen (1999-09-09):
+# Clocks in Jordan were forwarded one hour on Wednesday at midnight,
+# in accordance with the government's decision to implement summer time
+# all year round.
+#
+# From <a href="http://star.arabia.com/990930/JO9.html">
+# Jordan Week (1999-09-30) </a> via Steffen Thorsen (1999-11-09):
+# Winter time starts today Thursday, 30 September. Clocks will be turned back
+# by one hour.  This is the latest government decision and it's final!
+# The decision was taken because of the increase in working hours in
+# government's departments from six to seven hours.
+#
+# From Paul Eggert (2005-11-22):
+# Starting 2003 transitions are from Steffen Thorsen's web site timeanddate.com.
+#
+# From Steffen Thorsen (2005-11-23):
+# For Jordan I have received multiple independent user reports every year
+# about DST end dates, as the end-rule is different every year.
+#
+# From Steffen Thorsen (2006-10-01), after a heads-up from Hilal Malawi:
+# http://www.petranews.gov.jo/nepras/2006/Sep/05/4000.htm
+# "Jordan will switch to winter time on Friday, October 27".
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Jordan  1973    only    -       Jun     6       0:00    1:00    S
+Rule   Jordan  1973    1975    -       Oct     1       0:00    0       -
+Rule   Jordan  1974    1977    -       May     1       0:00    1:00    S
+Rule   Jordan  1976    only    -       Nov     1       0:00    0       -
+Rule   Jordan  1977    only    -       Oct     1       0:00    0       -
+Rule   Jordan  1978    only    -       Apr     30      0:00    1:00    S
+Rule   Jordan  1978    only    -       Sep     30      0:00    0       -
+Rule   Jordan  1985    only    -       Apr     1       0:00    1:00    S
+Rule   Jordan  1985    only    -       Oct     1       0:00    0       -
+Rule   Jordan  1986    1988    -       Apr     Fri>=1  0:00    1:00    S
+Rule   Jordan  1986    1990    -       Oct     Fri>=1  0:00    0       -
+Rule   Jordan  1989    only    -       May     8       0:00    1:00    S
+Rule   Jordan  1990    only    -       Apr     27      0:00    1:00    S
+Rule   Jordan  1991    only    -       Apr     17      0:00    1:00    S
+Rule   Jordan  1991    only    -       Sep     27      0:00    0       -
+Rule   Jordan  1992    only    -       Apr     10      0:00    1:00    S
+Rule   Jordan  1992    1993    -       Oct     Fri>=1  0:00    0       -
+Rule   Jordan  1993    1998    -       Apr     Fri>=1  0:00    1:00    S
+Rule   Jordan  1994    only    -       Sep     Fri>=15 0:00    0       -
+Rule   Jordan  1995    1998    -       Sep     Fri>=15 0:00s   0       -
+Rule   Jordan  1999    only    -       Jul      1      0:00s   1:00    S
+Rule   Jordan  1999    2002    -       Sep     lastThu 0:00s   0       -
+Rule   Jordan  2000    max     -       Mar     lastThu 0:00s   1:00    S
+Rule   Jordan  2003    only    -       Oct     24      0:00s   0       -
+Rule   Jordan  2004    only    -       Oct     15      0:00s   0       -
+Rule   Jordan  2005    only    -       Sep     lastFri 0:00s   0       -
+Rule   Jordan  2006    max     -       Oct     lastFri 0:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Amman      2:23:44 -       LMT     1931
+                       2:00    Jordan  EE%sT
+
+
+# Kazakhstan
+
+# From Paul Eggert (1996-11-22):
+# Andrew Evtichov (1996-04-13) writes that Kazakhstan
+# stayed in sync with Moscow after 1990, and that Aqtobe (formerly Aktyubinsk)
+# and Aqtau (formerly Shevchenko) are the largest cities in their zones.
+# Guess that Aqtau and Aqtobe diverged in 1995, since that's the first time
+# IATA SSIM mentions a third time zone in Kazakhstan.
+
+# From Paul Eggert (2006-03-22):
+# German Iofis, ELSI, Almaty (2001-10-09) reports that Kazakhstan uses
+# RussiaAsia rules, instead of switching at 00:00 as the IATA has it.
+# Go with Shanks & Pottenger, who have them always using RussiaAsia rules.
+# Also go with the following claims of Shanks & Pottenger:
+#
+# - Kazakhstan did not observe DST in 1991.
+# - Qyzylorda switched from +5:00 to +6:00 on 1992-01-19 02:00.
+# - Oral switched from +5:00 to +4:00 in spring 1989.
+
+# <a href="http://www.kazsociety.org.uk/news/2005/03/30.htm">
+# From Kazakhstan Embassy's News Bulletin #11 (2005-03-21):
+# </a>
+# The Government of Kazakhstan passed a resolution March 15 abolishing
+# daylight saving time citing lack of economic benefits and health
+# complications coupled with a decrease in productivity.
+#
+# From Branislav Kojic (in Astana) via Gwillim Law (2005-06-28):
+# ... what happened was that the former Kazakhstan Eastern time zone
+# was "blended" with the Central zone.  Therefore, Kazakhstan now has
+# two time zones, and difference between them is one hour.  The zone
+# closer to UTC is the former Western zone (probably still called the
+# same), encompassing four provinces in the west: Aqtobe, Atyrau,
+# Mangghystau, and West Kazakhstan.  The other zone encompasses
+# everything else....  I guess that would make Kazakhstan time zones
+# de jure UTC+5 and UTC+6 respectively.
+
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+#
+# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
+Zone   Asia/Almaty     5:07:48 -       LMT     1924 May  2 # or Alma-Ata
+                       5:00    -       ALMT    1930 Jun 21 # Alma-Ata Time
+                       6:00 RussiaAsia ALM%sT  1991
+                       6:00    -       ALMT    1992
+                       6:00 RussiaAsia ALM%sT  2005 Mar 15
+                       6:00    -       ALMT
+# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.)
+Zone   Asia/Qyzylorda  4:21:52 -       LMT     1924 May  2
+                       4:00    -       KIZT    1930 Jun 21 # Kizilorda Time
+                       5:00    -       KIZT    1981 Apr  1
+                       5:00    1:00    KIZST   1981 Oct  1
+                       6:00    -       KIZT    1982 Apr  1
+                       5:00 RussiaAsia KIZ%sT  1991
+                       5:00    -       KIZT    1991 Dec 16 # independence
+                       5:00    -       QYZT    1992 Jan 19 2:00
+                       6:00 RussiaAsia QYZ%sT  2005 Mar 15
+                       6:00    -       QYZT
+# Aqtobe (aka Aktobe, formerly Akt'ubinsk)
+Zone   Asia/Aqtobe     3:48:40 -       LMT     1924 May  2
+                       4:00    -       AKTT    1930 Jun 21 # Aktyubinsk Time
+                       5:00    -       AKTT    1981 Apr  1
+                       5:00    1:00    AKTST   1981 Oct  1
+                       6:00    -       AKTT    1982 Apr  1
+                       5:00 RussiaAsia AKT%sT  1991
+                       5:00    -       AKTT    1991 Dec 16 # independence
+                       5:00 RussiaAsia AQT%sT  2005 Mar 15 # Aqtobe Time
+                       5:00    -       AQTT
+# Mangghystau
+# Aqtau was not founded until 1963, but it represents an inhabited region,
+# so include time stamps before 1963.
+Zone   Asia/Aqtau      3:21:04 -       LMT     1924 May  2
+                       4:00    -       FORT    1930 Jun 21 # Fort Shevchenko T
+                       5:00    -       FORT    1963
+                       5:00    -       SHET    1981 Oct  1 # Shevchenko Time
+                       6:00    -       SHET    1982 Apr  1
+                       5:00 RussiaAsia SHE%sT  1991
+                       5:00    -       SHET    1991 Dec 16 # independence
+                       5:00 RussiaAsia AQT%sT  1995 Mar lastSun 2:00 # Aqtau Time
+                       4:00 RussiaAsia AQT%sT  2005 Mar 15
+                       5:00    -       AQTT
+# West Kazakhstan
+Zone   Asia/Oral       3:25:24 -       LMT     1924 May  2 # or Ural'sk
+                       4:00    -       URAT    1930 Jun 21 # Ural'sk time
+                       5:00    -       URAT    1981 Apr  1
+                       5:00    1:00    URAST   1981 Oct  1
+                       6:00    -       URAT    1982 Apr  1
+                       5:00 RussiaAsia URA%sT  1989 Mar 26 2:00
+                       4:00 RussiaAsia URA%sT  1991
+                       4:00    -       URAT    1991 Dec 16 # independence
+                       4:00 RussiaAsia ORA%sT  2005 Mar 15 # Oral Time
+                       5:00    -       ORAT
+
+# Kyrgyzstan (Kirgizstan)
+# Transitions through 1991 are from Shanks & Pottenger.
+
+# From Paul Eggert (2005-08-15):
+# According to an article dated today in the Kyrgyzstan Development Gateway
+# <http://eng.gateway.kg/cgi-bin/page.pl?id=1&story_name=doc9979.shtml>
+# Kyrgyzstan is canceling the daylight saving time system.  I take the article
+# to mean that they will leave their clocks at 6 hours ahead of UTC.
+# From Malik Abdugaliev (2005-09-21):
+# Our government cancels daylight saving time 6th of August 2005.
+# From 2005-08-12 our GMT-offset is +6, w/o any daylight saving.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Kyrgyz  1992    1996    -       Apr     Sun>=7  0:00s   1:00    S
+Rule   Kyrgyz  1992    1996    -       Sep     lastSun 0:00    0       -
+Rule   Kyrgyz  1997    2005    -       Mar     lastSun 2:30    1:00    S
+Rule   Kyrgyz  1997    2004    -       Oct     lastSun 2:30    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Bishkek    4:58:24 -       LMT     1924 May  2
+                       5:00    -       FRUT    1930 Jun 21 # Frunze Time
+                       6:00 RussiaAsia FRU%sT  1991 Mar 31 2:00s
+                       5:00    1:00    FRUST   1991 Aug 31 2:00 # independence
+                       5:00    Kyrgyz  KG%sT   2005 Aug 12    # Kyrgyzstan Time
+                       6:00    -       KGT
+
+###############################################################################
+
+# Korea (North and South)
+
+# From Annie I. Bang (2006-07-10) in
+# <http://www.koreaherald.co.kr/SITE/data/html_dir/2006/07/10/200607100012.asp>:
+# The Ministry of Commerce, Industry and Energy has already
+# commissioned a research project [to reintroduce DST] and has said
+# the system may begin as early as 2008....  Korea ran a daylight
+# saving program from 1949-61 but stopped it during the 1950-53 Korean War.
+
+# From Shanks & Pottenger:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   ROK     1960    only    -       May     15      0:00    1:00    D
+Rule   ROK     1960    only    -       Sep     13      0:00    0       S
+Rule   ROK     1987    1988    -       May     Sun>=8  0:00    1:00    D
+Rule   ROK     1987    1988    -       Oct     Sun>=8  0:00    0       S
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Seoul      8:27:52 -       LMT     1890
+                       8:30    -       KST     1904 Dec
+                       9:00    -       KST     1928
+                       8:30    -       KST     1932
+                       9:00    -       KST     1954 Mar 21
+                       8:00    ROK     K%sT    1961 Aug 10
+                       8:30    -       KST     1968 Oct
+                       9:00    ROK     K%sT
+Zone   Asia/Pyongyang  8:23:00 -       LMT     1890
+                       8:30    -       KST     1904 Dec
+                       9:00    -       KST     1928
+                       8:30    -       KST     1932
+                       9:00    -       KST     1954 Mar 21
+                       8:00    -       KST     1961 Aug 10
+                       9:00    -       KST
+
+###############################################################################
+
+# Kuwait
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Kuwait     3:11:56 -       LMT     1950
+                       3:00    -       AST
+
+# Laos
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Vientiane  6:50:24 -       LMT     1906 Jun  9 # or Viangchan
+                       7:06:20 -       SMT     1911 Mar 11 0:01 # Saigon MT?
+                       7:00    -       ICT     1912 May
+                       8:00    -       ICT     1931 May
+                       7:00    -       ICT
+
+# Lebanon
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Lebanon 1920    only    -       Mar     28      0:00    1:00    S
+Rule   Lebanon 1920    only    -       Oct     25      0:00    0       -
+Rule   Lebanon 1921    only    -       Apr     3       0:00    1:00    S
+Rule   Lebanon 1921    only    -       Oct     3       0:00    0       -
+Rule   Lebanon 1922    only    -       Mar     26      0:00    1:00    S
+Rule   Lebanon 1922    only    -       Oct     8       0:00    0       -
+Rule   Lebanon 1923    only    -       Apr     22      0:00    1:00    S
+Rule   Lebanon 1923    only    -       Sep     16      0:00    0       -
+Rule   Lebanon 1957    1961    -       May     1       0:00    1:00    S
+Rule   Lebanon 1957    1961    -       Oct     1       0:00    0       -
+Rule   Lebanon 1972    only    -       Jun     22      0:00    1:00    S
+Rule   Lebanon 1972    1977    -       Oct     1       0:00    0       -
+Rule   Lebanon 1973    1977    -       May     1       0:00    1:00    S
+Rule   Lebanon 1978    only    -       Apr     30      0:00    1:00    S
+Rule   Lebanon 1978    only    -       Sep     30      0:00    0       -
+Rule   Lebanon 1984    1987    -       May     1       0:00    1:00    S
+Rule   Lebanon 1984    1991    -       Oct     16      0:00    0       -
+Rule   Lebanon 1988    only    -       Jun     1       0:00    1:00    S
+Rule   Lebanon 1989    only    -       May     10      0:00    1:00    S
+Rule   Lebanon 1990    1992    -       May     1       0:00    1:00    S
+Rule   Lebanon 1992    only    -       Oct     4       0:00    0       -
+Rule   Lebanon 1993    max     -       Mar     lastSun 0:00    1:00    S
+Rule   Lebanon 1993    1998    -       Sep     lastSun 0:00    0       -
+Rule   Lebanon 1999    max     -       Oct     lastSun 0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Beirut     2:22:00 -       LMT     1880
+                       2:00    Lebanon EE%sT
+
+# Malaysia
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   NBorneo 1935    1941    -       Sep     14      0:00    0:20    TS # one-Third Summer
+Rule   NBorneo 1935    1941    -       Dec     14      0:00    0       -
+#
+# peninsular Malaysia
+# The data here are taken from Mok Ly Yng (2003-10-30)
+# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Asia/Kuala_Lumpur 6:46:46 -       LMT     1901 Jan  1
+                       6:55:25 -       SMT     1905 Jun  1 # Singapore M.T.
+                       7:00    -       MALT    1933 Jan  1 # Malaya Time
+                       7:00    0:20    MALST   1936 Jan  1
+                       7:20    -       MALT    1941 Sep  1
+                       7:30    -       MALT    1942 Feb 16
+                       9:00    -       JST     1945 Sep 12
+                       7:30    -       MALT    1982 Jan  1
+                       8:00    -       MYT     # Malaysia Time
+# Sabah & Sarawak
+# From Paul Eggert (2006-03-22):
+# The data here are mostly from Shanks & Pottenger, but the 1942, 1945 and 1982
+# transition dates are from Mok Ly Yng.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Asia/Kuching      7:21:20 -       LMT     1926 Mar
+                       7:30    -       BORT    1933    # Borneo Time
+                       8:00    NBorneo BOR%sT  1942 Feb 16
+                       9:00    -       JST     1945 Sep 12
+                       8:00    -       BORT    1982 Jan  1
+                       8:00    -       MYT
+
+# Maldives
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Maldives 4:54:00 -       LMT     1880    # Male
+                       4:54:00 -       MMT     1960    # Male Mean Time
+                       5:00    -       MVT             # Maldives Time
+
+# Mongolia
+
+# Shanks & Pottenger say that Mongolia has three time zones, but
+# usno1995 and the CIA map Standard Time Zones of the World (2005-03)
+# both say that it has just one.
+
+# From Oscar van Vlijmen (1999-12-11):
+# <a href="http://www.mongoliatourism.gov.mn/general.htm">
+# General Information Mongolia
+# </a> (1999-09)
+# "Time: Mongolia has two time zones. Three westernmost provinces of
+# Bayan-Ulgii, Uvs, and Hovd are one hour earlier than the capital city, and
+# the rest of the country follows the Ulaanbaatar time, which is UTC/GMT plus
+# eight hours."
+
+# From Rives McDow (1999-12-13):
+# Mongolia discontinued the use of daylight savings time in 1999; 1998
+# being the last year it was implemented.  The dates of implementation I am
+# unsure of, but most probably it was similar to Russia, except for the time
+# of implementation may have been different....
+# Some maps in the past have indicated that there was an additional time
+# zone in the eastern part of Mongolia, including the provinces of Dornod,
+# Suhbaatar, and possibly Khentij.
+
+# From Paul Eggert (1999-12-15):
+# Naming and spelling is tricky in Mongolia.
+# We'll use Hovd (also spelled Chovd and Khovd) to represent the west zone;
+# the capital of the Hovd province is sometimes called Hovd, sometimes Dund-Us,
+# and sometimes Jirgalanta (with variant spellings), but the name Hovd
+# is good enough for our purposes.
+
+# From Rives McDow (2001-05-13):
+# In addition to Mongolia starting daylight savings as reported earlier
+# (adopted DST on 2001-04-27 02:00 local time, ending 2001-09-28),
+# there are three time zones.
+#
+# Provinces [at 7:00]: Bayan-ulgii, Uvs, Khovd, Zavkhan, Govi-Altai
+# Provinces [at 8:00]: Khovsgol, Bulgan, Arkhangai, Khentii, Tov,
+#      Bayankhongor, Ovorkhangai, Dundgovi, Dornogovi, Omnogovi
+# Provinces [at 9:00]: Dornod, Sukhbaatar
+#
+# [The province of Selenge is omitted from the above lists.]
+
+# From Ganbold Ts., Ulaanbaatar (2004-04-17):
+# Daylight saving occurs at 02:00 local time last Saturday of March.
+# It will change back to normal at 02:00 local time last Saturday of
+# September.... As I remember this rule was changed in 2001.
+#
+# From Paul Eggert (2004-04-17):
+# For now, assume Rives McDow's informant got confused about Friday vs
+# Saturday, and that his 2001 dates should have 1 added to them.
+
+# From Paul Eggert (2005-07-26):
+# We have wildly conflicting information about Mongolia's time zones.
+# Bill Bonnet (2005-05-19) reports that the US Embassy in Ulaanbaatar says
+# there is only one time zone and that DST is observed, citing Microsoft
+# Windows XP as the source.  Risto Nykanen (2005-05-16) reports that
+# travelmongolia.org says there are two time zones (UTC+7, UTC+8) with no DST.
+# Oscar van Vlijmen (2005-05-20) reports that the Mongolian Embassy in
+# Washington, DC says there are two time zones, with DST observed.
+# He also found
+# <http://ubpost.mongolnews.mn/index.php?subaction=showcomments&id=1111634894&archive=&start_from=&ucat=1&>
+# which also says that there is DST, and which has a comment by "Toddius"
+# (2005-03-31 06:05 +0700) saying "Mongolia actually has 3.5 time zones.
+# The West (OLGII) is +7 GMT, most of the country is ULAT is +8 GMT
+# and some Eastern provinces are +9 GMT but Sukhbaatar Aimag is SUHK +8.5 GMT.
+# The SUKH timezone is new this year, it is one of the few things the
+# parliament passed during the tumultuous winter session."
+# For now, let's ignore this information, until we have more confirmation.
+
+# From Ganbold Ts. (2007-02-26):
+# Parliament of Mongolia has just changed the daylight-saving rule in February.
+# They decided not to adopt daylight-saving time....
+# http://www.mongolnews.mn/index.php?module=unuudur&sec=view&id=15742
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Mongol  1983    1984    -       Apr     1       0:00    1:00    S
+Rule   Mongol  1983    only    -       Oct     1       0:00    0       -
+# Shanks & Pottenger and IATA SSIM say 1990s switches occurred at 00:00,
+# but McDow says the 2001 switches occurred at 02:00.  Also, IATA SSIM
+# (1996-09) says 1996-10-25.  Go with Shanks & Pottenger through 1998.
+#
+# Shanks & Pottenger say that the Sept. 1984 through Sept. 1990 switches
+# in Choibalsan (more precisely, in Dornod and Sukhbaatar) took place
+# at 02:00 standard time, not at 00:00 local time as in the rest of
+# the country.  That would be odd, and possibly is a result of their
+# correction of 02:00 (in the previous edition) not being done correctly
+# in the latest edition; so ignore it for now.
+
+Rule   Mongol  1985    1998    -       Mar     lastSun 0:00    1:00    S
+Rule   Mongol  1984    1998    -       Sep     lastSun 0:00    0       -
+# IATA SSIM (1999-09) says Mongolia no longer observes DST.
+Rule   Mongol  2001    only    -       Apr     lastSat 2:00    1:00    S
+Rule   Mongol  2001    2006    -       Sep     lastSat 2:00    0       -
+Rule   Mongol  2002    2006    -       Mar     lastSat 2:00    1:00    S
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
+Zone   Asia/Hovd       6:06:36 -       LMT     1905 Aug
+                       6:00    -       HOVT    1978    # Hovd Time
+                       7:00    Mongol  HOV%sT
+# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
+Zone   Asia/Ulaanbaatar 7:07:32 -      LMT     1905 Aug
+                       7:00    -       ULAT    1978    # Ulaanbaatar Time
+                       8:00    Mongol  ULA%sT
+# Choibalsan, a.k.a. Bajan Tuemen, Bajan Tumen, Chojbalsan,
+# Choybalsan, Sanbejse, Tchoibalsan
+Zone   Asia/Choibalsan 7:38:00 -       LMT     1905 Aug
+                       7:00    -       ULAT    1978
+                       8:00    -       ULAT    1983 Apr
+                       9:00    Mongol  CHO%sT  # Choibalsan Time
+
+# Nepal
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Katmandu   5:41:16 -       LMT     1920
+                       5:30    -       IST     1986
+                       5:45    -       NPT     # Nepal Time
+
+# Oman
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Muscat     3:54:20 -       LMT     1920
+                       4:00    -       GST
+
+# Pakistan
+
+# From Rives McDow (2002-03-13):
+# I have been advised that Pakistan has decided to adopt dst on a
+# TRIAL basis for one year, starting 00:01 local time on April 7, 2002
+# and ending at 00:01 local time October 6, 2002.  This is what I was
+# told, but I believe that the actual time of change may be 00:00; the
+# 00:01 was to make it clear which day it was on.
+
+# From Paul Eggert (2002-03-15):
+# Jesper Norgaard found this URL:
+# http://www.pak.gov.pk/public/news/app/app06_dec.htm
+# (dated 2001-12-06) which says that the Cabinet adopted a scheme "to
+# advance the clocks by one hour on the night between the first
+# Saturday and Sunday of April and revert to the original position on
+# 15th October each year".  This agrees with McDow's 04-07 at 00:00,
+# but disagrees about the October transition, and makes it sound like
+# it's not on a trial basis.  Also, the "between the first Saturday
+# and Sunday of April" phrase, if taken literally, means that the
+# transition takes place at 00:00 on the first Sunday on or after 04-02.
+
+# From Paul Eggert (2003-02-09):
+# DAWN <http://www.dawn.com/2002/10/06/top13.htm> reported on 2002-10-05
+# that 2002 DST ended that day at midnight.  Go with McDow for now.
+
+# From Steffen Thorsen (2003-03-14):
+# According to http://www.dawn.com/2003/03/07/top15.htm
+# there will be no DST in Pakistan this year:
+#
+# ISLAMABAD, March 6: Information and Media Development Minister Sheikh
+# Rashid Ahmed on Thursday said the cabinet had reversed a previous
+# decision to advance clocks by one hour in summer and put them back by
+# one hour in winter with the aim of saving light hours and energy.
+#
+# The minister told a news conference that the experiment had rather
+# shown 8 per cent higher consumption of electricity.
+
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule Pakistan  2002    only    -       Apr     Sun>=2  0:01    1:00    S
+Rule Pakistan  2002    only    -       Oct     Sun>=2  0:01    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Karachi    4:28:12 -       LMT     1907
+                       5:30    -       IST     1942 Sep
+                       5:30    1:00    IST     1945 Oct 15
+                       5:30    -       IST     1951 Sep 30
+                       5:00    -       KART    1971 Mar 26 # Karachi Time
+                       5:00 Pakistan   PK%sT   # Pakistan Time
+
+# Palestine
+
+# From Amos Shapir (1998-02-15):
+#
+# From 1917 until 1948-05-15, all of Palestine, including the parts now
+# known as the Gaza Strip and the West Bank, was under British rule.
+# Therefore the rules given for Israel for that period, apply there too...
+#
+# The Gaza Strip was under Egyptian rule between 1948-05-15 until 1967-06-05
+# (except a short occupation by Israel from 1956-11 till 1957-03, but no
+# time zone was affected then).  It was never formally annexed to Egypt,
+# though.
+#
+# The rest of Palestine was under Jordanian rule at that time, formally
+# annexed in 1950 as the West Bank (and the word "Trans" was dropped from
+# the country's previous name of "the Hashemite Kingdom of the
+# Trans-Jordan").  So the rules for Jordan for that time apply.  Major
+# towns in that area are Nablus (Shchem), El-Halil (Hebron), Ramallah, and
+# East Jerusalem.
+#
+# Both areas were occupied by Israel in June 1967, but not annexed (except
+# for East Jerusalem).  They were on Israel time since then; there might
+# have been a Military Governor's order about time zones, but I'm not aware
+# of any (such orders may have been issued semi-annually whenever summer
+# time was in effect, but maybe the legal aspect of time was just neglected).
+#
+# The Palestinian Authority was established in 1993, and got hold of most
+# towns in the West Bank and Gaza by 1995.  I know that in order to
+# demonstrate...independence, they have been switching to
+# summer time and back on a different schedule than Israel's, but I don't
+# know when this was started, or what algorithm is used (most likely the
+# Jordanian one).
+#
+# To summarize, the table should probably look something like that:
+#
+# Area \ when | 1918-1947 | 1948-1967 | 1967-1995 | 1996-
+# ------------+-----------+-----------+-----------+-----------
+# Israel      | Zion      | Zion      | Zion      | Zion
+# West bank   | Zion      | Jordan    | Zion      | Jordan
+# Gaza        | Zion      | Egypt     | Zion      | Jordan
+#
+# I guess more info may be available from the PA's web page (if/when they
+# have one).
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that Gaza did not observe DST until 1957, but go
+# with Shapir and assume that it observed DST from 1940 through 1947,
+# and that it used Jordanian rules starting in 1996.
+# We don't yet need a separate entry for the West Bank, since
+# the only differences between it and Gaza that we know about
+# occurred before our cutoff date of 1970.
+# However, as we get more information, we may need to add entries
+# for parts of the West Bank as they transitioned from Israel's rules
+# to Palestine's rules.  If you have more info about this, please
+# send it to tz@elsie.nci.nih.gov for incorporation into future editions.
+
+# From IINS News Service - Israel - 1998-03-23 10:38:07 Israel time,
+# forwarded by Ephraim Silverberg:
+#
+# Despite the fact that Israel changed over to daylight savings time
+# last week, the PLO Authority (PA) has decided not to turn its clocks
+# one-hour forward at this time.  As a sign of independence from Israeli rule,
+# the PA has decided to implement DST in April.
+
+# From Paul Eggert (1999-09-20):
+# Daoud Kuttab writes in
+# <a href="http://www.jpost.com/com/Archive/22.Apr.1999/Opinion/Article-2.html">
+# Holiday havoc
+# </a> (Jerusalem Post, 1999-04-22) that
+# the Palestinian National Authority changed to DST on 1999-04-15.
+# I vaguely recall that they switch back in October (sorry, forgot the source).
+# For now, let's assume that the spring switch was at 24:00,
+# and that they switch at 0:00 on the 3rd Fridays of April and October.
+
+# From Paul Eggert (2005-11-22):
+# Starting 2004 transitions are from Steffen Thorsen's web site timeanddate.com.
+
+# From Steffen Thorsen (2005-11-23):
+# A user from Gaza reported that Gaza made the change early because of
+# the Ramadan.  Next year Ramadan will be even earlier, so I think
+# there is a good chance next year's end date will be around two weeks
+# earlier--the same goes for Jordan.
+
+# From Steffen Thorsen (2006-08-17):
+# I was informed by a user in Bethlehem that in Bethlehem it started the
+# same day as Israel, and after checking with other users in the area, I
+# was informed that they started DST one day after Israel.  I was not
+# able to find any authoritative sources at the time, nor details if
+# Gaza changed as well, but presumed Gaza to follow the same rules as
+# the West Bank.
+
+# From Steffen Thorsen (2006-09-26):
+# according to the Palestine News Network (2006-09-19):
+# http://english.pnn.ps/index.php?option=com_content&task=view&id=596&Itemid=5
+# > The Council of Ministers announced that this year its winter schedule
+# > will begin early, as of midnight Thursday.  It is also time to turn
+# > back the clocks for winter.  Friday will begin an hour late this week.
+# I guess it is likely that next year's date will be moved as well,
+# because of the Ramadan.
+
+# The rules for Egypt are stolen from the `africa' file.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule EgyptAsia 1957    only    -       May     10      0:00    1:00    S
+Rule EgyptAsia 1957    1958    -       Oct      1      0:00    0       -
+Rule EgyptAsia 1958    only    -       May      1      0:00    1:00    S
+Rule EgyptAsia 1959    1967    -       May      1      1:00    1:00    S
+Rule EgyptAsia 1959    1965    -       Sep     30      3:00    0       -
+Rule EgyptAsia 1966    only    -       Oct      1      3:00    0       -
+
+Rule Palestine 1999    2005    -       Apr     Fri>=15 0:00    1:00    S
+Rule Palestine 1999    2003    -       Oct     Fri>=15 0:00    0       -
+Rule Palestine 2004    only    -       Oct      1      1:00    0       -
+Rule Palestine 2005    only    -       Oct      4      2:00    0       -
+Rule Palestine 2006    max     -       Apr      1      0:00    1:00    S
+Rule Palestine 2006    only    -       Sep     22      0:00    0       -
+Rule Palestine 2007    max     -       Oct     Fri>=15 0:00    0       -
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Gaza       2:17:52 -       LMT     1900 Oct
+                       2:00    Zion    EET     1948 May 15
+                       2:00 EgyptAsia  EE%sT   1967 Jun  5
+                       2:00    Zion    I%sT    1996
+                       2:00    Jordan  EE%sT   1999
+                       2:00 Palestine  EE%sT
+
+# Paracel Is
+# no information
+
+# Philippines
+# On 1844-08-16, Narciso Claveria, governor-general of the
+# Philippines, issued a proclamation announcing that 1844-12-30 was to
+# be immediately followed by 1845-01-01.  Robert H. van Gent has a
+# transcript of the decree in <http://www.phys.uu.nl/~vgent/idl/idl.htm>.
+# The rest of the data are from Shanks & Pottenger.
+
+# From Paul Eggert (2006-04-25):
+# Tomorrow's Manila Standard reports that the Philippines Department of
+# Trade and Industry is considering adopting DST this June when the
+# rainy season begins.  See
+# <http://www.manilastandardtoday.com/?page=politics02_april26_2006>.
+# For now, we'll ignore this, since it's not definite and we lack details.
+#
+# From Jesper Norgaard Welen (2006-04-26):
+# ... claims that Philippines had DST last time in 1990:
+# http://story.philippinetimes.com/p.x/ct/9/id/145be20cc6b121c0/cid/3e5bbccc730d258c/
+# [a story dated 2006-04-25 by Cris Larano of Dow Jones Newswires,
+# but no details]
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Phil    1936    only    -       Nov     1       0:00    1:00    S
+Rule   Phil    1937    only    -       Feb     1       0:00    0       -
+Rule   Phil    1954    only    -       Apr     12      0:00    1:00    S
+Rule   Phil    1954    only    -       Jul     1       0:00    0       -
+Rule   Phil    1978    only    -       Mar     22      0:00    1:00    S
+Rule   Phil    1978    only    -       Sep     21      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Manila     -15:56:00 -     LMT     1844 Dec 31
+                       8:04:00 -       LMT     1899 May 11
+                       8:00    Phil    PH%sT   1942 May
+                       9:00    -       JST     1944 Nov
+                       8:00    Phil    PH%sT
+
+# Qatar
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Qatar      3:26:08 -       LMT     1920    # Al Dawhah / Doha
+                       4:00    -       GST     1972 Jun
+                       3:00    -       AST
+
+# Saudi Arabia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Riyadh     3:06:52 -       LMT     1950
+                       3:00    -       AST
+
+# Singapore
+# The data here are taken from Mok Ly Yng (2003-10-30)
+# <http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html>.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Singapore  6:55:25 -       LMT     1901 Jan  1
+                       6:55:25 -       SMT     1905 Jun  1 # Singapore M.T.
+                       7:00    -       MALT    1933 Jan  1 # Malaya Time
+                       7:00    0:20    MALST   1936 Jan  1
+                       7:20    -       MALT    1941 Sep  1
+                       7:30    -       MALT    1942 Feb 16
+                       9:00    -       JST     1945 Sep 12
+                       7:30    -       MALT    1965 Aug  9 # independence
+                       7:30    -       SGT     1982 Jan  1 # Singapore Time
+                       8:00    -       SGT
+
+# Spratly Is
+# no information
+
+# Sri Lanka
+# From Paul Eggert (1996-09-03):
+# "Sri Lanka advances clock by an hour to avoid blackout"
+# (www.virtual-pc.com/lankaweb/news/items/240596-2.html, 1996-05-24,
+# no longer available as of 1999-08-17)
+# reported ``the country's standard time will be put forward by one hour at
+# midnight Friday (1830 GMT) `in the light of the present power crisis'.''
+#
+# From Dharmasiri Senanayake, Sri Lanka Media Minister (1996-10-24), as quoted
+# by Shamindra in
+# <a href="news:54rka5$m5h@mtinsc01-mgt.ops.worldnet.att.net">
+# Daily News - Hot News Section (1996-10-26)
+# </a>:
+# With effect from 12.30 a.m. on 26th October 1996
+# Sri Lanka will be six (06) hours ahead of GMT.
+
+# From Jesper Norgaard Welen (2006-04-14), quoting Sri Lanka News Online
+# <http://news.sinhalaya.com/wmview.php?ArtID=11002> (2006-04-13):
+# 0030 hrs on April 15, 2006 (midnight of April 14, 2006 +30 minutes)
+# at present, become 2400 hours of April 14, 2006 (midnight of April 14, 2006).
+
+# From Peter Apps and Ranga Sirila of Reuters (2006-04-12) in:
+# <http://today.reuters.co.uk/news/newsArticle.aspx?type=scienceNews&storyID=2006-04-12T172228Z_01_COL295762_RTRIDST_0_SCIENCE-SRILANKA-TIME-DC.XML>
+# [The Tamil Tigers] never accepted the original 1996 time change and simply
+# kept their clocks set five and a half hours ahead of Greenwich Mean
+# Time (GMT), in line with neighbor India.
+# From Paul Eggert (2006-04-18):
+# People who live in regions under Tamil control can use TZ='Asia/Calcutta',
+# as that zone has agreed with the Tamil areas since our cutoff date of 1970.
+
+# From K Sethu (2006-04-25):
+# I think the abbreviation LKT originated from the world of computers at
+# the time of or subsequent to the time zone changes by SL Government
+# twice in 1996 and probably SL Government or its standardization
+# agencies never declared an abbreviation as a national standard.
+#
+# I recollect before the recent change the government annoucemments
+# mentioning it as simply changing Sri Lanka Standard Time or Sri Lanka
+# Time and no mention was made about the abbreviation.
+#
+# If we look at Sri Lanka Department of Government's "Official News
+# Website of Sri Lanka" ... http://www.news.lk/ we can see that they
+# use SLT as abbreviation in time stamp at the beginning of each news
+# item....
+#
+# Within Sri Lanka I think LKT is well known among computer users and
+# adminsitrators.  In my opinion SLT may not be a good choice because the
+# nation's largest telcom / internet operator Sri Lanka Telcom is well
+# known by that abbreviation - simply as SLT (there IP domains are
+# slt.lk and sltnet.lk).
+#
+# But if indeed our government has adopted SLT as standard abbreviation
+# (that we have not known so far) then  it is better that it be used for
+# all computers.
+
+# From Paul Eggert (2006-04-25):
+# One possibility is that we wait for a bit for the dust to settle down
+# and then see what people actually say in practice.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Colombo    5:19:24 -       LMT     1880
+                       5:19:32 -       MMT     1906    # Moratuwa Mean Time
+                       5:30    -       IST     1942 Jan  5
+                       5:30    0:30    IHST    1942 Sep
+                       5:30    1:00    IST     1945 Oct 16 2:00
+                       5:30    -       IST     1996 May 25 0:00
+                       6:30    -       LKT     1996 Oct 26 0:30
+                       6:00    -       LKT     2006 Apr 15 0:30
+                       5:30    -       IST
+
+# Syria
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Syria   1920    1923    -       Apr     Sun>=15 2:00    1:00    S
+Rule   Syria   1920    1923    -       Oct     Sun>=1  2:00    0       -
+Rule   Syria   1962    only    -       Apr     29      2:00    1:00    S
+Rule   Syria   1962    only    -       Oct     1       2:00    0       -
+Rule   Syria   1963    1965    -       May     1       2:00    1:00    S
+Rule   Syria   1963    only    -       Sep     30      2:00    0       -
+Rule   Syria   1964    only    -       Oct     1       2:00    0       -
+Rule   Syria   1965    only    -       Sep     30      2:00    0       -
+Rule   Syria   1966    only    -       Apr     24      2:00    1:00    S
+Rule   Syria   1966    1976    -       Oct     1       2:00    0       -
+Rule   Syria   1967    1978    -       May     1       2:00    1:00    S
+Rule   Syria   1977    1978    -       Sep     1       2:00    0       -
+Rule   Syria   1983    1984    -       Apr     9       2:00    1:00    S
+Rule   Syria   1983    1984    -       Oct     1       2:00    0       -
+Rule   Syria   1986    only    -       Feb     16      2:00    1:00    S
+Rule   Syria   1986    only    -       Oct     9       2:00    0       -
+Rule   Syria   1987    only    -       Mar     1       2:00    1:00    S
+Rule   Syria   1987    1988    -       Oct     31      2:00    0       -
+Rule   Syria   1988    only    -       Mar     15      2:00    1:00    S
+Rule   Syria   1989    only    -       Mar     31      2:00    1:00    S
+Rule   Syria   1989    only    -       Oct     1       2:00    0       -
+Rule   Syria   1990    only    -       Apr     1       2:00    1:00    S
+Rule   Syria   1990    only    -       Sep     30      2:00    0       -
+Rule   Syria   1991    only    -       Apr      1      0:00    1:00    S
+Rule   Syria   1991    1992    -       Oct      1      0:00    0       -
+Rule   Syria   1992    only    -       Apr      8      0:00    1:00    S
+Rule   Syria   1993    only    -       Mar     26      0:00    1:00    S
+Rule   Syria   1993    only    -       Sep     25      0:00    0       -
+# IATA SSIM (1998-02) says 1998-04-02;
+# (1998-09) says 1999-03-29 and 1999-09-29; (1999-02) says 1999-04-02,
+# 2000-04-02, and 2001-04-02; (1999-09) says 2000-03-31 and 2001-03-31;
+# (2006) says 2006-03-31 and 2006-09-22;
+# for now ignore all these claims and go with Shanks & Pottenger,
+# except for the 2006-09-22 claim (which seems right for Ramadan).
+Rule   Syria   1994    1996    -       Apr      1      0:00    1:00    S
+Rule   Syria   1994    2005    -       Oct      1      0:00    0       -
+Rule   Syria   1997    1998    -       Mar     lastMon 0:00    1:00    S
+Rule   Syria   1999    max     -       Apr      1      0:00    1:00    S
+# From Stephen Colebourne (2006-09-18):
+# According to IATA data, Syria will change DST on 21st September [21:00 UTC]
+# this year [only]....  This is probably related to Ramadan, like Egypt.
+Rule   Syria   2006    only    -       Sep     22      0:00    0       -
+Rule   Syria   2007    max     -       Oct      1      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Damascus   2:25:12 -       LMT     1920    # Dimashq
+                       2:00    Syria   EE%sT
+
+# Tajikistan
+# From Shanks & Pottenger.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Dushanbe   4:35:12 -       LMT     1924 May  2
+                       5:00    -       DUST    1930 Jun 21 # Dushanbe Time
+                       6:00 RussiaAsia DUS%sT  1991 Mar 31 2:00s
+                       5:00    1:00    DUSST   1991 Sep  9 2:00s
+                       5:00    -       TJT                 # Tajikistan Time
+
+# Thailand
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Bangkok    6:42:04 -       LMT     1880
+                       6:42:04 -       BMT     1920 Apr # Bangkok Mean Time
+                       7:00    -       ICT
+
+# Turkmenistan
+# From Shanks & Pottenger.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Ashgabat   3:53:32 -       LMT     1924 May  2 # or Ashkhabad
+                       4:00    -       ASHT    1930 Jun 21 # Ashkhabad Time
+                       5:00 RussiaAsia ASH%sT  1991 Mar 31 2:00
+                       4:00 RussiaAsia ASH%sT  1991 Oct 27 # independence
+                       4:00 RussiaAsia TM%sT   1992 Jan 19 2:00
+                       5:00    -       TMT
+
+# United Arab Emirates
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Dubai      3:41:12 -       LMT     1920
+                       4:00    -       GST
+
+# Uzbekistan
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Samarkand  4:27:12 -       LMT     1924 May  2
+                       4:00    -       SAMT    1930 Jun 21 # Samarkand Time
+                       5:00    -       SAMT    1981 Apr  1
+                       5:00    1:00    SAMST   1981 Oct  1
+                       6:00    -       TAST    1982 Apr  1 # Tashkent Time
+                       5:00 RussiaAsia SAM%sT  1991 Sep  1 # independence
+                       5:00 RussiaAsia UZ%sT   1992
+                       5:00    -       UZT
+Zone   Asia/Tashkent   4:37:12 -       LMT     1924 May  2
+                       5:00    -       TAST    1930 Jun 21 # Tashkent Time
+                       6:00 RussiaAsia TAS%sT  1991 Mar 31 2:00
+                       5:00 RussiaAsia TAS%sT  1991 Sep  1 # independence
+                       5:00 RussiaAsia UZ%sT   1992
+                       5:00    -       UZT
+
+# Vietnam
+
+# From Paul Eggert (1993-11-18):
+# Saigon's official name is Thanh-Pho Ho Chi Minh, but it's too long.
+# We'll stick with the traditional name for now.
+
+# From Shanks & Pottenger:
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Saigon     7:06:40 -       LMT     1906 Jun  9
+                       7:06:20 -       SMT     1911 Mar 11 0:01 # Saigon MT?
+                       7:00    -       ICT     1912 May
+                       8:00    -       ICT     1931 May
+                       7:00    -       ICT
+
+# Yemen
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Asia/Aden       3:00:48 -       LMT     1950
+                       3:00    -       AST
diff --git a/commands/zoneinfo/australasia b/commands/zoneinfo/australasia
new file mode 100644 (file)
index 0000000..40b0bf6
--- /dev/null
@@ -0,0 +1,1431 @@
+# @(#)australasia      8.6
+# <pre>
+
+# This file also includes Pacific islands.
+
+# Notes are at the end of this file
+
+###############################################################################
+
+# Australia
+
+# Please see the notes below for the controversy about "EST" versus "AEST" etc.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Aus     1917    only    -       Jan      1      0:01    1:00    -
+Rule   Aus     1917    only    -       Mar     25      2:00    0       -
+Rule   Aus     1942    only    -       Jan      1      2:00    1:00    -
+Rule   Aus     1942    only    -       Mar     29      2:00    0       -
+Rule   Aus     1942    only    -       Sep     27      2:00    1:00    -
+Rule   Aus     1943    1944    -       Mar     lastSun 2:00    0       -
+Rule   Aus     1943    only    -       Oct      3      2:00    1:00    -
+# Go with Whitman and the Australian National Standards Commission, which
+# says W Australia didn't use DST in 1943/1944.  Ignore Whitman's claim that
+# 1944/1945 was just like 1943/1944.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Northern Territory
+Zone Australia/Darwin   8:43:20 -      LMT     1895 Feb
+                        9:00   -       CST     1899 May
+                        9:30   Aus     CST
+# Western Australia
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AW      1974    only    -       Oct     lastSun 2:00s   1:00    -
+Rule   AW      1975    only    -       Mar     Sun>=1  2:00s   0       -
+Rule   AW      1983    only    -       Oct     lastSun 2:00s   1:00    -
+Rule   AW      1984    only    -       Mar     Sun>=1  2:00s   0       -
+Rule   AW      1991    only    -       Nov     17      2:00s   1:00    -
+Rule   AW      1992    only    -       Mar     Sun>=1  2:00s   0       -
+Rule   AW      2006    only    -       Dec      3      2:00s   1:00    -
+Rule   AW      2007    2009    -       Mar     lastSun 2:00s   0       -
+Rule   AW      2007    2008    -       Oct     lastSun 2:00s   1:00    -
+Zone Australia/Perth    7:43:24 -      LMT     1895 Dec
+                        8:00   Aus     WST     1943 Jul
+                        8:00   AW      WST
+Zone Australia/Eucla    8:35:28 -      LMT     1895 Dec
+                        8:45   Aus     CWST    1943 Jul
+                        8:45   AW      CWST
+
+# Queensland
+#
+# From Alex Livingston (1996-11-01):
+# I have heard or read more than once that some resort islands off the coast
+# of Queensland chose to keep observing daylight-saving time even after
+# Queensland ceased to.
+#
+# From Paul Eggert (1996-11-22):
+# IATA SSIM (1993-02/1994-09) say that the Holiday Islands (Hayman, Lindeman,
+# Hamilton) observed DST for two years after the rest of Queensland stopped.
+# Hamilton is the largest, but there is also a Hamilton in Victoria,
+# so use Lindeman.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AQ      1971    only    -       Oct     lastSun 2:00s   1:00    -
+Rule   AQ      1972    only    -       Feb     lastSun 2:00s   0       -
+Rule   AQ      1989    1991    -       Oct     lastSun 2:00s   1:00    -
+Rule   AQ      1990    1992    -       Mar     Sun>=1  2:00s   0       -
+Rule   Holiday 1992    1993    -       Oct     lastSun 2:00s   1:00    -
+Rule   Holiday 1993    1994    -       Mar     Sun>=1  2:00s   0       -
+Zone Australia/Brisbane        10:12:08 -      LMT     1895
+                       10:00   Aus     EST     1971
+                       10:00   AQ      EST
+Zone Australia/Lindeman  9:55:56 -     LMT     1895
+                       10:00   Aus     EST     1971
+                       10:00   AQ      EST     1992 Jul
+                       10:00   Holiday EST
+
+# South Australia
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AS      1971    1985    -       Oct     lastSun 2:00s   1:00    -
+Rule   AS      1986    only    -       Oct     19      2:00s   1:00    -
+Rule   AS      1987    max     -       Oct     lastSun 2:00s   1:00    -
+Rule   AS      1972    only    -       Feb     27      2:00s   0       -
+Rule   AS      1973    1985    -       Mar     Sun>=1  2:00s   0       -
+Rule   AS      1986    1989    -       Mar     Sun>=15 2:00s   0       -
+Rule   AS      1990    only    -       Mar     Sun>=18 2:00s   0       -
+Rule   AS      1991    only    -       Mar     Sun>=1  2:00s   0       -
+Rule   AS      1992    only    -       Mar     Sun>=18 2:00s   0       -
+Rule   AS      1993    only    -       Mar     Sun>=1  2:00s   0       -
+Rule   AS      1994    only    -       Mar     Sun>=18 2:00s   0       -
+Rule   AS      1995    2005    -       Mar     lastSun 2:00s   0       -
+Rule   AS      2006    only    -       Apr     Sun>=1  2:00s   0       -
+Rule   AS      2007    max     -       Mar     lastSun 2:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Australia/Adelaide        9:14:20 -       LMT     1895 Feb
+                       9:00    -       CST     1899 May
+                       9:30    Aus     CST     1971
+                       9:30    AS      CST
+
+# Tasmania
+#
+# From Paul Eggert (2005-08-16):
+# <http://www.bom.gov.au/climate/averages/tables/dst_times.shtml>
+# says King Island didn't observe DST from WWII until late 1971.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AT      1967    only    -       Oct     Sun>=1  2:00s   1:00    -
+Rule   AT      1968    only    -       Mar     lastSun 2:00s   0       -
+Rule   AT      1968    1985    -       Oct     lastSun 2:00s   1:00    -
+Rule   AT      1969    1971    -       Mar     Sun>=8  2:00s   0       -
+Rule   AT      1972    only    -       Feb     lastSun 2:00s   0       -
+Rule   AT      1973    1981    -       Mar     Sun>=1  2:00s   0       -
+Rule   AT      1982    1983    -       Mar     lastSun 2:00s   0       -
+Rule   AT      1984    1986    -       Mar     Sun>=1  2:00s   0       -
+Rule   AT      1986    only    -       Oct     Sun>=15 2:00s   1:00    -
+Rule   AT      1987    1990    -       Mar     Sun>=15 2:00s   0       -
+Rule   AT      1987    only    -       Oct     Sun>=22 2:00s   1:00    -
+Rule   AT      1988    1990    -       Oct     lastSun 2:00s   1:00    -
+Rule   AT      1991    1999    -       Oct     Sun>=1  2:00s   1:00    -
+Rule   AT      1991    2005    -       Mar     lastSun 2:00s   0       -
+Rule   AT      2000    only    -       Aug     lastSun 2:00s   1:00    -
+Rule   AT      2001    max     -       Oct     Sun>=1  2:00s   1:00    -
+Rule   AT      2006    only    -       Apr     Sun>=1  2:00s   0       -
+Rule   AT      2007    max     -       Mar     lastSun 2:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Australia/Hobart  9:49:16 -       LMT     1895 Sep
+                       10:00   -       EST     1916 Oct 1 2:00
+                       10:00   1:00    EST     1917 Feb
+                       10:00   Aus     EST     1967
+                       10:00   AT      EST
+Zone Australia/Currie  9:35:28 -       LMT     1895 Sep
+                       10:00   -       EST     1916 Oct 1 2:00
+                       10:00   1:00    EST     1917 Feb
+                       10:00   Aus     EST     1971 Jul
+                       10:00   AT      EST
+
+# Victoria
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AV      1971    1985    -       Oct     lastSun 2:00s   1:00    -
+Rule   AV      1972    only    -       Feb     lastSun 2:00s   0       -
+Rule   AV      1973    1985    -       Mar     Sun>=1  2:00s   0       -
+Rule   AV      1986    1990    -       Mar     Sun>=15 2:00s   0       -
+Rule   AV      1986    1987    -       Oct     Sun>=15 2:00s   1:00    -
+Rule   AV      1988    1999    -       Oct     lastSun 2:00s   1:00    -
+Rule   AV      1991    1994    -       Mar     Sun>=1  2:00s   0       -
+Rule   AV      1995    2005    -       Mar     lastSun 2:00s   0       -
+Rule   AV      2000    only    -       Aug     lastSun 2:00s   1:00    -
+Rule   AV      2001    max     -       Oct     lastSun 2:00s   1:00    -
+Rule   AV      2006    only    -       Apr     Sun>=1  2:00s   0       -
+Rule   AV      2007    max     -       Mar     lastSun 2:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Australia/Melbourne 9:39:52 -     LMT     1895 Feb
+                       10:00   Aus     EST     1971
+                       10:00   AV      EST
+
+# New South Wales
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   AN      1971    1985    -       Oct     lastSun 2:00s   1:00    -
+Rule   AN      1972    only    -       Feb     27      2:00s   0       -
+Rule   AN      1973    1981    -       Mar     Sun>=1  2:00s   0       -
+Rule   AN      1982    only    -       Apr     Sun>=1  2:00s   0       -
+Rule   AN      1983    1985    -       Mar     Sun>=1  2:00s   0       -
+Rule   AN      1986    1989    -       Mar     Sun>=15 2:00s   0       -
+Rule   AN      1986    only    -       Oct     19      2:00s   1:00    -
+Rule   AN      1987    1999    -       Oct     lastSun 2:00s   1:00    -
+Rule   AN      1990    1995    -       Mar     Sun>=1  2:00s   0       -
+Rule   AN      1996    2005    -       Mar     lastSun 2:00s   0       -
+Rule   AN      2000    only    -       Aug     lastSun 2:00s   1:00    -
+Rule   AN      2001    max     -       Oct     lastSun 2:00s   1:00    -
+Rule   AN      2006    only    -       Apr     Sun>=1  2:00s   0       -
+Rule   AN      2007    max     -       Mar     lastSun 2:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Australia/Sydney  10:04:52 -      LMT     1895 Feb
+                       10:00   Aus     EST     1971
+                       10:00   AN      EST
+Zone Australia/Broken_Hill 9:25:48 -   LMT     1895 Feb
+                       10:00   -       EST     1896 Aug 23
+                       9:00    -       CST     1899 May
+                       9:30    Aus     CST     1971
+                       9:30    AN      CST     2000
+                       9:30    AS      CST
+
+# Lord Howe Island
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   LH      1981    1984    -       Oct     lastSun 2:00    1:00    -
+Rule   LH      1982    1985    -       Mar     Sun>=1  2:00    0       -
+Rule   LH      1985    only    -       Oct     lastSun 2:00    0:30    -
+Rule   LH      1986    1989    -       Mar     Sun>=15 2:00    0       -
+Rule   LH      1986    only    -       Oct     19      2:00    0:30    -
+Rule   LH      1987    1999    -       Oct     lastSun 2:00    0:30    -
+Rule   LH      1990    1995    -       Mar     Sun>=1  2:00    0       -
+Rule   LH      1996    2005    -       Mar     lastSun 2:00    0       -
+Rule   LH      2000    only    -       Aug     lastSun 2:00    0:30    -
+Rule   LH      2001    max     -       Oct     lastSun 2:00    0:30    -
+Rule   LH      2006    only    -       Apr     Sun>=1  2:00    0       -
+Rule   LH      2007    max     -       Mar     lastSun 2:00    0       -
+Zone Australia/Lord_Howe 10:36:20 -    LMT     1895 Feb
+                       10:00   -       EST     1981 Mar
+                       10:30   LH      LHST
+
+# Australian miscellany
+#
+# Ashmore Is, Cartier
+# no indigenous inhabitants; only seasonal caretakers
+# no times are set
+#
+# Coral Sea Is
+# no indigenous inhabitants; only meteorologists
+# no times are set
+#
+# Macquarie
+# permanent occupation (scientific station) since 1948;
+# sealing and penguin oil station operated 1888/1917
+# like Australia/Hobart
+
+# Christmas
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Indian/Christmas  7:02:52 -       LMT     1895 Feb
+                       7:00    -       CXT     # Christmas Island Time
+
+# Cook Is
+# From Shanks & Pottenger:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Cook    1978    only    -       Nov     12      0:00    0:30    HS
+Rule   Cook    1979    1991    -       Mar     Sun>=1  0:00    0       -
+Rule   Cook    1979    1990    -       Oct     lastSun 0:00    0:30    HS
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Rarotonga -10:39:04 -     LMT     1901            # Avarua
+                       -10:30  -       CKT     1978 Nov 12     # Cook Is Time
+                       -10:00  Cook    CK%sT
+
+# Cocos
+# These islands were ruled by the Ross family from about 1830 to 1978.
+# We don't know when standard time was introduced; for now, we guess 1900.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Indian/Cocos    6:27:40 -       LMT     1900
+                       6:30    -       CCT     # Cocos Islands Time
+
+# Fiji
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Fiji    1998    1999    -       Nov     Sun>=1  2:00    1:00    S
+Rule   Fiji    1999    2000    -       Feb     lastSun 3:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Fiji    11:53:40 -      LMT     1915 Oct 26     # Suva
+                       12:00   Fiji    FJ%sT   # Fiji Time
+
+# French Polynesia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Gambier  -8:59:48 -     LMT     1912 Oct        # Rikitea
+                        -9:00  -       GAMT    # Gambier Time
+Zone   Pacific/Marquesas -9:18:00 -    LMT     1912 Oct
+                        -9:30  -       MART    # Marquesas Time
+Zone   Pacific/Tahiti   -9:58:16 -     LMT     1912 Oct        # Papeete
+                       -10:00  -       TAHT    # Tahiti Time
+# Clipperton (near North America) is administered from French Polynesia;
+# it is uninhabited.
+
+# Guam
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Guam    -14:21:00 -     LMT     1844 Dec 31
+                        9:39:00 -      LMT     1901            # Agana
+                       10:00   -       GST     2000 Dec 23     # Guam
+                       10:00   -       ChST    # Chamorro Standard Time
+
+# Kiribati
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Tarawa     11:32:04 -     LMT     1901            # Bairiki
+                        12:00  -       GILT             # Gilbert Is Time
+Zone Pacific/Enderbury -11:24:20 -     LMT     1901
+                       -12:00  -       PHOT    1979 Oct # Phoenix Is Time
+                       -11:00  -       PHOT    1995
+                        13:00  -       PHOT
+Zone Pacific/Kiritimati        -10:29:20 -     LMT     1901
+                       -10:40  -       LINT    1979 Oct # Line Is Time
+                       -10:00  -       LINT    1995
+                        14:00  -       LINT
+
+# N Mariana Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Saipan    -14:17:00 -     LMT     1844 Dec 31
+                        9:43:00 -      LMT     1901
+                        9:00   -       MPT     1969 Oct # N Mariana Is Time
+                       10:00   -       MPT     2000 Dec 23
+                       10:00   -       ChST    # Chamorro Standard Time
+
+# Marshall Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Majuro    11:24:48 -      LMT     1901
+                       11:00   -       MHT     1969 Oct # Marshall Islands Time
+                       12:00   -       MHT
+Zone Pacific/Kwajalein 11:09:20 -      LMT     1901
+                       11:00   -       MHT     1969 Oct
+                       -12:00  -       KWAT    1993 Aug 20     # Kwajalein Time
+                       12:00   -       MHT
+
+# Micronesia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Truk      10:07:08 -      LMT     1901
+                       10:00   -       TRUT                    # Truk Time
+Zone Pacific/Ponape    10:32:52 -      LMT     1901            # Kolonia
+                       11:00   -       PONT                    # Ponape Time
+Zone Pacific/Kosrae    10:51:56 -      LMT     1901
+                       11:00   -       KOST    1969 Oct        # Kosrae Time
+                       12:00   -       KOST    1999
+                       11:00   -       KOST
+
+# Nauru
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Nauru   11:07:40 -      LMT     1921 Jan 15     # Uaobe
+                       11:30   -       NRT     1942 Mar 15     # Nauru Time
+                       9:00    -       JST     1944 Aug 15
+                       11:30   -       NRT     1979 May
+                       12:00   -       NRT
+
+# New Caledonia
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   NC      1977    1978    -       Dec     Sun>=1  0:00    1:00    S
+Rule   NC      1978    1979    -       Feb     27      0:00    0       -
+Rule   NC      1996    only    -       Dec      1      2:00s   1:00    S
+# Shanks & Pottenger say the following was at 2:00; go with IATA.
+Rule   NC      1997    only    -       Mar      2      2:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Noumea  11:05:48 -      LMT     1912 Jan 13
+                       11:00   NC      NC%sT
+
+
+###############################################################################
+
+# New Zealand
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   NZ      1927    only    -       Nov      6      2:00    1:00    S
+Rule   NZ      1928    only    -       Mar      4      2:00    0       M
+Rule   NZ      1928    1933    -       Oct     Sun>=8  2:00    0:30    S
+Rule   NZ      1929    1933    -       Mar     Sun>=15 2:00    0       M
+Rule   NZ      1934    1940    -       Apr     lastSun 2:00    0       M
+Rule   NZ      1934    1940    -       Sep     lastSun 2:00    0:30    S
+Rule   NZ      1946    only    -       Jan      1      0:00    0       S
+# Since 1957 Chatham has been 45 minutes ahead of NZ, but there's no
+# convenient notation for this so we must duplicate the Rule lines.
+Rule   NZ      1974    only    -       Nov     Sun>=1  2:00s   1:00    D
+Rule   Chatham 1974    only    -       Nov     Sun>=1  2:45s   1:00    D
+Rule   NZ      1975    only    -       Feb     lastSun 2:00s   0       S
+Rule   Chatham 1975    only    -       Feb     lastSun 2:45s   0       S
+Rule   NZ      1975    1988    -       Oct     lastSun 2:00s   1:00    D
+Rule   Chatham 1975    1988    -       Oct     lastSun 2:45s   1:00    D
+Rule   NZ      1976    1989    -       Mar     Sun>=1  2:00s   0       S
+Rule   Chatham 1976    1989    -       Mar     Sun>=1  2:45s   0       S
+Rule   NZ      1989    only    -       Oct     Sun>=8  2:00s   1:00    D
+Rule   Chatham 1989    only    -       Oct     Sun>=8  2:45s   1:00    D
+Rule   NZ      1990    max     -       Oct     Sun>=1  2:00s   1:00    D
+Rule   Chatham 1990    max     -       Oct     Sun>=1  2:45s   1:00    D
+Rule   NZ      1990    max     -       Mar     Sun>=15 2:00s   0       S
+Rule   Chatham 1990    max     -       Mar     Sun>=15 2:45s   0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Auckland  11:39:04 -      LMT     1868 Nov  2
+                       11:30   NZ      NZ%sT   1946 Jan  1
+                       12:00   NZ      NZ%sT
+Zone Pacific/Chatham   12:13:48 -      LMT     1957 Jan  1
+                       12:45   Chatham CHA%sT
+
+
+# Auckland Is
+# uninhabited; Maori and Moriori, colonial settlers, pastoralists, sealers,
+# and scientific personnel have wintered
+
+# Campbell I
+# minor whaling stations operated 1909/1914
+# scientific station operated 1941/1995;
+# previously whalers, sealers, pastoralists, and scientific personnel wintered
+# was probably like Pacific/Auckland
+
+###############################################################################
+
+
+# Niue
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Niue    -11:19:40 -     LMT     1901            # Alofi
+                       -11:20  -       NUT     1951    # Niue Time
+                       -11:30  -       NUT     1978 Oct 1
+                       -11:00  -       NUT
+
+# Norfolk
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Norfolk 11:11:52 -      LMT     1901            # Kingston
+                       11:12   -       NMT     1951    # Norfolk Mean Time
+                       11:30   -       NFT             # Norfolk Time
+
+# Palau (Belau)
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Palau     8:57:56 -       LMT     1901            # Koror
+                       9:00    -       PWT     # Palau Time
+
+# Papua New Guinea
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Port_Moresby 9:48:40 -    LMT     1880
+                       9:48:32 -       PMMT    1895    # Port Moresby Mean Time
+                       10:00   -       PGT             # Papua New Guinea Time
+
+# Pitcairn
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Pitcairn  -8:40:20 -      LMT     1901            # Adamstown
+                       -8:30   -       PNT     1998 Apr 27 00:00
+                       -8:00   -       PST     # Pitcairn Standard Time
+
+# American Samoa
+Zone Pacific/Pago_Pago  12:37:12 -     LMT     1879 Jul  5
+                       -11:22:48 -     LMT     1911
+                       -11:30  -       SAMT    1950            # Samoa Time
+                       -11:00  -       NST     1967 Apr        # N=Nome
+                       -11:00  -       BST     1983 Nov 30     # B=Bering
+                       -11:00  -       SST                     # S=Samoa
+
+# Samoa
+Zone Pacific/Apia       12:33:04 -     LMT     1879 Jul  5
+                       -11:26:56 -     LMT     1911
+                       -11:30  -       SAMT    1950            # Samoa Time
+                       -11:00  -       WST                     # Samoa Time
+
+# Solomon Is
+# excludes Bougainville, for which see Papua New Guinea
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Guadalcanal 10:39:48 -    LMT     1912 Oct        # Honiara
+                       11:00   -       SBT     # Solomon Is Time
+
+# Tokelau Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Fakaofo -11:24:56 -     LMT     1901
+                       -10:00  -       TKT     # Tokelau Time
+
+# Tonga
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Tonga   1999    only    -       Oct      7      2:00s   1:00    S
+Rule   Tonga   2000    only    -       Mar     19      2:00s   0       -
+Rule   Tonga   2000    2001    -       Nov     Sun>=1  2:00    1:00    S
+Rule   Tonga   2001    2002    -       Jan     lastSun 2:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Tongatapu 12:19:20 -      LMT     1901
+                       12:20   -       TOT     1941 # Tonga Time
+                       13:00   -       TOT     1999
+                       13:00   Tonga   TO%sT
+
+# Tuvalu
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Funafuti  11:56:52 -      LMT     1901
+                       12:00   -       TVT     # Tuvalu Time
+
+
+# US minor outlying islands
+
+# Howland, Baker
+# uninhabited since World War II
+# no information; was probably like Pacific/Pago_Pago
+
+# Jarvis
+# uninhabited since 1958
+# no information; was probably like Pacific/Kiritimati
+
+# Johnston
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Pacific/Johnston  -10:00  -       HST
+
+# Kingman
+# uninhabited
+
+# Midway
+#
+# From Mark Brader (2005-01-23):
+# [Fallacies and Fantasies of Air Transport History, by R.E.G. Davies,
+# published 1994 by Paladwr Press, McLean, VA, USA; ISBN 0-9626483-5-3]
+# reproduced a Pan American Airways timeables from 1936, for their weekly
+# "Orient Express" flights between San Francisco and Manila, and connecting
+# flights to Chicago and the US East Coast.  As it uses some time zone
+# designations that I've never seen before:....
+# Fri. 6:30A Lv. HONOLOLU (Pearl Harbor), H.I.   H.L.T. Ar. 5:30P Sun.
+#  "   3:00P Ar. MIDWAY ISLAND . . . . . . . . . M.L.T. Lv. 6:00A  "
+#
+Zone Pacific/Midway    -11:49:28 -     LMT     1901
+                       -11:00  -       NST     1956 Jun  3
+                       -11:00  1:00    NDT     1956 Sep  2
+                       -11:00  -       NST     1967 Apr        # N=Nome
+                       -11:00  -       BST     1983 Nov 30     # B=Bering
+                       -11:00  -       SST                     # S=Samoa
+
+# Palmyra
+# uninhabited since World War II; was probably like Pacific/Kiritimati
+
+# Wake
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Wake    11:06:28 -      LMT     1901
+                       12:00   -       WAKT    # Wake Time
+
+
+# Vanuatu
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Vanuatu 1983    only    -       Sep     25      0:00    1:00    S
+Rule   Vanuatu 1984    1991    -       Mar     Sun>=23 0:00    0       -
+Rule   Vanuatu 1984    only    -       Oct     23      0:00    1:00    S
+Rule   Vanuatu 1985    1991    -       Sep     Sun>=23 0:00    1:00    S
+Rule   Vanuatu 1992    1993    -       Jan     Sun>=23 0:00    0       -
+Rule   Vanuatu 1992    only    -       Oct     Sun>=23 0:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Efate   11:13:16 -      LMT     1912 Jan 13             # Vila
+                       11:00   Vanuatu VU%sT   # Vanuatu Time
+
+# Wallis and Futuna
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Pacific/Wallis  12:15:20 -      LMT     1901
+                       12:00   -       WFT     # Wallis & Futuna Time
+
+###############################################################################
+
+# NOTES
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Another source occasionally used is Edward W. Whitman, World Time Differences,
+# Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated), which
+# I found in the UCLA library.
+#
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+#              std dst
+#              LMT     Local Mean Time
+#        8:00  WST WST Western Australia
+#        8:45  CWST CWST Central Western Australia*
+#        9:00  JST     Japan
+#        9:30  CST CST Central Australia
+#       10:00  EST EST Eastern Australia
+#       10:00  ChST    Chamorro
+#       10:30  LHST LHST Lord Howe*
+#       11:30  NZMT NZST New Zealand through 1945
+#       12:00  NZST NZDT New Zealand 1946-present
+#       12:45  CHAST CHADT Chatham*
+#      -11:00  SST     Samoa
+#      -10:00  HST     Hawaii
+#      - 8:00  PST     Pitcairn*
+#
+# See the `northamerica' file for Hawaii.
+# See the `southamerica' file for Easter I and the Galapagos Is.
+
+###############################################################################
+
+# Australia
+
+# From Paul Eggert (2005-12-08):
+# <a href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml">
+# Implementation Dates of Daylight Saving Time within Australia
+# </a> summarizes daylight saving issues in Australia.
+
+# From Arthur David Olson (2005-12-12):
+# <a href="http://www.lawlink.nsw.gov.au/lawlink/Corporate/ll_agdinfo.nsf/pages/community_relations_daylight_saving">
+# Lawlink NSW:Daylight Saving in New South Wales
+# </a> covers New South Wales in particular.
+
+# From John Mackin (1991-03-06):
+# We in Australia have _never_ referred to DST as `daylight' time.
+# It is called `summer' time.  Now by a happy coincidence, `summer'
+# and `standard' happen to start with the same letter; hence, the
+# abbreviation does _not_ change...
+# The legislation does not actually define abbreviations, at least
+# in this State, but the abbreviation is just commonly taken to be the
+# initials of the phrase, and the legislation here uniformly uses
+# the phrase `summer time' and does not use the phrase `daylight
+# time'.
+# Announcers on the Commonwealth radio network, the ABC (for Australian
+# Broadcasting Commission), use the phrases `Eastern Standard Time'
+# or `Eastern Summer Time'.  (Note, though, that as I say in the
+# current australasia file, there is really no such thing.)  Announcers
+# on its overseas service, Radio Australia, use the same phrases
+# prefixed by the word `Australian' when referring to local times;
+# time announcements on that service, naturally enough, are made in UTC.
+
+# From Arthur David Olson (1992-03-08):
+# Given the above, what's chosen for year-round use is:
+#      CST     for any place operating at a GMTOFF of 9:30
+#      WST     for any place operating at a GMTOFF of 8:00
+#      EST     for any place operating at a GMTOFF of 10:00
+
+# From Chuck Soper (2006-06-01):
+# I recently found this Australian government web page on time zones:
+# <http://www.australia.gov.au/about-australia-13time>
+# And this government web page lists time zone names and abbreviations:
+# <http://www.bom.gov.au/climate/averages/tables/daysavtm.shtml>
+
+# From Paul Eggert (2001-04-05), summarizing a long discussion about "EST"
+# versus "AEST" etc.:
+#
+# I see the following points of dispute:
+#
+# * How important are unique time zone abbreviations?
+#
+#   Here I tend to agree with the point (most recently made by Chris
+#   Newman) that unique abbreviations should not be essential for proper
+#   operation of software.  We have other instances of ambiguity
+#   (e.g. "IST" denoting both "Israel Standard Time" and "Indian
+#   Standard Time"), and they are not likely to go away any time soon.
+#   In the old days, some software mistakenly relied on unique
+#   abbreviations, but this is becoming less true with time, and I don't
+#   think it's that important to cater to such software these days.
+#
+#   On the other hand, there is another motivation for unambiguous
+#   abbreviations: it cuts down on human confusion.  This is
+#   particularly true for Australia, where "EST" can mean one thing for
+#   time T and a different thing for time T plus 1 second.
+#
+# * Does the relevant legislation indicate which abbreviations should be used?
+#
+#   Here I tend to think that things are a mess, just as they are in
+#   many other countries.  We Americans are currently disagreeing about
+#   which abbreviation to use for the newly legislated Chamorro Standard
+#   Time, for example.
+#
+#   Personally, I would prefer to use common practice; I would like to
+#   refer to legislation only for examples of common practice, or as a
+#   tiebreaker.
+#
+# * Do Australians more often use "Eastern Daylight Time" or "Eastern
+#   Summer Time"?  Do they typically prefix the time zone names with
+#   the word "Australian"?
+#
+#   My own impression is that both "Daylight Time" and "Summer Time" are
+#   common and are widely understood, but that "Summer Time" is more
+#   popular; and that the leading "A" is also common but is omitted more
+#   often than not.  I just used AltaVista advanced search and got the
+#   following count of page hits:
+#
+#     1,103 "Eastern Summer Time" AND domain:au
+#       971 "Australian Eastern Summer Time" AND domain:au
+#       613 "Eastern Daylight Time" AND domain:au
+#       127 "Australian Eastern Daylight Time" AND domain:au
+#
+#   Here "Summer" seems quite a bit more popular than "Daylight",
+#   particularly when we know the time zone is Australian and not US,
+#   say.  The "Australian" prefix seems to be popular for Eastern Summer
+#   Time, but unpopular for Eastern Daylight Time.
+#
+#   For abbreviations, tools like AltaVista are less useful because of
+#   ambiguity.  Many hits are not really time zones, unfortunately, and
+#   many hits denote US time zones and not Australian ones.  But here
+#   are the hit counts anyway:
+#
+#     161,304 "EST" and domain:au
+#      25,156 "EDT" and domain:au
+#      18,263 "AEST" and domain:au
+#      10,416 "AEDT" and domain:au
+#
+#      14,538 "CST" and domain:au
+#       5,728 "CDT" and domain:au
+#         176 "ACST" and domain:au
+#          29 "ACDT" and domain:au
+#
+#       7,539 "WST" and domain:au
+#          68 "AWST" and domain:au
+#
+#   This data suggest that Australians tend to omit the "A" prefix in
+#   practice.  The situation for "ST" versus "DT" is less clear, given
+#   the ambiguities involved.
+#
+# * How do Australians feel about the abbreviations in the tz database?
+#
+#   If you just count Australians on this list, I count 2 in favor and 3
+#   against.  One of the "against" votes (David Keegel) counseled delay,
+#   saying that both AEST/AEDT and EST/EST are widely used and
+#   understood in Australia.
+
+# From Paul Eggert (1995-12-19):
+# Shanks & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Mark Prior writes that his newspaper
+# reports that NSW's fall 1995 change will occur at 2:00,
+# but Robert Elz says it's been 3:00 in Victoria since 1970
+# and perhaps the newspaper's `2:00' is referring to standard time.
+# For now we'll continue to assume 2:00s for changes since 1960.
+
+# From Eric Ulevik (1998-01-05):
+#
+# Here are some URLs to Australian time legislation. These URLs are stable,
+# and should probably be included in the data file. There are probably more
+# relevant entries in this database.
+#
+# NSW (including LHI and Broken Hill):
+# <a href="http://www.austlii.edu.au/au/legis/nsw/consol_act/sta1987137/index.html">
+# Standard Time Act 1987 (updated 1995-04-04)
+# </a>
+# ACT
+# <a href="http://www.austlii.edu.au/au/legis/act/consol_act/stasta1972279/index.html">
+# Standard Time and Summer Time Act 1972
+# </a>
+# SA
+# <a href="http://www.austlii.edu.au/au/legis/sa/consol_act/sta1898137/index.html">
+# Standard Time Act, 1898
+# </a>
+
+# From David Grosz (2005-06-13):
+# It was announced last week that Daylight Saving would be extended by
+# one week next year to allow for the 2006 Commonwealth Games.
+# Daylight Saving is now to end for next year only on the first Sunday
+# in April instead of the last Sunday in March.
+#
+# From Gwillim Law (2005-06-14):
+# I did some Googling and found that all of those states (and territory) plan
+# to extend DST together in 2006.
+# ACT: http://www.cmd.act.gov.au/mediareleases/fileread.cfm?file=86.txt
+# New South Wales: http://www.thecouriermail.news.com.au/common/story_page/0,5936,15538869%255E1702,00.html
+# South Australia: http://www.news.com.au/story/0,10117,15555031-1246,00.html
+# Tasmania: http://www.media.tas.gov.au/release.php?id=14772
+# Victoria: I wasn't able to find anything separate, but the other articles
+# allude to it.
+# But not Queensland
+# http://www.news.com.au/story/0,10117,15564030-1248,00.html.
+
+# Northern Territory
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The NORTHERN TERRITORY..  [ Courtesy N.T. Dept of the Chief Minister ]
+# #                                    [ Nov 1990 ]
+# #    N.T. have never utilised any DST due to sub-tropical/tropical location.
+# ...
+# Zone        Australia/North         9:30    -       CST
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# the Northern Territory do[es] not have daylight saving.
+
+# Western Australia
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# #  The state of WESTERN AUSTRALIA..  [ Courtesy W.A. dept Premier+Cabinet ]
+# #                                            [ Nov 1990 ]
+# #    W.A. suffers from a great deal of public and political opposition to
+# #    DST in principle. A bill is brought before parliament in most years, but
+# #    usually defeated either in the upper house, or in party caucus
+# #    before reaching parliament.
+# ...
+# Zone Australia/West          8:00    AW      %sST
+# ...
+# Rule AW      1974    only    -       Oct     lastSun 2:00    1:00    D
+# Rule AW      1975    only    -       Mar     Sun>=1  3:00    0       W
+# Rule AW      1983    only    -       Oct     lastSun 2:00    1:00    D
+# Rule AW      1984    only    -       Mar     Sun>=1  3:00    0       W
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# Western Australia...do[es] not have daylight saving.
+
+# From John D. Newman via Bradley White (1991-11-02):
+# Western Australia is still on "winter time". Some DH in Sydney
+# rang me at home a few days ago at 6.00am. (He had just arrived at
+# work at 9.00am.)
+# W.A. is switching to Summer Time on Nov 17th just to confuse
+# everybody again.
+
+# From Arthur David Olson (1992-03-08):
+# The 1992 ending date used in the rules is a best guess;
+# it matches what was used in the past.
+
+# <a href="http://www.bom.gov.au/faq/faqgen.htm">
+# The Australian Bureau of Meteorology FAQ
+# </a> (1999-09-27) writes that Giles Meteorological Station uses
+# South Australian time even though it's located in Western Australia.
+
+# Queensland
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# #   The state of QUEENSLAND.. [ Courtesy Qld. Dept Premier Econ&Trade Devel ]
+# #                                            [ Dec 1990 ]
+# ...
+# Zone Australia/Queensland    10:00   AQ      %sST
+# ...
+# Rule AQ      1971    only    -       Oct     lastSun 2:00    1:00    D
+# Rule AQ      1972    only    -       Feb     lastSun 3:00    0       E
+# Rule AQ      1989    max     -       Oct     lastSun 2:00    1:00    D
+# Rule AQ      1990    max     -       Mar     Sun>=1  3:00    0       E
+
+# From Bradley White (1989-12-24):
+# "Australia/Queensland" now observes daylight time (i.e. from
+# October 1989).
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# ...Queensland...[has] agreed to end daylight saving
+# at 3am tomorrow (March 3)...
+
+# From John Mackin (1991-03-06):
+# I can certainly confirm for my part that Daylight Saving in NSW did in fact
+# end on Sunday, 3 March.  I don't know at what hour, though.  (It surprised
+# me.)
+
+# From Bradley White (1992-03-08):
+# ...there was recently a referendum in Queensland which resulted
+# in the experimental daylight saving system being abandoned. So, ...
+# ...
+# Rule QLD     1989    1991    -       Oct     lastSun 2:00    1:00    D
+# Rule QLD     1990    1992    -       Mar     Sun>=1  3:00    0       S
+# ...
+
+# From Arthur David Olson (1992-03-08):
+# The chosen rules the union of the 1971/1972 change and the 1989-1992 changes.
+
+# From Christopher Hunt (2006-11-21), after an advance warning
+# from Jesper Norgaard Welen (2006-11-01):
+# WA are trialing DST for three years.
+# <http://www.parliament.wa.gov.au/parliament/bills.nsf/9A1B183144403DA54825721200088DF1/$File/Bill175-1B.pdf>
+
+# From Rives McDow (2002-04-09):
+# The most interesting region I have found consists of three towns on the
+# southern coast....  South Australia observes daylight saving time; Western
+# Australia does not.  The two states are one and a half hours apart.  The
+# residents decided to forget about this nonsense of changing the clock so
+# much and set the local time 20 hours and 45 minutes from the
+# international date line, or right in the middle of the time of South
+# Australia and Western Australia....
+#
+# From Paul Eggert (2002-04-09):
+# This is confirmed by the section entitled
+# "What's the deal with time zones???" in
+# <http://www.earthsci.unimelb.edu.au/~awatkins/null.html>.
+#
+# From Alex Livingston (2006-12-07):
+# ... it was just on four years ago that I drove along the Eyre Highway,
+# which passes through eastern Western Australia close to the southern
+# coast of the continent.
+#
+# I paid particular attention to the time kept there. There can be no
+# dispute that UTC+08:45 was considered "the time" from the border
+# village just inside the border with South Australia to as far west
+# as just east of Caiguna. There can also be no dispute that Eucla is
+# the largest population centre in this zone....
+#
+# Now that Western Australia is observing daylight saving, the
+# question arose whether this part of the state would follow suit. I
+# just called the border village and confirmed that indeed they have,
+# meaning that they are now observing UTC+09:45.
+#
+# (2006-12-09):
+# I personally doubt that either experimentation with daylight saving
+# in WA or its introduction in SA had anything to do with the genesis
+# of this time zone.  My hunch is that it's been around since well
+# before 1975.  I remember seeing it noted on road maps decades ago.
+
+# From Paul Eggert (2006-12-15):
+# For lack of better info, assume the tradition dates back to the
+# introduction of standard time in 1895.
+
+
+# South Australia, Tasmania, Victoria
+
+# From Arthur David Olson (1992-03-08):
+# The rules from version 7.1 follow.
+# There are lots of differences between these rules and
+# the Shepherd et al. rules.  Since the Shepherd et al. rules
+# and Bradley White's newspaper article are in agreement on
+# current DST ending dates, no worries.
+#
+# Rule Oz      1971    1985    -       Oct     lastSun 2:00    1:00    -
+# Rule Oz      1986    max     -       Oct     Sun>=18 2:00    1:00    -
+# Rule Oz      1972    only    -       Feb     27      3:00    0       -
+# Rule Oz      1973    1986    -       Mar     Sun>=1  3:00    0       -
+# Rule Oz      1987    max     -       Mar     Sun>=15 3:00    0       -
+# Zone Australia/Tasmania      10:00   Oz      EST
+# Zone Australia/South         9:30    Oz      CST
+# Zone Australia/Victoria      10:00   Oz      EST     1985 Oct lastSun 2:00
+#                              10:00   1:00    EST     1986 Mar Sun>=15 3:00
+#                              10:00   Oz      EST
+
+# From Robert Elz (1991-03-06):
+# I believe that the current start date for DST is "lastSun" in Oct...
+# that changed Oct 89.  That is, we're back to the
+# original rule, and that rule currently applies in all the states
+# that have dst, incl Qld.  (Certainly it was true in Vic).
+# The file I'm including says that happened in 1988, I think
+# that's incorrect, but I'm not 100% certain.
+
+# South Australia
+
+# From Bradley White (1991-03-04):
+# A recent excerpt from an Australian newspaper...
+# ...South Australia...[has] agreed to end daylight saving
+# at 3am tomorrow (March 3)...
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# #   The state of SOUTH AUSTRALIA....[ Courtesy of S.A. Dept of Labour ]
+# #                                            [ Nov 1990 ]
+# ...
+# Zone Australia/South         9:30    AS      %sST
+# ...
+# Rule  AS     1971    max     -       Oct     lastSun 2:00    1:00    D
+# Rule  AS     1972    1985    -       Mar     Sun>=1  3:00    0       C
+# Rule  AS     1986    1990    -       Mar     Sun>=15 3:00    0       C
+# Rule  AS     1991    max     -       Mar     Sun>=1  3:00    0       C
+
+# From Bradley White (1992-03-11):
+# Recent correspondence with a friend in Adelaide
+# contained the following exchange:  "Due to the Adelaide Festival,
+# South Australia delays setting back our clocks for a few weeks."
+
+# From Robert Elz (1992-03-13):
+# I heard that apparently (or at least, it appears that)
+# South Aus will have an extra 3 weeks daylight saving every even
+# numbered year (from 1990).  That's when the Adelaide Festival
+# is on...
+
+# From Robert Elz (1992-03-16, 00:57:07 +1000):
+# DST didn't end in Adelaide today (yesterday)....
+# But whether it's "4th Sunday" or "2nd last Sunday" I have no idea whatever...
+# (it's just as likely to be "the Sunday we pick for this year"...).
+
+# From Bradley White (1994-04-11):
+# If Sun, 15 March, 1992 was at +1030 as kre asserts, but yet Sun, 20 March,
+# 1994 was at +0930 as John Connolly's customer seems to assert, then I can
+# only conclude that the actual rule is more complicated....
+
+# From John Warburton (1994-10-07):
+# The new Daylight Savings dates for South Australia ...
+# was gazetted in the Government Hansard on Sep 26 1994....
+# start on last Sunday in October and end in last sunday in March.
+
+# Tasmania
+
+# The rules for 1967 through 1991 were reported by George Shepherd
+# via Simon Woodhead via Robert Elz (1991-03-06):
+# #  The state of TASMANIA.. [Courtesy Tasmanian Dept of Premier + Cabinet ]
+# #                                    [ Nov 1990 ]
+
+# From Bill Hart via Guy Harris (1991-10-10):
+# Oh yes, the new daylight savings rules are uniquely tasmanian, we have
+# 6 weeks a year now when we are out of sync with the rest of Australia
+# (but nothing new about that).
+
+# From Alex Livingston (1999-10-04):
+# I heard on the ABC (Australian Broadcasting Corporation) radio news on the
+# (long) weekend that Tasmania, which usually goes its own way in this regard,
+# has decided to join with most of NSW, the ACT, and most of Victoria
+# (Australia) and start daylight saving on the last Sunday in August in 2000
+# instead of the first Sunday in October.
+
+# Sim Alam (2000-07-03) reported a legal citation for the 2000/2001 rules:
+# http://www.thelaw.tas.gov.au/fragview/42++1968+GS3A@EN+2000070300
+
+# Victoria
+
+# The rules for 1971 through 1991 were reported by George Shepherd
+# via Simon Woodhead via Robert Elz (1991-03-06):
+# #   The state of VICTORIA.. [ Courtesy of Vic. Dept of Premier + Cabinet ]
+# #                                            [ Nov 1990 ]
+
+# From Scott Harrington (2001-08-29):
+# On KQED's "City Arts and Lectures" program last night I heard an
+# interesting story about daylight savings time.  Dr. John Heilbron was
+# discussing his book "The Sun in the Church: Cathedrals as Solar
+# Observatories"[1], and in particular the Shrine of Remembrance[2] located
+# in Melbourne, Australia.
+#
+# Apparently the shrine's main purpose is a beam of sunlight which
+# illuminates a special spot on the floor at the 11th hour of the 11th day
+# of the 11th month (Remembrance Day) every year in memory of Australia's
+# fallen WWI soldiers.  And if you go there on Nov. 11, at 11am local time,
+# you will indeed see the sunbeam illuminate the special spot at the
+# expected time.
+#
+# However, that is only because of some special mirror contraption that had
+# to be employed, since due to daylight savings time, the true solar time of
+# the remembrance moment occurs one hour later (or earlier?).  Perhaps
+# someone with more information on this jury-rig can tell us more.
+#
+# [1] http://www.hup.harvard.edu/catalog/HEISUN.html
+# [2] http://www.shrine.org.au
+
+# New South Wales
+
+# From Arthur David Olson:
+# New South Wales and subjurisdictions have their own ideas of a fun time.
+# Based on law library research by John Mackin,
+# who notes:
+#      In Australia, time is not legislated federally, but rather by the
+#      individual states.  Thus, while such terms as ``Eastern Standard Time''
+#      [I mean, of course, Australian EST, not any other kind] are in common
+#      use, _they have NO REAL MEANING_, as they are not defined in the
+#      legislation.  This is very important to understand.
+#      I have researched New South Wales time only...
+
+# From Eric Ulevik (1999-05-26):
+# DST will start in NSW on the last Sunday of August, rather than the usual
+# October in 2000.  [See: Matthew Moore,
+# <a href="http://www.smh.com.au/news/9905/26/pageone/pageone4.html">
+# Two months more daylight saving
+# </a>
+# Sydney Morning Herald (1999-05-26).]
+
+# From Paul Eggert (1999-09-27):
+# See the following official NSW source:
+# <a href="http://dir.gis.nsw.gov.au/cgi-bin/genobject/document/other/daylightsaving/tigGmZ">
+# Daylight Saving in New South Wales.
+# </a>
+#
+# Narrabri Shire (NSW) council has announced it will ignore the extension of
+# daylight saving next year.  See:
+# <a href="http://abc.net.au/news/regionals/neweng/monthly/regeng-22jul1999-1.htm">
+# Narrabri Council to ignore daylight saving
+# </a> (1999-07-22).  For now, we'll wait to see if this really happens.
+#
+# Victoria will following NSW.  See:
+# <a href="http://abc.net.au/local/news/olympics/1999/07/item19990728112314_1.htm">
+# Vic to extend daylight saving
+# </a> (1999-07-28).
+#
+# However, South Australia rejected the DST request.  See:
+# <a href="http://abc.net.au/news/olympics/1999/07/item19990719151754_1.htm">
+# South Australia rejects Olympics daylight savings request
+# </a> (1999-07-19).
+#
+# Queensland also will not observe DST for the Olympics.  See:
+# <a href="http://abc.net.au/news/olympics/1999/06/item19990601114608_1.htm">
+# Qld says no to daylight savings for Olympics
+# </a> (1999-06-01), which quotes Queensland Premier Peter Beattie as saying
+# ``Look you've got to remember in my family when this came up last time
+# I voted for it, my wife voted against it and she said to me it's all very
+# well for you, you don't have to worry about getting the children out of
+# bed, getting them to school, getting them to sleep at night.
+# I've been through all this argument domestically...my wife rules.''
+#
+# Broken Hill will stick with South Australian time in 2000.  See:
+# <a href="http://abc.net.au/news/regionals/brokenh/monthly/regbrok-21jul1999-6.htm">
+# Broken Hill to be behind the times
+# </a> (1999-07-21).
+
+# IATA SSIM (1998-09) says that the spring 2000 change for Australian
+# Capital Territory, New South Wales except Lord Howe Island and Broken
+# Hill, and Victoria will be August 27, presumably due to the Sydney Olympics.
+
+# From Eric Ulevik, referring to Sydney's Sun Herald (2000-08-13), page 29:
+# The Queensland Premier Peter Beattie is encouraging northern NSW
+# towns to use Queensland time.
+
+# Yancowinna
+
+# From John Mackin (1989-01-04):
+# `Broken Hill' means the County of Yancowinna.
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # YANCOWINNA..  [ Confirmation courtesy of Broken Hill Postmaster ]
+# #                                    [ Dec 1990 ]
+# ...
+# # Yancowinna uses Central Standard Time, despite [its] location on the
+# # New South Wales side of the S.A. border. Most business and social dealings
+# # are with CST zones, therefore CST is legislated by local government
+# # although the switch to Summer Time occurs in line with N.S.W. There have
+# # been years when this did not apply, but the historical data is not
+# # presently available.
+# Zone Australia/Yancowinna    9:30     AY     %sST
+# ...
+# Rule  AY     1971    1985    -       Oct     lastSun 2:00    1:00    D
+# Rule  AY     1972    only    -       Feb     lastSun 3:00    0       C
+# [followed by other Rules]
+
+# Lord Howe Island
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# LHI...               [ Courtesy of Pauline Van Winsen ]
+#                                      [ Dec 1990 ]
+# Lord Howe Island is located off the New South Wales coast, and is half an
+# hour ahead of NSW time.
+
+# From James Lonergan, Secretary, Lord Howe Island Board (2000-01-27):
+# Lord Howe Island summer time in 2000/2001 will commence on the same
+# date as the rest of NSW (i.e. 2000-08-27).  For your information the
+# Lord Howe Island Board (controlling authority for the Island) is
+# seeking the community's views on various options for summer time
+# arrangements on the Island, e.g. advance clocks by 1 full hour
+# instead of only 30 minutes.  Dependant on the wishes of residents
+# the Board may approach the NSW government to change the existing
+# arrangements.  The starting date for summer time on the Island will
+# however always coincide with the rest of NSW.
+
+# From James Lonergan, Secretary, Lord Howe Island Board (2000-10-25):
+# Lord Howe Island advances clocks by 30 minutes during DST in NSW and retards
+# clocks by 30 minutes when DST finishes. Since DST was most recently
+# introduced in NSW, the "changeover" time on the Island has been 02:00 as
+# shown on clocks on LHI. I guess this means that for 30 minutes at the start
+# of DST, LHI is actually 1 hour ahead of the rest of NSW.
+
+# From Paul Eggert (2006-03-22):
+# For Lord Howe dates we use Shanks & Pottenger through 1989, and
+# Lonergan thereafter.  For times we use Lonergan.
+
+###############################################################################
+
+# New Zealand
+
+# From Mark Davies (1990-10-03):
+# the 1989/90 year was a trial of an extended "daylight saving" period.
+# This trial was deemed successful and the extended period adopted for
+# subsequent years (with the addition of a further week at the start).
+# source -- phone call to Ministry of Internal Affairs Head Office.
+
+# From George Shepherd via Simon Woodhead via Robert Elz (1991-03-06):
+# # The Country of New Zealand   (Australia's east island -) Gee they hate that!
+# #                               or is Australia the west island of N.Z.
+# #    [ courtesy of Geoff Tribble.. Auckland N.Z. ]
+# #                            [ Nov 1990 ]
+# ...
+# Rule NZ      1974    1988    -       Oct     lastSun 2:00    1:00    D
+# Rule NZ      1989    max     -       Oct     Sun>=1  2:00    1:00    D
+# Rule NZ      1975    1989    -       Mar     Sun>=1  3:00    0       S
+# Rule NZ      1990    max     -       Mar     lastSun 3:00    0       S
+# ...
+# Zone NZ                      12:00   NZ              NZ%sT   # New Zealand
+# Zone NZ-CHAT                 12:45   -               NZ-CHAT # Chatham Island
+
+# From Arthur David Olson (1992-03-08):
+# The chosen rules use the Davies October 8 values for the start of DST in 1989
+# rather than the October 1 value.
+
+# From Paul Eggert (1995-12-19);
+# Shank & Pottenger report 2:00 for all autumn changes in Australia and NZ.
+# Robert Uzgalis writes that the New Zealand Daylight
+# Savings Time Order in Council dated 1990-06-18 specifies 2:00 standard
+# time on both the first Sunday in October and the third Sunday in March.
+# As with Australia, we'll assume the tradition is 2:00s, not 2:00.
+#
+# From Paul Eggert (2006-03-22):
+# The Department of Internal Affairs (DIA) maintains a brief history,
+# as does Carol Squires; see tz-link.htm for the full references.
+# Use these sources in preference to Shanks & Pottenger.
+#
+# For Chatham, IATA SSIM (1991/1999) gives the NZ rules but with
+# transitions at 2:45 local standard time; this confirms that Chatham
+# is always exactly 45 minutes ahead of Auckland.
+
+###############################################################################
+
+
+# Fiji
+
+# Howse writes (p 153) that in 1879 the British governor of Fiji
+# enacted an ordinance standardizing the islands on Antipodean Time
+# instead of the American system (which was one day behind).
+
+# From Rives McDow (1998-10-08):
+# Fiji will introduce DST effective 0200 local time, 1998-11-01
+# until 0300 local time 1999-02-28.  Each year the DST period will
+# be from the first Sunday in November until the last Sunday in February.
+
+# From Paul Eggert (2000-01-08):
+# IATA SSIM (1999-09) says DST ends 0100 local time.  Go with McDow.
+
+# From the BBC World Service (1998-10-31 11:32 UTC):
+# The Fijiian government says the main reasons for the time change is to
+# improve productivity and reduce road accidents.  But correspondents say it
+# also hopes the move will boost Fiji's ability to compete with other pacific
+# islands in the effort to attract tourists to witness the dawning of the new
+# millenium.
+
+# http://www.fiji.gov.fj/press/2000_09/2000_09_13-05.shtml (2000-09-13)
+# reports that Fiji has discontinued DST.
+
+# Johnston
+
+# Johnston data is from usno1995.
+
+
+# Kiribati
+
+# From Paul Eggert (1996-01-22):
+# Today's _Wall Street Journal_ (page 1) reports that Kiribati
+# ``declared it the same day throught the country as of Jan. 1, 1995''
+# as part of the competition to be first into the 21st century.
+
+
+# Kwajalein
+
+# In comp.risks 14.87 (26 August 1993), Peter Neumann writes:
+# I wonder what happened in Kwajalein, where there was NO Friday,
+# 1993-08-20.  Thursday night at midnight Kwajalein switched sides with
+# respect to the International Date Line, to rejoin its fellow islands,
+# going from 11:59 p.m. Thursday to 12:00 m. Saturday in a blink.
+
+
+# N Mariana Is, Guam
+
+# Howse writes (p 153) ``The Spaniards, on the other hand, reached the
+# Philippines and the Ladrones from America,'' and implies that the Ladrones
+# (now called the Marianas) kept American date for quite some time.
+# For now, we assume the Ladrones switched at the same time as the Philippines;
+# see Asia/Manila.
+
+# US Public Law 106-564 (2000-12-23) made UTC+10 the official standard time,
+# under the name "Chamorro Standard Time".  There is no official abbreviation,
+# but Congressman Robert A. Underwood, author of the bill that became law,
+# wrote in a press release (2000-12-27) that he will seek the use of "ChST".
+
+
+# Micronesia
+
+# Alan Eugene Davis writes (1996-03-16),
+# ``I am certain, having lived there for the past decade, that "Truk"
+# (now properly known as Chuuk) ... is in the time zone GMT+10.''
+#
+# Shanks & Pottenger write that Truk switched from UTC+10 to UTC+11
+# on 1978-10-01; ignore this for now.
+
+# From Paul Eggert (1999-10-29):
+# The Federated States of Micronesia Visitors Board writes in
+# <a href="http://www.fsmgov.org/info/clocks.html">
+# The Federated States of Micronesia - Visitor Information
+# </a> (1999-01-26)
+# that Truk and Yap are UTC+10, and Ponape and Kosrae are UTC+11.
+# We don't know when Kosrae switched from UTC+12; assume January 1 for now.
+
+
+# Midway
+
+# From Charles T O'Connor, KMTH DJ (1956),
+# quoted in the KTMH section of the Radio Heritage Collection
+# <http://radiodx.com/spdxr/KMTH.htm> (2002-12-31):
+# For the past two months we've been on what is known as Daylight
+# Saving Time.  This time has put us on air at 5am in the morning,
+# your time down there in New Zealand.  Starting September 2, 1956
+# we'll again go back to Standard Time.  This'll mean that we'll go to
+# air at 6am your time.
+#
+# From Paul Eggert (2003-03-23):
+# We don't know the date of that quote, but we'll guess they
+# started DST on June 3.  Possibly DST was observed other years
+# in Midway, but we have no record of it.
+
+
+# Pitcairn
+
+# From Rives McDow (1999-11-08):
+# A Proclamation was signed by the Governor of Pitcairn on the 27th March 1998
+# with regard to Pitcairn Standard Time.  The Proclamation is as follows.
+#
+#      The local time for general purposes in the Islands shall be
+#      Co-ordinated Universal time minus 8 hours and shall be known
+#      as Pitcairn Standard Time.
+#
+# ... I have also seen Pitcairn listed as UTC minus 9 hours in several
+# references, and can only assume that this was an error in interpretation
+# somehow in light of this proclamation.
+
+# From Rives McDow (1999-11-09):
+# The Proclamation regarding Pitcairn time came into effect on 27 April 1998
+# ... at midnight.
+
+# From Howie Phelps (1999-11-10), who talked to a Pitcairner via shortwave:
+# Betty Christian told me yesterday that their local time is the same as
+# Pacific Standard Time. They used to be 1/2 hour different from us here in
+# Sacramento but it was changed a couple of years ago.
+
+
+# Samoa
+
+# Howse writes (p 153, citing p 10 of the 1883-11-18 New York Herald)
+# that in 1879 the King of Samoa decided to change
+# ``the date in his kingdom from the Antipodean to the American system,
+# ordaining -- by a masterpiece of diplomatic flattery -- that
+# the Fourth of July should be celebrated twice in that year.''
+
+
+# Tonga
+
+# From Paul Eggert (1996-01-22):
+# Today's _Wall Street Journal_ (p 1) reports that ``Tonga has been plotting
+# to sneak ahead of [New Zealanders] by introducing daylight-saving time.''
+# Since Kiribati has moved the Date Line it's not clear what Tonga will do.
+
+# Don Mundell writes in the 1997-02-20 Tonga Chronicle
+# <a href="http://www.tongatapu.net.to/tonga/homeland/timebegins.htm">
+# How Tonga became `The Land where Time Begins'
+# </a>:
+
+# Until 1941 Tonga maintained a standard time 50 minutes ahead of NZST
+# 12 hours and 20 minutes ahead of GMT.  When New Zealand adjusted its
+# standard time in 1940s, Tonga had the choice of subtracting from its
+# local time to come on the same standard time as New Zealand or of
+# advancing its time to maintain the differential of 13 degrees
+# (approximately 50 minutes ahead of New Zealand time).
+#
+# Because His Majesty King Taufa'ahau Tupou IV, then Crown Prince
+# Tungi, preferred to ensure Tonga's title as the land where time
+# begins, the Legislative Assembly approved the latter change.
+#
+# But some of the older, more conservative members from the outer
+# islands objected. "If at midnight on Dec. 31, we move ahead 40
+# minutes, as your Royal Highness wishes, what becomes of the 40
+# minutes we have lost?"
+#
+# The Crown Prince, presented an unanswerable argument: "Remember that
+# on the World Day of Prayer, you would be the first people on Earth
+# to say your prayers in the morning."
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say the transition was on 1968-10-01; go with Mundell.
+
+# From Eric Ulevik (1999-05-03):
+# Tonga's director of tourism, who is also secretary of the National Millenium
+# Committee, has a plan to get Tonga back in front.
+# He has proposed a one-off move to tropical daylight saving for Tonga from
+# October to March, which has won approval in principle from the Tongan
+# Government.
+
+# From Steffen Thorsen (1999-09-09):
+# * Tonga will introduce DST in November
+#
+# I was given this link by John Letts:
+# <a hef="http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm">
+# http://news.bbc.co.uk/hi/english/world/asia-pacific/newsid_424000/424764.stm
+# </a>
+#
+# I have not been able to find exact dates for the transition in November
+# yet. By reading this article it seems like Fiji will be 14 hours ahead
+# of UTC as well, but as far as I know Fiji will only be 13 hours ahead
+# (12 + 1 hour DST).
+
+# From Arthur David Olson (1999-09-20):
+# According to <a href="http://www.tongaonline.com/news/sept1799.html>
+# http://www.tongaonline.com/news/sept1799.html
+# </a>:
+# "Daylight Savings Time will take effect on Oct. 2 through April 15, 2000
+# and annually thereafter from the first Saturday in October through the
+# third Saturday of April.  Under the system approved by Privy Council on
+# Sept. 10, clocks must be turned ahead one hour on the opening day and
+# set back an hour on the closing date."
+# Alas, no indication of the time of day.
+
+# From Rives McDow (1999-10-06):
+# Tonga started its Daylight Saving on Saturday morning October 2nd at 0200am.
+# Daylight Saving ends on April 16 at 0300am which is Sunday morning.
+
+# From Steffen Thorsen (2000-10-31):
+# Back in March I found a notice on the website http://www.tongaonline.com
+# that Tonga changed back to standard time one month early, on March 19
+# instead of the original reported date April 16. Unfortunately, the article
+# is no longer available on the site, and I did not make a copy of the
+# text, and I have forgotten to report it here.
+# (Original URL was: http://www.tongaonline.com/news/march162000.htm )
+
+# From Rives McDow (2000-12-01):
+# Tonga is observing DST as of 2000-11-04 and will stop on 2001-01-27.
+
+# From Sione Moala-Mafi (2001-09-20) via Rives McDow:
+# At 2:00am on the first Sunday of November, the standard time in the Kingdom
+# shall be moved forward by one hour to 3:00am.  At 2:00am on the last Sunday
+# of January the standard time in the Kingdom shall be moved backward by one
+# hour to 1:00am.
+
+# From Pulu 'Anau (2002-11-05):
+# The law was for 3 years, supposedly to get renewed.  It wasn't.
+
+
+# Wake
+
+# From Vernice Anderson, Personal Secretary to Philip Jessup,
+# US Ambassador At Large (oral history interview, 1971-02-02):
+#
+# Saturday, the 14th [of October, 1950] -- ...  The time was all the
+# more confusing at that point, because we had crossed the
+# International Date Line, thus getting two Sundays.  Furthermore, we
+# discovered that Wake Island had two hours of daylight saving time
+# making calculation of time in Washington difficult if not almost
+# impossible.
+#
+# http://www.trumanlibrary.org/wake/meeting.htm
+
+# From Paul Eggert (2003-03-23):
+# We have no other report of DST in Wake Island, so omit this info for now.
+
+###############################################################################
+
+# The International Date Line
+
+# From Gwillim Law (2000-01-03):
+#
+# The International Date Line is not defined by any international standard,
+# convention, or treaty.  Mapmakers are free to draw it as they please.
+# Reputable mapmakers will simply ensure that every point of land appears on
+# the correct side of the IDL, according to the date legally observed there.
+#
+# When Kiribati adopted a uniform date in 1995, thereby moving the Phoenix and
+# Line Islands to the west side of the IDL (or, if you prefer, moving the IDL
+# to the east side of the Phoenix and Line Islands), I suppose that most
+# mapmakers redrew the IDL following the boundary of Kiribati.  Even that line
+# has a rather arbitrary nature.  The straight-line boundaries between Pacific
+# island nations that are shown on many maps are based on an international
+# convention, but are not legally binding national borders.... The date is
+# governed by the IDL; therefore, even on the high seas, there may be some
+# places as late as fourteen hours later than UTC.  And, since the IDL is not
+# an international standard, there are some places on the high seas where the
+# correct date is ambiguous.
+
+# From Wikipedia <http://en.wikipedia.org/wiki/Time_zone> (2005-08-31):
+# Before 1920, all ships kept local apparent time on the high seas by setting
+# their clocks at night or at the morning sight so that, given the ship's
+# speed and direction, it would be 12 o'clock when the Sun crossed the ship's
+# meridian (12 o'clock = local apparent noon).  During 1917, at the
+# Anglo-French Conference on Time-keeping at Sea, it was recommended that all
+# ships, both military and civilian, should adopt hourly standard time zones
+# on the high seas.  Whenever a ship was within the territorial waters of any
+# nation it would use that nation's standard time.  The captain was permitted
+# to change his ship's clocks at a time of his choice following his ship's
+# entry into another zone time--he often chose midnight.  These zones were
+# adopted by all major fleets between 1920 and 1925 but not by many
+# independent merchant ships until World War II.
+
+# From Paul Eggert, using references suggested by Oscar van Vlijmen
+# (2005-03-20):
+#
+# The American Practical Navigator (2002)
+# <http://pollux.nss.nima.mil/pubs/pubs_j_apn_sections.html?rid=187>
+# talks only about the 180-degree meridian with respect to ships in
+# international waters; it ignores the international date line.
diff --git a/commands/zoneinfo/backward b/commands/zoneinfo/backward
new file mode 100644 (file)
index 0000000..7c92260
--- /dev/null
@@ -0,0 +1,109 @@
+# @(#)backward 8.3
+
+# This file provides links between current names for time zones
+# and their old names.  Many names changed in late 1993.
+
+Link   Africa/Asmara           Africa/Asmera
+Link   Africa/Bamako           Africa/Timbuktu
+Link   America/Argentina/Catamarca     America/Argentina/ComodRivadavia
+Link   America/Adak            America/Atka
+Link   America/Argentina/Buenos_Aires  America/Buenos_Aires
+Link   America/Argentina/Catamarca     America/Catamarca
+Link   America/Atikokan        America/Coral_Harbour
+Link   America/Argentina/Cordoba       America/Cordoba
+Link   America/Tijuana         America/Ensenada
+Link   America/Indiana/Indianapolis    America/Fort_Wayne
+Link   America/Indiana/Indianapolis    America/Indianapolis
+Link   America/Argentina/Jujuy America/Jujuy
+Link   America/Indiana/Knox    America/Knox_IN
+Link   America/Kentucky/Louisville     America/Louisville
+Link   America/Argentina/Mendoza       America/Mendoza
+Link   America/Rio_Branco      America/Porto_Acre
+Link   America/Argentina/Cordoba       America/Rosario
+Link   America/St_Thomas       America/Virgin
+Link   Asia/Ashgabat           Asia/Ashkhabad
+Link   Asia/Chongqing          Asia/Chungking
+Link   Asia/Dhaka              Asia/Dacca
+Link   Asia/Macau              Asia/Macao
+Link   Asia/Jerusalem          Asia/Tel_Aviv
+Link   Asia/Thimphu            Asia/Thimbu
+Link   Asia/Makassar           Asia/Ujung_Pandang
+Link   Asia/Ulaanbaatar        Asia/Ulan_Bator
+Link   Atlantic/Faroe          Atlantic/Faeroe
+Link   Australia/Sydney        Australia/ACT
+Link   Australia/Sydney        Australia/Canberra
+Link   Australia/Lord_Howe     Australia/LHI
+Link   Australia/Sydney        Australia/NSW
+Link   Australia/Darwin        Australia/North
+Link   Australia/Brisbane      Australia/Queensland
+Link   Australia/Adelaide      Australia/South
+Link   Australia/Hobart        Australia/Tasmania
+Link   Australia/Melbourne     Australia/Victoria
+Link   Australia/Perth         Australia/West
+Link   Australia/Broken_Hill   Australia/Yancowinna
+Link   America/Rio_Branco      Brazil/Acre
+Link   America/Noronha         Brazil/DeNoronha
+Link   America/Sao_Paulo       Brazil/East
+Link   America/Manaus          Brazil/West
+Link   America/Halifax         Canada/Atlantic
+Link   America/Winnipeg        Canada/Central
+Link   America/Regina          Canada/East-Saskatchewan
+Link   America/Toronto         Canada/Eastern
+Link   America/Edmonton        Canada/Mountain
+Link   America/St_Johns        Canada/Newfoundland
+Link   America/Vancouver       Canada/Pacific
+Link   America/Regina          Canada/Saskatchewan
+Link   America/Whitehorse      Canada/Yukon
+Link   America/Santiago        Chile/Continental
+Link   Pacific/Easter          Chile/EasterIsland
+Link   America/Havana          Cuba
+Link   Africa/Cairo            Egypt
+Link   Europe/Dublin           Eire
+Link   Europe/London           Europe/Belfast
+Link   Europe/Chisinau         Europe/Tiraspol
+Link   Europe/London           GB
+Link   Europe/London           GB-Eire
+Link   Etc/GMT                 GMT+0
+Link   Etc/GMT                 GMT-0
+Link   Etc/GMT                 GMT0
+Link   Etc/GMT                 Greenwich
+Link   Asia/Hong_Kong          Hongkong
+Link   Atlantic/Reykjavik      Iceland
+Link   Asia/Tehran             Iran
+Link   Asia/Jerusalem          Israel
+Link   America/Jamaica         Jamaica
+Link   Asia/Tokyo              Japan
+Link   Pacific/Kwajalein       Kwajalein
+Link   Africa/Tripoli          Libya
+Link   America/Tijuana         Mexico/BajaNorte
+Link   America/Mazatlan        Mexico/BajaSur
+Link   America/Mexico_City     Mexico/General
+Link   Pacific/Auckland        NZ
+Link   Pacific/Chatham         NZ-CHAT
+Link   America/Denver          Navajo
+Link   Asia/Shanghai           PRC
+Link   Pacific/Pago_Pago       Pacific/Samoa
+Link   Pacific/Truk            Pacific/Yap
+Link   Europe/Warsaw           Poland
+Link   Europe/Lisbon           Portugal
+Link   Asia/Taipei             ROC
+Link   Asia/Seoul              ROK
+Link   Asia/Singapore          Singapore
+Link   Europe/Istanbul         Turkey
+Link   Etc/UCT                 UCT
+Link   America/Anchorage       US/Alaska
+Link   America/Adak            US/Aleutian
+Link   America/Phoenix         US/Arizona
+Link   America/Chicago         US/Central
+Link   America/Indiana/Indianapolis    US/East-Indiana
+Link   America/New_York        US/Eastern
+Link   Pacific/Honolulu        US/Hawaii
+Link   America/Indiana/Knox    US/Indiana-Starke
+Link   America/Detroit         US/Michigan
+Link   America/Denver          US/Mountain
+Link   America/Los_Angeles     US/Pacific
+Link   Pacific/Pago_Pago       US/Samoa
+Link   Etc/UTC                 UTC
+Link   Etc/UTC                 Universal
+Link   Europe/Moscow           W-SU
+Link   Etc/UTC                 Zulu
diff --git a/commands/zoneinfo/checktab.awk b/commands/zoneinfo/checktab.awk
new file mode 100644 (file)
index 0000000..6d53214
--- /dev/null
@@ -0,0 +1,159 @@
+# Check tz tables for consistency.
+
+# @(#)checktab.awk     1.7
+
+# Contributed by Paul Eggert.
+
+BEGIN {
+       FS = "\t"
+
+       if (!iso_table) iso_table = "iso3166.tab"
+       if (!zone_table) zone_table = "zone.tab"
+       if (!want_warnings) want_warnings = -1
+
+       while (getline <iso_table) {
+               iso_NR++
+               if ($0 ~ /^#/) continue
+               if (NF != 2) {
+                       printf "%s:%d: wrong number of columns\n", \
+                               iso_table, iso_NR >>"/dev/stderr"
+                       status = 1
+               }
+               cc = $1
+               name = $2
+               if (cc !~ /^[A-Z][A-Z]$/) {
+                       printf "%s:%d: invalid country code `%s'\n", \
+                               iso_table, iso_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               if (cc <= cc0) {
+                       if (cc == cc0) {
+                               s = "duplicate";
+                       } else {
+                               s = "out of order";
+                       }
+
+                       printf "%s:%d: country code `%s' is %s\n", \
+                               iso_table, iso_NR, cc, s \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               cc0 = cc
+               if (name2cc[name]) {
+                       printf "%s:%d: `%s' and `%s' have the sname name\n", \
+                               iso_table, iso_NR, name2cc[name], cc \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               name2cc[name] = cc
+               cc2name[cc] = name
+               cc2NR[cc] = iso_NR
+       }
+
+       zone_table = "zone.tab"
+       cc0 = ""
+
+       while (getline <zone_table) {
+               zone_NR++
+               if ($0 ~ /^#/) continue
+               if (NF != 3 && NF != 4) {
+                       printf "%s:%d: wrong number of columns\n", \
+                               zone_table, zone_NR >>"/dev/stderr"
+                       status = 1
+               }
+               cc = $1
+               coordinates = $2
+               tz = $3
+               comments = $4
+               if (cc < cc0) {
+                       printf "%s:%d: country code `%s' is out of order\n", \
+                               zone_table, zone_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               cc0 = cc
+               if (tz2cc[tz]) {
+                       printf "%s:%d: %s: duplicate TZ column\n", \
+                               zone_table, zone_NR, tz >>"/dev/stderr"
+                       status = 1
+               }
+               tz2cc[tz] = cc
+               tz2comments[tz] = comments
+               tz2NR[tz] = zone_NR
+               if (cc2name[cc]) {
+                       cc_used[cc]++
+               } else {
+                       printf "%s:%d: %s: unknown country code\n", \
+                               zone_table, zone_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               if (coordinates !~ /^[-+][0-9][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9]$/ \
+                   && coordinates !~ /^[-+][0-9][0-9][0-5][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9][0-5][0-9]$/) {
+                       printf "%s:%d: %s: invalid coordinates\n", \
+                               zone_table, zone_NR, coordinates >>"/dev/stderr"
+                       status = 1
+               }
+       }
+
+       for (tz in tz2cc) {
+               if (cc_used[tz2cc[tz]] == 1) {
+                       if (tz2comments[tz]) {
+                               printf "%s:%d: unnecessary comment `%s'\n", \
+                                       zone_table, tz2NR[tz], tz2comments[tz] \
+                                       >>"/dev/stderr"
+                               status = 1
+                       }
+               } else {
+                       if (!tz2comments[tz]) {
+                               printf "%s:%d: missing comment\n", \
+                                       zone_table, tz2NR[tz] >>"/dev/stderr"
+                               status = 1
+                       }
+               }
+       }
+
+       FS = " "
+}
+
+{
+       tz = ""
+       if ($1 == "Zone") tz = $2
+       if ($1 == "Link") {
+               # Ignore Link commands if source and destination basenames
+               # are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
+               src = $2
+               dst = $3
+               while ((i = index(src, "/"))) src = substr(src, i+1)
+               while ((i = index(dst, "/"))) dst = substr(dst, i+1)
+               if (src != dst) tz = $3
+       }
+       if (tz && tz ~ /\//) {
+               if (!tz2cc[tz]) {
+                       printf "%s: no data for `%s'\n", zone_table, tz \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               zoneSeen[tz] = 1
+       }
+}
+
+END {
+       for (tz in tz2cc) {
+               if (!zoneSeen[tz]) {
+                       printf "%s:%d: no Zone table for `%s'\n", \
+                               zone_table, tz2NR[tz], tz >>"/dev/stderr"
+                       status = 1
+               }
+       }
+
+       if (0 < want_warnings) {
+               for (cc in cc2name) {
+                       if (!cc_used[cc]) {
+                               printf "%s:%d: warning: " \
+                                       "no Zone entries for %s (%s)\n", \
+                                       iso_table, cc2NR[cc], cc, cc2name[cc]
+                       }
+               }
+       }
+
+       exit status
+}
diff --git a/commands/zoneinfo/date.1 b/commands/zoneinfo/date.1
new file mode 100644 (file)
index 0000000..78e3500
--- /dev/null
@@ -0,0 +1,175 @@
+.TH DATE 1
+.SH NAME
+date \- show and set date and time
+.SH SYNOPSIS
+.if n .nh
+.if n .na
+.B date
+[
+.B \-u
+] [
+.B \-c
+] [
+.B \-n
+] [
+.B \-d
+dsttype
+] [
+.B \-t
+minutes-west
+] [
+\fB\-a \fR[\fB+\fR|\fB-]\fIsss\fB.\fIfff\fR
+] [
+.BI + format
+] [
+\fR[\fIyyyy\fR]\fImmddhhmm\fR[\fIyy\fR][\fB.\fIss\fR]
+]
+.SH DESCRIPTION
+.I Date
+without arguments writes the date and time to the standard output in
+the form
+.ce 1
+Wed Mar  8 14:54:40 EST 1989
+.br
+with
+.B EST
+replaced by the local time zone's abbreviation
+(or by the abbreviation for the time zone specified in the
+.B TZ
+environment variable if set).
+The exact output format depends on the locale.
+.PP
+If a command-line argument starts with a plus sign
+.RB (` + '),
+the rest of the argument is used as a
+.I format
+that controls what appears in the output.
+In the format, when a percent sign
+.RB (` % ')
+appears,
+it and the character after it are not output,
+but rather identify part of the date or time
+to be output in a particular way
+(or identify a special character to output):
+.nf
+.sp
+.if t .in +.5i
+.if n .in +2
+.ta \w'%M\0\0'u +\w'Wed Mar  8 14:54:40 EST 1989\0\0'u
+       Sample output   Explanation
+%a     Wed     Abbreviated weekday name*
+%A     Wednesday       Full weekday name*
+%b     Mar     Abbreviated month name*
+%B     March   Full month name*
+%c     Wed Mar 08 14:54:40 1989        Date and time*
+%C     19      Century
+%d     08      Day of month (always two digits)
+%D     03/08/89        Month/day/year (eight characters)
+%e      8      Day of month (leading zero blanked)
+%h     Mar     Abbreviated month name*
+%H     14      24-hour-clock hour (two digits)
+%I     02      12-hour-clock hour (two digits)
+%j     067     Julian day number (three digits)
+%k      2      12-hour-clock hour (leading zero blanked)
+%l     14      24-hour-clock hour (leading zero blanked)
+%m     03      Month number (two digits)
+%M     54      Minute (two digits)
+%n     \\n     newline character
+%p     PM      AM/PM designation
+%r     02:54:40 PM     Hour:minute:second AM/PM designation
+%R     14:54   Hour:minute
+%S     40      Second (two digits)
+%t     \\t     tab character
+%T     14:54:40        Hour:minute:second
+%U     10      Sunday-based week number (two digits)
+%w     3       Day number (one digit, Sunday is 0)
+%W     10      Monday-based week number (two digits)
+%x     03/08/89        Date*
+%X     14:54:40        Time*
+%y     89      Last two digits of year
+%Y     1989    Year in full
+%Z     EST     Time zone abbreviation
+%+     Wed Mar  8 14:54:40 EST 1989    Default output format*
+.if t .in -.5i
+.if n .in -2
+* The exact output depends on the locale.
+.sp
+.fi
+If a character other than one of those shown above appears after
+a percent sign in the format,
+that following character is output.
+All other characters in the format are copied unchanged to the output;
+a newline character is always added at the end of the output.
+.PP
+In Sunday-based week numbering,
+the first Sunday of the year begins week 1;
+days preceding it are part of ``week 0.''
+In Monday-based week numbering,
+the first Monday of the year begins week 1.
+.PP
+To set the date, use a command line argument with one of the following forms:
+.nf
+.if t .in +.5i
+.if n .in +2
+.ta \w'198903081454\0'u
+1454   24-hour-clock hours (first two digits) and minutes
+081454 Month day (first two digits), hours, and minutes
+03081454       Month (two digits, January is 01), month day, hours, minutes
+8903081454     Year, month, month day, hours, minutes
+0308145489     Month, month day, hours, minutes, year
+       (on System V-compatible systems)
+030814541989   Month, month day, hours, minutes, four-digit year
+198903081454   Four-digit year, month, month day, hours, minutes
+.if t .in -.5i
+.if n .in -2
+.fi
+If the century, year, month, or month day is not given,
+the current value is used.
+Any of the above forms may be followed by a period and two digits that give
+the seconds part of the new time; if no seconds are given, zero is assumed.
+.PP
+These options are available:
+.TP
+.BR \-u " or " \-c
+Use UTC when setting and showing the date and time.
+.TP
+.B \-n
+Do not notify other networked systems of the time change.
+.TP
+.BI "\-d " dsttype
+Set the kernel-stored Daylight Saving Time type to the given value.
+(The kernel-stored DST type is used mostly by ``old'' binaries.)
+.TP
+.BI "\-t " minutes-west
+Set the kernel-stored ``minutes west of UTC'' value to the one given on the
+command line.
+(The kernel-stored DST type is used mostly by ``old'' binaries.)
+.TP
+.BI "\-a " adjustment
+Change the time forward (or backward) by the number of seconds
+(and fractions thereof) specified in the
+.I adjustment\^
+argument.
+Either the seconds part or the fractions part of the argument (but not both)
+may be omitted.
+On BSD-based systems,
+the adjustment is made by changing the rate at which time advances;
+on System-V-based systems, the adjustment is made by changing the time.
+.SH FILES
+.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
+/usr/lib/locale/\f2L\fP/LC_TIME        description of time locale \f2L\fP
+.br
+/usr/local/etc/zoneinfo        time zone information directory
+.br
+/usr/local/etc/zoneinfo/localtime      local time zone file
+.br
+/usr/local/etc/zoneinfo/posixrules     used with POSIX-style TZ's
+.br
+/usr/local/etc/zoneinfo/GMT    for UTC leap seconds
+.sp
+If
+.B /usr/local/etc/zoneinfo/GMT
+is absent,
+UTC leap seconds are loaded from
+.BR /usr/local/etc/zoneinfo/posixrules .
+.\" @(#)date.1 7.4
diff --git a/commands/zoneinfo/date.1.txt b/commands/zoneinfo/date.1.txt
new file mode 100644 (file)
index 0000000..7a28c0a
--- /dev/null
@@ -0,0 +1,128 @@
+NAME
+
+     date - show and set date and time
+
+SYNOPSIS
+     date [ -u ] [ -c ] [ -n ] [ -d dsttype ] [ -t minutes-west ]
+     [ -a [+|-]sss.fff ] [ +format ] [ [yyyy]mmddhhmm[yy][.ss] ]
+
+DESCRIPTION
+     Date without arguments writes the date and time to the
+     standard output in the form
+                     Wed Mar  8 14:54:40 EST 1989
+     with EST replaced by the local time zone's abbreviation (or
+     by the abbreviation for the time zone specified in the TZ
+     environment variable if set).  The exact output format
+     depends on the locale.
+
+     If a command-line argument starts with a plus sign (`+'),
+     the rest of the argument is used as a format that controls
+     what appears in the output.  In the format, when a percent
+     sign (`%') appears, it and the character after it are not
+     output, but rather identify part of the date or time to be
+     output in a particular way (or identify a special character
+     to output):
+
+           Sample output                 Explanation
+       %a  Wed                           Abbreviated weekday name*
+       %A  Wednesday                     Full weekday name*
+       %b  Mar                           Abbreviated month name*
+       %B  March                         Full month name*
+       %c  Wed Mar 08 14:54:40 1989      Date and time*
+       %C  19                            Century
+       %d  08                            Day of month (always two digits)
+       %D  03/08/89                      Month/day/year (eight characters)
+       %e   8                            Day of month (leading zero blanked)
+       %h  Mar                           Abbreviated month name*
+       %H  14                            24-hour-clock hour (two digits)
+       %I  02                            12-hour-clock hour (two digits)
+       %j  067                           Julian day number (three digits)
+       %k   2                            12-hour-clock hour (leading zero blanked)
+       %l  14                            24-hour-clock hour (leading zero blanked)
+       %m  03                            Month number (two digits)
+       %M  54                            Minute (two digits)
+       %n  \n                            newline character
+       %p  PM                            AM/PM designation
+       %r  02:54:40 PM                   Hour:minute:second AM/PM designation
+       %R  14:54                         Hour:minute
+       %S  40                            Second (two digits)
+       %t  \t                            tab character
+       %T  14:54:40                      Hour:minute:second
+       %U  10                            Sunday-based week number (two digits)
+       %w  3                             Day number (one digit, Sunday is 0)
+       %W  10                            Monday-based week number (two digits)
+       %x  03/08/89                      Date*
+       %X  14:54:40                      Time*
+       %y  89                            Last two digits of year
+       %Y  1989                          Year in full
+       %Z  EST                           Time zone abbreviation
+       %+  Wed Mar  8 14:54:40 EST 1989  Default output format*
+     * The exact output depends on the locale.
+
+     If a character other than one of those shown above appears
+     after a percent sign in the format, that following character
+     is output.  All other characters in the format are copied
+     unchanged to the output; a newline character is always added
+     at the end of the output.
+
+     In Sunday-based week numbering, the first Sunday of the year
+     begins week 1; days preceding it are part of ``week 0.''  In
+     Monday-based week numbering, the first Monday of the year
+     begins week 1.
+
+     To set the date, use a command line argument with one of the
+     following forms:
+       1454         24-hour-clock hours (first two digits) and minutes
+       081454       Month day (first two digits), hours, and minutes
+       03081454     Month (two digits, January is 01), month day, hours, minutes
+       8903081454   Year, month, month day, hours, minutes
+       0308145489   Month, month day, hours, minutes, year
+                    (on System V-compatible systems)
+       030814541989 Month, month day, hours, minutes, four-digit year
+       198903081454 Four-digit year, month, month day, hours, minutes
+     If the century, year, month, or month day is not given, the
+     current value is used.  Any of the above forms may be
+     followed by a period and two digits that give the seconds
+     part of the new time; if no seconds are given, zero is
+     assumed.
+
+     These options are available:
+
+     -u or -c
+          Use UTC when setting and showing the date and time.
+
+     -n   Do not notify other networked systems of the time
+          change.
+
+     -d dsttype
+          Set the kernel-stored Daylight Saving Time type to the
+          given value.  (The kernel-stored DST type is used
+          mostly by ``old'' binaries.)
+
+     -t minutes-west
+          Set the kernel-stored ``minutes west of UTC'' value to
+          the one given on the command line.  (The kernel-stored
+          DST type is used mostly by ``old'' binaries.)
+
+     -a adjustment
+          Change the time forward (or backward) by the number of
+          seconds (and fractions thereof) specified in the
+          adjustment argument.  Either the seconds part or the
+          fractions part of the argument (but not both) may be
+          omitted.  On BSD-based systems, the adjustment is made
+          by changing the rate at which time advances; on
+          System-V-based systems, the adjustment is made by
+          changing the time.
+
+FILES
+     /usr/lib/locale/L/LC_TIME           description of time
+     locale L
+     /usr/local/etc/zoneinfo             time zone information
+     directory
+     /usr/local/etc/zoneinfo/localtime   local time zone file
+     /usr/local/etc/zoneinfo/posixrules  used with POSIX-style
+     TZ's
+     /usr/local/etc/zoneinfo/GMT         for UTC leap seconds
+
+     If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds
+     are loaded from /usr/local/etc/zoneinfo/posixrules.
diff --git a/commands/zoneinfo/date.c b/commands/zoneinfo/date.c
new file mode 100644 (file)
index 0000000..f89259b
--- /dev/null
@@ -0,0 +1,974 @@
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)date.c 7.45";
+/*
+** Modified from the UCB version with the SCCS ID appearing below.
+*/
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*
+ * Copyright (c) 1985, 1987, 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANT[A]BILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1985, 1987, 1988 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)date.c     4.23 (Berkeley) 9/20/88";
+#endif /* not lint */
+
+#include "private.h"
+#if HAVE_ADJTIME || HAVE_SETTIMEOFDAY
+#include "sys/time.h"  /* for struct timeval, struct timezone */
+#endif /* HAVE_ADJTIME || HAVE_SETTIMEOFDAY */
+#include "locale.h"
+#include "utmp.h"      /* for OLD_TIME (or its absence) */
+#if HAVE_UTMPX_H
+#include "utmpx.h"
+#endif
+
+#ifndef OTIME_MSG
+#define OTIME_MSG "old time"
+#endif
+#ifndef NTIME_MSG
+#define NTIME_MSG "new time"
+#endif
+
+/*
+** The two things date knows about time are. . .
+*/
+
+#ifndef TM_YEAR_BASE
+#define TM_YEAR_BASE   1900
+#endif /* !defined TM_YEAR_BASE */
+
+#ifndef SECSPERMIN
+#define SECSPERMIN     60
+#endif /* !defined SECSPERMIN */
+
+extern double          atof();
+extern char **         environ;
+extern char *          getlogin();
+extern time_t          mktime();
+extern char *          optarg;
+extern int             optind;
+extern char *          strchr();
+extern time_t          time();
+extern char *          tzname[2];
+
+static int             retval = EXIT_SUCCESS;
+
+static void            checkfinal P((const char *, int, time_t, time_t));
+static int             comptm P((const struct tm *, const struct tm *));
+static time_t          convert P((const char *, int, time_t));
+static void            display P((const char *));
+static void            dogmt P((void));
+static void            errensure P((void));
+static void            iffy P((time_t, time_t, const char *, const char *));
+int                    main P((int, char**));
+static const char *    nondigit P((const char *));
+static void            oops P((const char *));
+static void            reset P((time_t, int));
+static void            timeout P((FILE *, const char *, const struct tm *));
+static void            usage P((void));
+static void            wildinput P((const char *, const char *,
+                               const char *));
+
+int
+main(argc, argv)
+const int      argc;
+char *         argv[];
+{
+       register const char *   format;
+       register const char *   value;
+       register const char *   cp;
+       register int            ch;
+       register int            dousg;
+       register int            aflag = 0;
+       register int            dflag = 0;
+       register int            nflag = 0;
+       register int            tflag = 0;
+       register int            minuteswest;
+       register int            dsttime;
+       register double         adjust;
+       time_t                  now;
+       time_t                  t;
+
+       INITIALIZE(dousg);
+       INITIALIZE(minuteswest);
+       INITIALIZE(dsttime);
+       INITIALIZE(adjust);
+       INITIALIZE(t);
+#ifdef LC_ALL
+       (void) setlocale(LC_ALL, "");
+#endif /* defined(LC_ALL) */
+#if HAVE_GETTEXT
+#ifdef TZ_DOMAINDIR
+       (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined(TEXTDOMAINDIR) */
+       (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT */
+       (void) time(&now);
+       format = value = NULL;
+       while ((ch = getopt(argc, argv, "ucnd:t:a:")) != EOF && ch != -1) {
+               switch (ch) {
+               default:
+                       usage();
+               case 'u':               /* do it in UTC */
+               case 'c':
+                       dogmt();
+                       break;
+               case 'n':               /* don't set network */
+                       nflag = 1;
+                       break;
+               case 'd':               /* daylight saving time */
+                       if (dflag) {
+                               (void) fprintf(stderr,
+                                       _("date: error: multiple -d's used"));
+                               usage();
+                       }
+                       dflag = 1;
+                       cp = optarg;
+                       dsttime = atoi(cp);
+                       if (*cp == '\0' || *nondigit(cp) != '\0')
+                               wildinput(_("-t value"), optarg,
+                                       _("must be a non-negative number"));
+                       break;
+               case 't':               /* minutes west of UTC */
+                       if (tflag) {
+                               (void) fprintf(stderr,
+                                       _("date: error: multiple -t's used"));
+                               usage();
+                       }
+                       tflag = 1;
+                       cp = optarg;
+                       minuteswest = atoi(cp);
+                       if (*cp == '+' || *cp == '-')
+                               ++cp;
+                       if (*cp == '\0' || *nondigit(cp) != '\0')
+                               wildinput(_("-d value"), optarg,
+                                       _("must be a number"));
+                       break;
+               case 'a':               /* adjustment */
+                       if (aflag) {
+                               (void) fprintf(stderr,
+                                       _("date: error: multiple -a's used"));
+                               usage();
+                       }
+                       aflag = 1;
+                       cp = optarg;
+                       adjust = atof(cp);
+                       if (*cp == '+' || *cp == '-')
+                               ++cp;
+                       if (*cp == '\0' || strcmp(cp, ".") == 0)
+                               wildinput(_("-a value"), optarg,
+                                       _("must be a number"));
+                       cp = nondigit(cp);
+                       if (*cp == '.')
+                               ++cp;
+                       if (*nondigit(cp) != '\0')
+                               wildinput(_("-a value"), optarg,
+                                       _("must be a number"));
+                       break;
+               }
+       }
+       while (optind < argc) {
+               cp = argv[optind++];
+               if (*cp == '+')
+                       if (format == NULL)
+                               format = cp + 1;
+                       else {
+                               (void) fprintf(stderr,
+_("date: error: multiple formats in command line\n"));
+                               usage();
+                       }
+               else    if (value == NULL)
+                               value = cp;
+                       else {
+                               (void) fprintf(stderr,
+_("date: error: multiple values in command line\n"));
+                               usage();
+                       }
+       }
+       if (value != NULL) {
+               /*
+               ** This order ensures that "reasonable" twelve-digit inputs
+               ** (such as 120203042006) won't be misinterpreted
+               ** even if time_t's range all the way back to the thirteenth
+               ** century.  Do not change the order.
+               */
+               t = convert(value, (dousg = TRUE), now);
+               if (t == -1)
+                       t = convert(value, (dousg = FALSE), now);
+               if (t == -1) {
+                       /*
+                       ** Out of range values,
+                       ** or time that falls in a DST transition hole?
+                       */
+                       if ((cp = strchr(value, '.')) != NULL) {
+                               /*
+                               ** Ensure that the failure of
+                               **      TZ=America/New_York date 8712312359.60
+                               ** doesn't get misdiagnosed.  (It was
+                               **      TZ=America/New_York date 8712311859.60
+                               ** when the leap second was inserted.)
+                               ** The normal check won't work since
+                               ** the given time is valid in UTC.
+                               */
+                               if (atoi(cp + 1) >= SECSPERMIN)
+                                       wildinput(_("time"), value,
+                                           _("out of range seconds given"));
+                       }
+                       dogmt();
+                       t = convert(value, FALSE, now);
+                       if (t == -1)
+                               t = convert(value, TRUE, now);
+                       wildinput(_("time"), value,
+                               (t == -1) ?
+                               _("out of range value given") :
+                               _("time skipped when clock springs forward"));
+               }
+       }
+       /*
+       ** Entire command line has now been checked.
+       */
+       if (aflag) {
+#if HAVE_ADJTIME
+               struct timeval  tv;
+
+               tv.tv_sec = (int) adjust;
+               tv.tv_usec = (int) ((adjust - tv.tv_sec) * 1000000L);
+               if (adjtime(&tv, (struct timeval *) NULL) != 0)
+                       oops("adjtime");
+#endif /* HAVE_ADJTIME */
+#if !HAVE_ADJTIME
+               reset((time_t) (now + adjust), nflag);
+#endif /* !HAVE_ADJTIME */
+               /*
+               ** Sun silently ignores everything else; we follow suit.
+               */
+               exit(retval);
+       }
+       if (dflag || tflag) {
+#if HAVE_SETTIMEOFDAY == 2
+               struct timezone tz;
+
+               if (!dflag || !tflag)
+                       if (gettimeofday((struct timeval *) NULL, &tz) != 0)
+                               oops("gettimeofday");
+               if (dflag)
+                       tz.tz_dsttime = dsttime;
+               if (tflag)
+                       tz.tz_minuteswest = minuteswest;
+               if (settimeofday((struct timeval *) NULL, &tz) != 0)
+                       oops("settimeofday");
+#endif /* HAVE_SETTIMEOFDAY == 2 */
+#if HAVE_SETTIMEOFDAY != 2
+               (void) fprintf(stderr,
+_("date: warning: kernel doesn't keep -d/-t information, option ignored\n"));
+#endif /* HAVE_SETTIMEOFDAY != 2 */
+       }
+
+       if (value == NULL)
+               display(format);
+
+       reset(t, nflag);
+
+       checkfinal(value, dousg, t, now);
+
+#ifdef EBUG
+       {
+               struct tm       tm;
+
+               tm = *localtime(&t);
+               timeout(stdout, "%c\n", &tm);
+               exit(retval);
+       }
+#endif /* defined EBUG */
+
+       display(format);
+
+       /* gcc -Wall pacifier */
+       for ( ; ; )
+               continue;
+}
+
+static void
+dogmt()
+{
+       static char **  fakeenv;
+
+       if (fakeenv == NULL) {
+               register int    from;
+               register int    to;
+               register int    n;
+               static char     tzegmt0[] = "TZ=GMT0";
+
+               for (n = 0;  environ[n] != NULL;  ++n)
+                       continue;
+               fakeenv = (char **) malloc((size_t) (n + 2) * sizeof *fakeenv);
+               if (fakeenv == NULL) {
+                       (void) perror(_("Memory exhausted"));
+                       errensure();
+                       exit(retval);
+               }
+               to = 0;
+               fakeenv[to++] = tzegmt0;
+               for (from = 1; environ[from] != NULL; ++from)
+                       if (strncmp(environ[from], "TZ=", 3) != 0)
+                               fakeenv[to++] = environ[from];
+               fakeenv[to] = NULL;
+               environ = fakeenv;
+       }
+}
+
+#ifdef OLD_TIME
+
+/*
+** We assume we're on a System-V-based system,
+** should use stime,
+** should write System-V-format utmp entries,
+** and don't have network notification to worry about.
+*/
+
+#include "fcntl.h"     /* for O_WRONLY, O_APPEND */
+
+/*ARGSUSED*/
+static void
+#if __STDC__
+reset(const time_t newt, const int nflag)
+#else /* !__STDC__ */
+reset(newt, nflag)
+const time_t   newt;
+const int      nflag;
+#endif /* !__STDC__ */
+{
+       register int            fid;
+       time_t                  oldt;
+       static struct {
+               struct utmp     before;
+               struct utmp     after;
+       } s;
+#if HAVE_UTMPX_H
+       static struct {
+               struct utmpx    before;
+               struct utmpx    after;
+       } sx;
+#endif
+
+       /*
+       ** Wouldn't it be great if stime returned the old time?
+       */
+       (void) time(&oldt);
+       if (stime(&newt) != 0)
+               oops("stime");
+       s.before.ut_type = OLD_TIME;
+       s.before.ut_time = oldt;
+       (void) strcpy(s.before.ut_line, OTIME_MSG);
+       s.after.ut_type = NEW_TIME;
+       s.after.ut_time = newt;
+       (void) strcpy(s.after.ut_line, NTIME_MSG);
+       fid = open(WTMP_FILE, O_WRONLY | O_APPEND);
+       if (fid < 0)
+               oops(_("log file open"));
+       if (write(fid, (char *) &s, sizeof s) != sizeof s)
+               oops(_("log file write"));
+       if (close(fid) != 0)
+               oops(_("log file close"));
+#if !HAVE_UTMPX_H
+       pututline(&s.before);
+       pututline(&s.after);
+#endif /* !HAVE_UTMPX_H */
+#if HAVE_UTMPX_H
+       sx.before.ut_type = OLD_TIME;
+       sx.before.ut_tv.tv_sec = oldt;
+       (void) strcpy(sx.before.ut_line, OTIME_MSG);
+       sx.after.ut_type = NEW_TIME;
+       sx.after.ut_tv.tv_sec = newt;
+       (void) strcpy(sx.after.ut_line, NTIME_MSG);
+#if !SUPPRESS_WTMPX_FILE_UPDATE
+       /* In Solaris 2.5 (and presumably other systems),
+          `date' does not update /var/adm/wtmpx.
+          This must be a bug.  If you'd like to reproduce the bug,
+          define SUPPRESS_WTMPX_FILE_UPDATE to be nonzero.  */
+       fid = open(WTMPX_FILE, O_WRONLY | O_APPEND);
+       if (fid < 0)
+               oops(_("log file open"));
+       if (write(fid, (char *) &sx, sizeof sx) != sizeof sx)
+               oops(_("log file write"));
+       if (close(fid) != 0)
+               oops(_("log file close"));
+#endif /* !SUPPRESS_WTMPX_FILE_UPDATE */
+       pututxline(&sx.before);
+       pututxline(&sx.after);
+#endif /* HAVE_UTMPX_H */
+}
+
+#endif /* defined OLD_TIME */
+#ifndef OLD_TIME
+
+/*
+** We assume we're on a BSD-based system,
+** should use settimeofday,
+** should write BSD-format utmp entries (using logwtmp),
+** and may get to worry about network notification.
+** The "time name" changes between 4.3-tahoe and 4.4;
+** we include sys/param.h to determine which we should use.
+*/
+
+#ifndef TIME_NAME
+#include "sys/param.h"
+#ifdef BSD4_4
+#define TIME_NAME      "date"
+#endif /* defined BSD4_4 */
+#ifndef BSD4_4
+#define TIME_NAME      ""
+#endif /* !defined BSD4_4 */
+#endif /* !defined TIME_NAME */
+
+#include "syslog.h"
+#include "sys/socket.h"
+#include "netinet/in.h"
+#include "netdb.h"
+#define TSPTYPES
+#include "protocols/timed.h"
+
+extern int             logwtmp();
+
+#if HAVE_SETTIMEOFDAY == 1
+#define settimeofday(t, tz) (settimeofday)(t)
+#endif /* HAVE_SETTIMEOFDAY == 1 */
+
+#ifndef TSP_SETDATE
+/*ARGSUSED*/
+#endif /* !defined TSP_SETDATE */
+static void
+reset(newt, nflag)
+const time_t   newt;
+const int      nflag;
+{
+       register const char *   username;
+       static struct timeval   tv;     /* static so tv_usec is 0 */
+
+#ifdef EBUG
+       return;
+#endif /* defined EBUG */
+       username = getlogin();
+       if (username == NULL || *username == '\0') /* single-user or no tty */
+               username = "root";
+       tv.tv_sec = newt;
+#ifdef TSP_SETDATE
+       if (nflag || !netsettime(tv))
+#endif /* defined TSP_SETDATE */
+       {
+               /*
+               ** "old" entry is always written, for compatibility.
+               */
+               logwtmp("|", TIME_NAME, "");
+               if (settimeofday(&tv, (struct timezone *) NULL) == 0) {
+                       logwtmp("{", TIME_NAME, "");    /* } */
+                       syslog(LOG_AUTH | LOG_NOTICE, _("date set by %s"),
+                               username);
+               } else  oops("settimeofday");
+       }
+}
+
+#endif /* !defined OLD_TIME */
+
+static void
+wildinput(item, value, reason)
+const char * const     item;
+const char * const     value;
+const char * const     reason;
+{
+       (void) fprintf(stderr,
+               _("date: error: bad command line %s \"%s\", %s\n"),
+               item, value, reason);
+       usage();
+}
+
+static void
+errensure P((void))
+{
+       if (retval == EXIT_SUCCESS)
+               retval = EXIT_FAILURE;
+}
+
+static const char *
+nondigit(cp)
+register const char *  cp;
+{
+       while (is_digit(*cp))
+               ++cp;
+       return cp;
+}
+
+static void
+usage P((void))
+{
+       (void) fprintf(stderr, _("date: usage is date [-u] [-c] [-n] [-d dst] \
+[-t min-west] [-a sss.fff] [[yyyy]mmddhhmm[yyyy][.ss]] [+format]\n"));
+       errensure();
+       exit(retval);
+}
+
+static void
+oops(string)
+const char * const     string;
+{
+       int             e = errno;
+
+       (void) fprintf(stderr, _("date: error: "));
+       errno = e;
+       (void) perror(string);
+       errensure();
+       display((char *) NULL);
+}
+
+static void
+display(format)
+const char * const     format;
+{
+       struct tm       tm;
+       time_t          now;
+
+       (void) time(&now);
+       tm = *localtime(&now);
+       timeout(stdout, format ? format : "%+", &tm);
+       (void) putchar('\n');
+       (void) fflush(stdout);
+       (void) fflush(stderr);
+       if (ferror(stdout) || ferror(stderr)) {
+               (void) fprintf(stderr,
+                       _("date: error: couldn't write results\n"));
+               errensure();
+       }
+       exit(retval);
+}
+
+extern size_t  strftime();
+
+#define INCR   1024
+
+static void
+timeout(fp, format, tmp)
+FILE * const           fp;
+const char * const     format;
+const struct tm * const        tmp;
+{
+       char *  cp;
+       size_t  result;
+       size_t  size;
+
+       if (*format == '\0')
+               return;
+       size = INCR;
+       cp = malloc((size_t) size);
+       for ( ; ; ) {
+               if (cp == NULL) {
+                       (void) fprintf(stderr,
+                               _("date: error: can't get memory\n"));
+                       errensure();
+                       exit(retval);
+               }
+               cp[0] = '\1';
+               result = strftime(cp, size, format, tmp);
+               if (result != 0 || cp[0] == '\0')
+                       break;
+               size += INCR;
+               cp = realloc(cp, (size_t) size);
+       }
+       (void) fwrite(cp, 1, result, fp);
+       free(cp);
+}
+
+static int
+comptm(atmp, btmp)
+register const struct tm * const atmp;
+register const struct tm * const btmp;
+{
+       register int    result;
+
+       if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&
+               (result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
+               (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
+               (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
+               (result = (atmp->tm_min - btmp->tm_min)) == 0)
+                       result = atmp->tm_sec - btmp->tm_sec;
+       return result;
+}
+
+/*
+** convert --
+**     convert user's input into a time_t.
+*/
+
+#define ATOI2(ar)      (ar[0] - '0') * 10 + (ar[1] - '0'); ar += 2;
+
+static time_t
+#if __STDC__
+convert(register const char * const value, const int dousg, const time_t t)
+#else /* !__STDC__ */
+convert(value, dousg, t)
+register const char * const    value;
+const int                      dousg;
+const time_t                   t;
+#endif /* !__STDC__ */
+{
+       register const char *   cp;
+       register const char *   dotp;
+       register int    cent, year_in_cent, month, hour, day, mins, secs;
+       struct tm       tm, outtm;
+       time_t          outt;
+
+       tm = *localtime(&t);
+#define DIVISOR        100
+       year_in_cent = tm.tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
+       cent = tm.tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
+               year_in_cent / DIVISOR;
+       year_in_cent %= DIVISOR;
+       if (year_in_cent < 0) {
+               year_in_cent += DIVISOR;
+               --cent;
+       }
+       month = tm.tm_mon + 1;
+       day = tm.tm_mday;
+       hour = tm.tm_hour;
+       mins = tm.tm_min;
+       secs = 0;
+
+       dotp = strchr(value, '.');
+       for (cp = value; *cp != '\0'; ++cp)
+               if (!is_digit(*cp) && cp != dotp)
+                       wildinput(_("time"), value, _("contains a nondigit"));
+
+       if (dotp == NULL)
+               dotp = strchr(value, '\0');
+       else {
+               cp = dotp + 1;
+               if (strlen(cp) != 2)
+                       wildinput(_("time"), value,
+                               _("seconds part is not two digits"));
+               secs = ATOI2(cp);
+       }
+
+       cp = value;
+       switch (dotp - cp) {
+               default:
+                       wildinput(_("time"), value,
+                               _("main part is wrong length"));
+               case 12:
+                       if (!dousg) {
+                               cent = ATOI2(cp);
+                               year_in_cent = ATOI2(cp);
+                       }
+                       month = ATOI2(cp);
+                       day = ATOI2(cp);
+                       hour = ATOI2(cp);
+                       mins = ATOI2(cp);
+                       if (dousg) {
+                               cent = ATOI2(cp);
+                               year_in_cent = ATOI2(cp);
+                       }
+                       break;
+               case 8: /* mmddhhmm */
+                       month = ATOI2(cp);
+                       /* fall through to. . . */
+               case 6: /* ddhhmm */
+                       day = ATOI2(cp);
+                       /* fall through to. . . */
+               case 4: /* hhmm */
+                       hour = ATOI2(cp);
+                       mins = ATOI2(cp);
+                       break;
+               case 10:
+                       if (!dousg) {
+                               year_in_cent = ATOI2(cp);
+                       }
+                       month = ATOI2(cp);
+                       day = ATOI2(cp);
+                       hour = ATOI2(cp);
+                       mins = ATOI2(cp);
+                       if (dousg) {
+                               year_in_cent = ATOI2(cp);
+                       }
+                       break;
+       }
+
+       tm.tm_year = cent * 100 + year_in_cent - TM_YEAR_BASE;
+       tm.tm_mon = month - 1;
+       tm.tm_mday = day;
+       tm.tm_hour = hour;
+       tm.tm_min = mins;
+       tm.tm_sec = secs;
+       tm.tm_isdst = -1;
+       outtm = tm;
+       outt = mktime(&outtm);
+       return (comptm(&tm, &outtm) == 0) ? outt : -1;
+}
+
+/*
+** Code from here on out is either based on code provided by UCB
+** or is only called just before the program exits.
+*/
+
+/*
+** Check for iffy input.
+*/
+
+static void
+#if __STDC__
+checkfinal(const char * const  value,
+          const int            didusg,
+          const time_t         t,
+          const time_t         oldnow)
+#else /* !__STDC__ */
+checkfinal(value, didusg, t, oldnow)
+const char * const     value;
+const int              didusg;
+const time_t           t;
+const time_t           oldnow;
+#endif /* !__STDC__ */
+{
+       time_t          othert;
+       struct tm       tm;
+       struct tm       othertm;
+       register int    pass;
+       register long   offset;
+
+       /*
+       ** See if there's both a USG and a BSD interpretation.
+       */
+       othert = convert(value, !didusg, oldnow);
+       if (othert != -1 && othert != t)
+               iffy(t, othert, value, _("year could be at start or end"));
+       /*
+       ** See if there's both a DST and a STD version.
+       */
+       tm = *localtime(&t);
+       othertm = tm;
+       othertm.tm_isdst = !tm.tm_isdst;
+       othert = mktime(&othertm);
+       if (othert != -1 && othertm.tm_isdst != tm.tm_isdst &&
+               comptm(&tm, &othertm) == 0)
+                       iffy(t, othert, value,
+                           _("both standard and summer time versions exist"));
+/*
+** Final check.
+**
+** If a jurisdiction shifts time *without* shifting whether time is
+** summer or standard (as Hawaii, the United Kingdom, and Saudi Arabia
+** have done), routine checks for iffy times may not work.
+** So we perform this final check, deferring it until after the time has
+** been set--it may take a while, and we don't want to introduce an unnecessary
+** lag between the time the user enters their command and the time that
+** stime/settimeofday is called.
+**
+** We just check nearby times to see if any have the same representation
+** as the time that convert returned.  We work our way out from the center
+** for quick response in solar time situations.  We only handle common cases--
+** offsets of at most a minute, and offsets of exact numbers of minutes
+** and at most an hour.
+*/
+       for (offset = 1; offset <= 60; ++offset)
+               for (pass = 1; pass <= 4; ++pass) {
+                       if (pass == 1)
+                               othert = t + offset;
+                       else if (pass == 2)
+                               othert = t - offset;
+                       else if (pass == 3)
+                               othert = t + 60 * offset;
+                       else    othert = t - 60 * offset;
+                       othertm = *localtime(&othert);
+                       if (comptm(&tm, &othertm) == 0)
+                               iffy(t, othert, value,
+                                       _("multiple matching times exist"));
+               }
+}
+
+static void
+#if __STDC__
+iffy(const time_t thist, const time_t thatt,
+       const char * const value, const char * const reason)
+#else /* !__STDC__ */
+iffy(thist, thatt, value, reason)
+const time_t           thist;
+const time_t           thatt;
+const char * const     value;
+const char * const     reason;
+#endif /* !__STDC__ */
+{
+       struct tm       tm;
+
+       (void) fprintf(stderr, _("date: warning: ambiguous time \"%s\", %s.\n"),
+               value, reason);
+       tm = *gmtime(&thist);
+       /*
+       ** Avoid running afoul of SCCS!
+       */
+       timeout(stderr, _("Time was set as if you used\n\tdate -u %m%d%H\
+%M\
+%Y.%S\n"), &tm);
+       tm = *localtime(&thist);
+       timeout(stderr, _("to get %c"), &tm);
+       (void) fprintf(stderr, _(" (%s).  Use\n"),
+               tm.tm_isdst ? _("summer time") : _("standard time"));
+       tm = *gmtime(&thatt);
+       timeout(stderr, _("\tdate -u %m%d%H\
+%M\
+%Y.%S\n"), &tm);
+       tm = *localtime(&thatt);
+       timeout(stderr, _("to get %c"), &tm);
+       (void) fprintf(stderr, _(" (%s).\n"),
+               tm.tm_isdst ? _("summer time") : _("standard time"));
+       errensure();
+       exit(retval);
+}
+
+#ifdef TSP_SETDATE
+#define WAITACK                2       /* seconds */
+#define WAITDATEACK    5       /* seconds */
+
+/*
+ * Set the date in the machines controlled by timedaemons
+ * by communicating the new date to the local timedaemon.
+ * If the timedaemon is in the master state, it performs the
+ * correction on all slaves.  If it is in the slave state, it
+ * notifies the master that a correction is needed.
+ * Returns 1 on success, 0 on failure.
+ */
+netsettime(ntv)
+       struct timeval ntv;
+{
+       int s, length, port, timed_ack, found, err;
+       long waittime;
+       fd_set ready;
+       char hostname[MAXHOSTNAMELEN];
+       struct timeval tout;
+       struct servent *sp;
+       struct tsp msg;
+       struct sockaddr_in sin, dest, from;
+
+       sp = getservbyname("timed", "udp");
+       if (sp == 0) {
+               fputs(_("udp/timed: unknown service\n"), stderr);
+               retval = 2;
+               return (0);
+       }
+       dest.sin_port = sp->s_port;
+       dest.sin_family = AF_INET;
+       dest.sin_addr.s_addr = htonl((u_long)INADDR_ANY);
+       s = socket(AF_INET, SOCK_DGRAM, 0);
+       if (s < 0) {
+               if (errno != EPROTONOSUPPORT)
+                       perror("date: socket");
+               goto bad;
+       }
+       bzero((char *)&sin, sizeof (sin));
+       sin.sin_family = AF_INET;
+       for (port = IPPORT_RESERVED - 1; port > IPPORT_RESERVED / 2; port--) {
+               sin.sin_port = htons((u_short)port);
+               if (bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0)
+                       break;
+               if (errno != EADDRINUSE) {
+                       if (errno != EADDRNOTAVAIL)
+                               perror("date: bind");
+                       goto bad;
+               }
+       }
+       if (port == IPPORT_RESERVED / 2) {
+               fputs(_("date: All ports in use\n"), stderr);
+               goto bad;
+       }
+       msg.tsp_type = TSP_SETDATE;
+       msg.tsp_vers = TSPVERSION;
+       if (gethostname(hostname, sizeof (hostname))) {
+               perror("gethostname");
+               goto bad;
+       }
+       (void) strncpy(msg.tsp_name, hostname, sizeof (hostname));
+       msg.tsp_seq = htons((u_short)0);
+       msg.tsp_time.tv_sec = htonl((u_long)ntv.tv_sec);
+       msg.tsp_time.tv_usec = htonl((u_long)ntv.tv_usec);
+       length = sizeof (struct sockaddr_in);
+       if (connect(s, &dest, length) < 0) {
+               perror("date: connect");
+               goto bad;
+       }
+       if (send(s, (char *)&msg, sizeof (struct tsp), 0) < 0) {
+               if (errno != ECONNREFUSED)
+                       perror("date: send");
+               goto bad;
+       }
+       timed_ack = -1;
+       waittime = WAITACK;
+loop:
+       tout.tv_sec = waittime;
+       tout.tv_usec = 0;
+       FD_ZERO(&ready);
+       FD_SET(s, &ready);
+       found = select(FD_SETSIZE, &ready, (fd_set *)0, (fd_set *)0, &tout);
+       length = sizeof err;
+       if (getsockopt(s, SOL_SOCKET, SO_ERROR, (char *)&err, &length) == 0
+           && err) {
+               errno = err;
+               if (errno != ECONNREFUSED)
+                       perror(_("date: send (delayed error)"));
+               goto bad;
+       }
+       if (found > 0 && FD_ISSET(s, &ready)) {
+               length = sizeof (struct sockaddr_in);
+               if (recvfrom(s, (char *)&msg, sizeof (struct tsp), 0, &from,
+                   &length) < 0) {
+                       if (errno != ECONNREFUSED)
+                               perror("date: recvfrom");
+                       goto bad;
+               }
+               msg.tsp_seq = ntohs(msg.tsp_seq);
+               msg.tsp_time.tv_sec = ntohl(msg.tsp_time.tv_sec);
+               msg.tsp_time.tv_usec = ntohl(msg.tsp_time.tv_usec);
+               switch (msg.tsp_type) {
+
+               case TSP_ACK:
+                       timed_ack = TSP_ACK;
+                       waittime = WAITDATEACK;
+                       goto loop;
+
+               case TSP_DATEACK:
+                       (void)close(s);
+                       return (1);
+
+               default:
+                       fprintf(stderr,
+                               _("date: Wrong ack received from timed: %s\n"),
+                               tsptype[msg.tsp_type]);
+                       timed_ack = -1;
+                       break;
+               }
+       }
+       if (timed_ack == -1)
+               fputs(_("date: Can't reach time daemon, time set locally.\n"),
+                       stderr);
+bad:
+       (void)close(s);
+       retval = 2;
+       return (0);
+}
+#endif /* defined TSP_SETDATE */
diff --git a/commands/zoneinfo/difftime.c b/commands/zoneinfo/difftime.c
new file mode 100644 (file)
index 0000000..c5efbca
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)difftime.c     7.19";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*LINTLIBRARY*/
+
+#include "private.h"   /* for time_t, TYPE_INTEGRAL, and TYPE_SIGNED */
+
+double
+difftime(time1, time0)
+const time_t   time1;
+const time_t   time0;
+{
+       /*
+       ** If (sizeof (double) > sizeof (time_t)) simply convert and subtract
+       ** (assuming that the larger type has more precision).
+       ** This is the common real-world case circa 2004.
+       */
+       if (sizeof (double) > sizeof (time_t))
+               return (double) time1 - (double) time0;
+       if (!TYPE_INTEGRAL(time_t)) {
+               /*
+               ** time_t is floating.
+               */
+               return time1 - time0;
+       }
+       if (!TYPE_SIGNED(time_t)) {
+               /*
+               ** time_t is integral and unsigned.
+               ** The difference of two unsigned values can't overflow
+               ** if the minuend is greater than or equal to the subtrahend.
+               */
+               if (time1 >= time0)
+                       return time1 - time0;
+               else    return -((double) (time0 - time1));
+       }
+       /*
+       ** time_t is integral and signed.
+       ** Handle cases where both time1 and time0 have the same sign
+       ** (meaning that their difference cannot overflow).
+       */
+       if ((time1 < 0) == (time0 < 0))
+               return time1 - time0;
+       /*
+       ** time1 and time0 have opposite signs.
+       ** Punt if unsigned long is too narrow.
+       */
+       if (sizeof (unsigned long) < sizeof (time_t))
+               return (double) time1 - (double) time0;
+       /*
+       ** Stay calm...decent optimizers will eliminate the complexity below.
+       */
+       if (time1 >= 0 /* && time0 < 0 */)
+               return (unsigned long) time1 +
+                       (unsigned long) (-(time0 + 1)) + 1;
+       return -(double) ((unsigned long) time0 +
+               (unsigned long) (-(time1 + 1)) + 1);
+}
diff --git a/commands/zoneinfo/etcetera b/commands/zoneinfo/etcetera
new file mode 100644 (file)
index 0000000..cddbe8a
--- /dev/null
@@ -0,0 +1,80 @@
+# @(#)etcetera 8.1
+
+# These entries are mostly present for historical reasons, so that
+# people in areas not otherwise covered by the tz files could "zic -l"
+# to a time zone that was right for their area.  These days, the
+# tz files cover almost all the inhabited world, and the only practical
+# need now for the entries that are not on UTC are for ships at sea
+# that cannot use POSIX TZ settings.
+
+Zone   Etc/GMT         0       -       GMT
+Zone   Etc/UTC         0       -       UTC
+Zone   Etc/UCT         0       -       UCT
+
+# The following link uses older naming conventions,
+# but it belongs here, not in the file `backward',
+# as functions like gmtime load the "GMT" file to handle leap seconds properly.
+# We want this to work even on installations that omit the other older names.
+Link   Etc/GMT                         GMT
+
+Link   Etc/UTC                         Etc/Universal
+Link   Etc/UTC                         Etc/Zulu
+
+Link   Etc/GMT                         Etc/Greenwich
+Link   Etc/GMT                         Etc/GMT-0
+Link   Etc/GMT                         Etc/GMT+0
+Link   Etc/GMT                         Etc/GMT0
+
+# We use POSIX-style signs in the Zone names and the output abbreviations,
+# even though this is the opposite of what many people expect.
+# POSIX has positive signs west of Greenwich, but many people expect
+# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
+# the abbreviation "GMT+4" and corresponds to 4 hours behind UTC
+# (i.e. west of Greenwich) even though many people would expect it to
+# mean 4 hours ahead of UTC (i.e. east of Greenwich).
+#
+# In the draft 5 of POSIX 1003.1-200x, the angle bracket notation
+# (which is not yet supported by the tz code) allows for
+# TZ='<GMT-4>+4'; if you want time zone abbreviations conforming to
+# ISO 8601 you can use TZ='<-0400>+4'.  Thus the commonly-expected
+# offset is kept within the angle bracket (and is used for display)
+# while the POSIX sign is kept outside the angle bracket (and is used
+# for calculation).
+#
+# Do not use a TZ setting like TZ='GMT+4', which is four hours behind
+# GMT but uses the completely misleading abbreviation "GMT".
+
+# Earlier incarnations of this package were not POSIX-compliant,
+# and had lines such as
+#              Zone    GMT-12          -12     -       GMT-1200
+# We did not want things to change quietly if someone accustomed to the old
+# way does a
+#              zic -l GMT-12
+# so we moved the names into the Etc subdirectory.
+
+Zone   Etc/GMT-14      14      -       GMT-14  # 14 hours ahead of GMT
+Zone   Etc/GMT-13      13      -       GMT-13
+Zone   Etc/GMT-12      12      -       GMT-12
+Zone   Etc/GMT-11      11      -       GMT-11
+Zone   Etc/GMT-10      10      -       GMT-10
+Zone   Etc/GMT-9       9       -       GMT-9
+Zone   Etc/GMT-8       8       -       GMT-8
+Zone   Etc/GMT-7       7       -       GMT-7
+Zone   Etc/GMT-6       6       -       GMT-6
+Zone   Etc/GMT-5       5       -       GMT-5
+Zone   Etc/GMT-4       4       -       GMT-4
+Zone   Etc/GMT-3       3       -       GMT-3
+Zone   Etc/GMT-2       2       -       GMT-2
+Zone   Etc/GMT-1       1       -       GMT-1
+Zone   Etc/GMT+1       -1      -       GMT+1
+Zone   Etc/GMT+2       -2      -       GMT+2
+Zone   Etc/GMT+3       -3      -       GMT+3
+Zone   Etc/GMT+4       -4      -       GMT+4
+Zone   Etc/GMT+5       -5      -       GMT+5
+Zone   Etc/GMT+6       -6      -       GMT+6
+Zone   Etc/GMT+7       -7      -       GMT+7
+Zone   Etc/GMT+8       -8      -       GMT+8
+Zone   Etc/GMT+9       -9      -       GMT+9
+Zone   Etc/GMT+10      -10     -       GMT+10
+Zone   Etc/GMT+11      -11     -       GMT+11
+Zone   Etc/GMT+12      -12     -       GMT+12
diff --git a/commands/zoneinfo/europe b/commands/zoneinfo/europe
new file mode 100644 (file)
index 0000000..79c068e
--- /dev/null
@@ -0,0 +1,2519 @@
+# @(#)europe   8.10
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1991, and IATA SSIM is the source for entries afterwards.
+#
+# Other sources occasionally used include:
+#
+#      Edward W. Whitman, World Time Differences,
+#      Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated),
+#      which I found in the UCLA library.
+#
+#      <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf">
+#      William Willett, The Waste of Daylight, 19th edition
+#      </a> (1914-03)
+#
+#      Brazil's Departamento Servico da Hora (DSH),
+#      <a href="http://pcdsh01.on.br/HISTHV.htm">
+#      History of Summer Time
+#      </a> (1998-09-21, in Portuguese)
+
+#
+# I invented the abbreviations marked `*' in the following table;
+# the rest are from earlier versions of this file, or from other sources.
+# Corrections are welcome!
+#                   std dst  2dst
+#                   LMT           Local Mean Time
+#       -4:00       AST ADT       Atlantic
+#       -3:00       WGT WGST      Western Greenland*
+#       -1:00       EGT EGST      Eastern Greenland*
+#        0:00       GMT BST  BDST Greenwich, British Summer
+#        0:00       GMT IST       Greenwich, Irish Summer
+#        0:00       WET WEST WEMT Western Europe
+#        0:19:32.13 AMT NST       Amsterdam, Netherlands Summer (1835-1937)*
+#        0:20       NET NEST      Netherlands (1937-1940)*
+#        1:00       CET CEST CEMT Central Europe
+#        1:00:14    SET           Swedish (1879-1899)*
+#        2:00       EET EEST      Eastern Europe
+#        3:00       MSK MSD       Moscow
+#
+# A reliable and entertaining source about time zones, especially in Britain,
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+
+# From Peter Ilieve (1994-12-04),
+# The original six [EU members]: Belgium, France, (West) Germany, Italy,
+# Luxembourg, the Netherlands.
+# Plus, from 1 Jan 73: Denmark, Ireland, United Kingdom.
+# Plus, from 1 Jan 81: Greece.
+# Plus, from 1 Jan 86: Spain, Portugal.
+# Plus, from 1 Jan 95: Austria, Finland, Sweden. (Norway negotiated terms for
+# entry but in a referendum on 28 Nov 94 the people voted No by 52.2% to 47.8%
+# on a turnout of 88.6%. This was almost the same result as Norway's previous
+# referendum in 1972, they are the only country to have said No twice.
+# Referendums in the other three countries voted Yes.)
+# ...
+# Estonia ... uses EU dates but not at 01:00 GMT, they use midnight GMT.
+# I don't think they know yet what they will do from 1996 onwards.
+# ...
+# There shouldn't be any [current members who are not using EU rules].
+# A Directive has the force of law, member states are obliged to enact
+# national law to implement it. The only contentious issue was the
+# different end date for the UK and Ireland, and this was always allowed
+# in the Directive.
+
+
+###############################################################################
+
+# Britain (United Kingdom) and Ireland (Eire)
+
+# From Peter Ilieve (1994-07-06):
+#
+# On 17 Jan 1994 the Independent, a UK quality newspaper, had a piece about
+# historical vistas along the Thames in west London. There was a photo
+# and a sketch map showing some of the sightlines involved. One paragraph
+# of the text said:
+#
+# `An old stone obelisk marking a forgotten terrestrial meridian stands
+# beside the river at Kew. In the 18th century, before time and longitude
+# was standardised by the Royal Observatory in Greenwich, scholars observed
+# this stone and the movement of stars from Kew Observatory nearby. They
+# made their calculations and set the time for the Horse Guards and Parliament,
+# but now the stone is obscured by scrubwood and can only be seen by walking
+# along the towpath within a few yards of it.'
+#
+# I have a one inch to one mile map of London and my estimate of the stone's
+# position is 51 deg. 28' 30" N, 0 deg. 18' 45" W. The longitude should
+# be within about +-2". The Ordnance Survey grid reference is TQ172761.
+#
+# [This yields GMTOFF = -0:01:15 for London LMT in the 18th century.]
+
+# From Paul Eggert (1993-11-18):
+#
+# Howse writes that Britain was the first country to use standard time.
+# The railways cared most about the inconsistencies of local mean time,
+# and it was they who forced a uniform time on the country.
+# The original idea was credited to Dr. William Hyde Wollaston (1766-1828)
+# and was popularized by Abraham Follett Osler (1808-1903).
+# The first railway to adopt London time was the Great Western Railway
+# in November 1840; other railways followed suit, and by 1847 most
+# (though not all) railways used London time.  On 1847-09-22 the
+# Railway Clearing House, an industry standards body, recommended that GMT be
+# adopted at all stations as soon as the General Post Office permitted it.
+# The transition occurred on 12-01 for the L&NW, the Caledonian,
+# and presumably other railways; the January 1848 Bradshaw's lists many
+# railways as using GMT.  By 1855 the vast majority of public
+# clocks in Britain were set to GMT (though some, like the great clock
+# on Tom Tower at Christ Church, Oxford, were fitted with two minute hands,
+# one for local time and one for GMT).  The last major holdout was the legal
+# system, which stubbornly stuck to local time for many years, leading
+# to oddities like polls opening at 08:13 and closing at 16:13.
+# The legal system finally switched to GMT when the Statutes (Definition
+# of Time) Act took effect; it received the Royal Assent on 1880-08-02.
+#
+# In the tables below, we condense this complicated story into a single
+# transition date for London, namely 1847-12-01.  We don't know as much
+# about Dublin, so we use 1880-08-02, the legal transition time.
+
+# From Paul Eggert (2003-09-27):
+# Summer Time was first seriously proposed by William Willett (1857-1915),
+# a London builder and member of the Royal Astronomical Society
+# who circulated a pamphlet ``The Waste of Daylight'' (1907)
+# that proposed advancing clocks 20 minutes on each of four Sundays in April,
+# and retarding them by the same amount on four Sundays in September.
+# A bill was drafted in 1909 and introduced in Parliament several times,
+# but it met with ridicule and opposition, especially from farming interests.
+# Later editions of the pamphlet proposed one-hour summer time, and
+# it was eventually adopted as a wartime measure in 1916.
+# See: Summer Time Arrives Early, The Times (2000-05-18).
+# A monument to Willett was unveiled on 1927-05-21, in an open space in
+# a 45-acre wood near Chislehurst, Kent that was purchased by popular
+# subscription and open to the public.  On the south face of the monolith,
+# designed by G. W. Miller, is the the William Willett Memorial Sundial,
+# which is permanently set to Summer Time.
+
+# From Winston Churchill (1934-04-28):
+# It is one of the paradoxes of history that we should owe the boon of
+# summer time, which gives every year to the people of this country
+# between 160 and 170 hours more daylight leisure, to a war which
+# plunged Europe into darkness for four years, and shook the
+# foundations of civilization throughout the world.
+#      -- <a href="http://www.winstonchurchill.org/fh114willett.htm">
+#      "A Silent Toast to William Willett", Pictorial Weekly
+#      </a>
+
+# From Paul Eggert (1996-09-03):
+# The OED Supplement says that the English originally said ``Daylight Saving''
+# when they were debating the adoption of DST in 1908; but by 1916 this
+# term appears only in quotes taken from DST's opponents, whereas the
+# proponents (who eventually won the argument) are quoted as using ``Summer''.
+
+# From Arthur David Olson (1989-01-19):
+#
+# A source at the British Information Office in New York avers that it's
+# known as "British" Summer Time in all parts of the United Kingdom.
+
+# Date: 4 Jan 89 08:57:25 GMT (Wed)
+# From: Jonathan Leffler
+# [British Summer Time] is fixed annually by Act of Parliament.
+# If you can predict what Parliament will do, you should be in
+# politics making a fortune, not computing.
+
+# From Chris Carrier (1996-06-14):
+# I remember reading in various wartime issues of the London Times the
+# acronym BDST for British Double Summer Time.  Look for the published
+# time of sunrise and sunset in The Times, when BDST was in effect, and
+# if you find a zone reference it will say, "All times B.D.S.T."
+
+# From Joseph S. Myers (1999-09-02):
+# ... some military cables (WO 219/4100 - this is a copy from the
+# main SHAEF archives held in the US National Archives, SHAEF/5252/8/516)
+# agree that the usage is BDST (this appears in a message dated 17 Feb 1945).
+
+# From Joseph S. Myers (2000-10-03):
+# On 18th April 1941, Sir Stephen Tallents of the BBC wrote to Sir
+# Alexander Maxwell of the Home Office asking whether there was any
+# official designation; the reply of the 21st was that there wasn't
+# but he couldn't think of anything better than the "Double British
+# Summer Time" that the BBC had been using informally.
+# http://student.cusu.cam.ac.uk/~jsm28/british-time/bbc-19410418.png
+# http://student.cusu.cam.ac.uk/~jsm28/british-time/ho-19410421.png
+
+# From Sir Alexander Maxwell in the above-mentioned letter (1941-04-21):
+# [N]o official designation has as far as I know been adopted for the time
+# which is to be introduced in May....
+# I cannot think of anything better than "Double British Summer Time"
+# which could not be said to run counter to any official description.
+
+# From Paul Eggert (2000-10-02):
+# Howse writes (p 157) `DBST' too, but `BDST' seems to have been common
+# and follows the more usual convention of putting the location name first,
+# so we use `BDST'.
+
+# Peter Ilieve (1998-04-19) described at length
+# the history of summer time legislation in the United Kingdom.
+# Since 1998 Joseph S. Myers has been updating
+# and extending this list, which can be found in
+# <a href="http://student.cusu.cam.ac.uk/~jsm28/british-time/">
+# History of legal time in Britain
+# </a>
+
+# From Joseph S. Myers (1998-01-06):
+#
+# The legal time in the UK outside of summer time is definitely GMT, not UTC;
+# see Lord Tanlaw's speech
+# <a href="http://www.parliament.the-stationery-office.co.uk/pa/ld199697/ldhansrd/pdvn/lds97/text/70611-20.htm#70611-20_head0">
+# (Lords Hansard 11 June 1997 columns 964 to 976)
+# </a>.
+
+# From Paul Eggert (2006-03-22):
+#
+# For lack of other data, follow Shanks & Pottenger for Eire in 1940-1948.
+#
+# Given Ilieve and Myers's data, the following claims by Shanks & Pottenger
+# are incorrect:
+#     * Wales did not switch from GMT to daylight saving time until
+#      1921 Apr 3, when they began to conform with the rest of Great Britain.
+# Actually, Wales was identical after 1880.
+#     * Eire had two transitions on 1916 Oct 1.
+# It actually just had one transition.
+#     * Northern Ireland used single daylight saving time throughout WW II.
+# Actually, it conformed to Britain.
+#     * GB-Eire changed standard time to 1 hour ahead of GMT on 1968-02-18.
+# Actually, that date saw the usual switch to summer time.
+# Standard time was not changed until 1968-10-27 (the clocks didn't change).
+#
+# Here is another incorrect claim by Shanks & Pottenger:
+#     * Jersey, Guernsey, and the Isle of Man did not switch from GMT
+#      to daylight saving time until 1921 Apr 3, when they began to
+#      conform with Great Britain.
+# S.R.&O. 1916, No. 382 and HO 45/10811/312364 (quoted above) say otherwise.
+#
+# The following claim by Shanks & Pottenger is possible though doubtful;
+# we'll ignore it for now.
+#     * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00.
+#
+#
+# Whitman says Dublin Mean Time was -0:25:21, which is more precise than
+# Shanks & Pottenger.
+# Perhaps this was Dunsink Observatory Time, as Dunsink Observatory
+# (8 km NW of Dublin's center) seemingly was to Dublin as Greenwich was
+# to London.  For example:
+#
+#   "Timeball on the ballast office is down.  Dunsink time."
+#   -- James Joyce, Ulysses
+
+# From Joseph S. Myers (2005-01-26):
+# Irish laws are available online at www.irishstatutebook.ie.  These include
+# various relating to legal time, for example:
+#
+# ZZA13Y1923.html ZZA12Y1924.html ZZA8Y1925.html ZZSIV20PG1267.html
+#
+# ZZSI71Y1947.html ZZSI128Y1948.html ZZSI23Y1949.html ZZSI41Y1950.html
+# ZZSI27Y1951.html ZZSI73Y1952.html
+#
+# ZZSI11Y1961.html ZZSI232Y1961.html ZZSI182Y1962.html
+# ZZSI167Y1963.html ZZSI257Y1964.html ZZSI198Y1967.html
+# ZZA23Y1968.html ZZA17Y1971.html
+#
+# ZZSI67Y1981.html ZZSI212Y1982.html ZZSI45Y1986.html
+# ZZSI264Y1988.html ZZSI52Y1990.html ZZSI371Y1992.html
+# ZZSI395Y1994.html ZZSI484Y1997.html ZZSI506Y2001.html
+#
+# [These are all relative to the root, e.g., the first is
+# <http://www.irishstatutebook.ie/ZZA13Y1923.html>.]
+#
+# (These are those I found, but there could be more.  In any case these
+# should allow various updates to the comments in the europe file to cover
+# the laws applicable in Ireland.)
+#
+# (Note that the time in the Republic of Ireland since 1968 has been defined
+# in terms of standard time being GMT+1 with a period of winter time when it
+# is GMT, rather than standard time being GMT with a period of summer time
+# being GMT+1.)
+
+# From Paul Eggert (1999-03-28):
+# Clive Feather (<news:859845706.26043.0@office.demon.net>, 1997-03-31)
+# reports that Folkestone (Cheriton) Shuttle Terminal uses Concession Time
+# (CT), equivalent to French civil time.
+# Julian Hill (<news:36118128.5A14@virgin.net>, 1998-09-30) reports that
+# trains between Dollands Moor (the freight facility next door)
+# and Frethun run in CT.
+# My admittedly uninformed guess is that the terminal has two authorities,
+# the French concession operators and the British civil authorities,
+# and that the time depends on who you're talking to.
+# If, say, the British police were called to the station for some reason,
+# I would expect the official police report to use GMT/BST and not CET/CEST.
+# This is a borderline case, but for now let's stick to GMT/BST.
+
+# From an anonymous contributor (1996-06-02):
+# The law governing time in Ireland is under Statutory Instrument SI 395/94,
+# which gives force to European Union 7th Council Directive # 94/21/EC.
+# Under this directive, the Minister for Justice in Ireland makes appropriate
+# regulations. I spoke this morning with the Secretary of the Department of
+# Justice (tel +353 1 678 9711) who confirmed to me that the correct name is
+# "Irish Summer Time", abbreviated to "IST".
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Summer Time Act, 1916
+Rule   GB-Eire 1916    only    -       May     21      2:00s   1:00    BST
+Rule   GB-Eire 1916    only    -       Oct      1      2:00s   0       GMT
+# S.R.&O. 1917, No. 358
+Rule   GB-Eire 1917    only    -       Apr      8      2:00s   1:00    BST
+Rule   GB-Eire 1917    only    -       Sep     17      2:00s   0       GMT
+# S.R.&O. 1918, No. 274
+Rule   GB-Eire 1918    only    -       Mar     24      2:00s   1:00    BST
+Rule   GB-Eire 1918    only    -       Sep     30      2:00s   0       GMT
+# S.R.&O. 1919, No. 297
+Rule   GB-Eire 1919    only    -       Mar     30      2:00s   1:00    BST
+Rule   GB-Eire 1919    only    -       Sep     29      2:00s   0       GMT
+# S.R.&O. 1920, No. 458
+Rule   GB-Eire 1920    only    -       Mar     28      2:00s   1:00    BST
+# S.R.&O. 1920, No. 1844
+Rule   GB-Eire 1920    only    -       Oct     25      2:00s   0       GMT
+# S.R.&O. 1921, No. 363
+Rule   GB-Eire 1921    only    -       Apr      3      2:00s   1:00    BST
+Rule   GB-Eire 1921    only    -       Oct      3      2:00s   0       GMT
+# S.R.&O. 1922, No. 264
+Rule   GB-Eire 1922    only    -       Mar     26      2:00s   1:00    BST
+Rule   GB-Eire 1922    only    -       Oct      8      2:00s   0       GMT
+# The Summer Time Act, 1922
+Rule   GB-Eire 1923    only    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1923    1924    -       Sep     Sun>=16 2:00s   0       GMT
+Rule   GB-Eire 1924    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1925    1926    -       Apr     Sun>=16 2:00s   1:00    BST
+# The Summer Time Act, 1925
+Rule   GB-Eire 1925    1938    -       Oct     Sun>=2  2:00s   0       GMT
+Rule   GB-Eire 1927    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1928    1929    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1930    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1931    1932    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1933    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1934    only    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1935    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1936    1937    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1938    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1939    only    -       Apr     Sun>=16 2:00s   1:00    BST
+# S.R.&O. 1939, No. 1379
+Rule   GB-Eire 1939    only    -       Nov     Sun>=16 2:00s   0       GMT
+# S.R.&O. 1940, No. 172 and No. 1883
+Rule   GB-Eire 1940    only    -       Feb     Sun>=23 2:00s   1:00    BST
+# S.R.&O. 1941, No. 476
+Rule   GB-Eire 1941    only    -       May     Sun>=2  1:00s   2:00    BDST
+Rule   GB-Eire 1941    1943    -       Aug     Sun>=9  1:00s   1:00    BST
+# S.R.&O. 1942, No. 506
+Rule   GB-Eire 1942    1944    -       Apr     Sun>=2  1:00s   2:00    BDST
+# S.R.&O. 1944, No. 932
+Rule   GB-Eire 1944    only    -       Sep     Sun>=16 1:00s   1:00    BST
+# S.R.&O. 1945, No. 312
+Rule   GB-Eire 1945    only    -       Apr     Mon>=2  1:00s   2:00    BDST
+Rule   GB-Eire 1945    only    -       Jul     Sun>=9  1:00s   1:00    BST
+# S.R.&O. 1945, No. 1208
+Rule   GB-Eire 1945    1946    -       Oct     Sun>=2  2:00s   0       GMT
+Rule   GB-Eire 1946    only    -       Apr     Sun>=9  2:00s   1:00    BST
+# The Summer Time Act, 1947
+Rule   GB-Eire 1947    only    -       Mar     16      2:00s   1:00    BST
+Rule   GB-Eire 1947    only    -       Apr     13      1:00s   2:00    BDST
+Rule   GB-Eire 1947    only    -       Aug     10      1:00s   1:00    BST
+Rule   GB-Eire 1947    only    -       Nov      2      2:00s   0       GMT
+# Summer Time Order, 1948 (S.I. 1948/495)
+Rule   GB-Eire 1948    only    -       Mar     14      2:00s   1:00    BST
+Rule   GB-Eire 1948    only    -       Oct     31      2:00s   0       GMT
+# Summer Time Order, 1949 (S.I. 1949/373)
+Rule   GB-Eire 1949    only    -       Apr      3      2:00s   1:00    BST
+Rule   GB-Eire 1949    only    -       Oct     30      2:00s   0       GMT
+# Summer Time Order, 1950 (S.I. 1950/518)
+# Summer Time Order, 1951 (S.I. 1951/430)
+# Summer Time Order, 1952 (S.I. 1952/451)
+Rule   GB-Eire 1950    1952    -       Apr     Sun>=14 2:00s   1:00    BST
+Rule   GB-Eire 1950    1952    -       Oct     Sun>=21 2:00s   0       GMT
+# revert to the rules of the Summer Time Act, 1925
+Rule   GB-Eire 1953    only    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1953    1960    -       Oct     Sun>=2  2:00s   0       GMT
+Rule   GB-Eire 1954    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1955    1956    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1957    only    -       Apr     Sun>=9  2:00s   1:00    BST
+Rule   GB-Eire 1958    1959    -       Apr     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1960    only    -       Apr     Sun>=9  2:00s   1:00    BST
+# Summer Time Order, 1961 (S.I. 1961/71)
+# Summer Time (1962) Order, 1961 (S.I. 1961/2465)
+# Summer Time Order, 1963 (S.I. 1963/81)
+Rule   GB-Eire 1961    1963    -       Mar     lastSun 2:00s   1:00    BST
+Rule   GB-Eire 1961    1968    -       Oct     Sun>=23 2:00s   0       GMT
+# Summer Time (1964) Order, 1963 (S.I. 1963/2101)
+# Summer Time Order, 1964 (S.I. 1964/1201)
+# Summer Time Order, 1967 (S.I. 1967/1148)
+Rule   GB-Eire 1964    1967    -       Mar     Sun>=19 2:00s   1:00    BST
+# Summer Time Order, 1968 (S.I. 1968/117)
+Rule   GB-Eire 1968    only    -       Feb     18      2:00s   1:00    BST
+# The British Standard Time Act, 1968
+#      (no summer time)
+# The Summer Time Act, 1972
+Rule   GB-Eire 1972    1980    -       Mar     Sun>=16 2:00s   1:00    BST
+Rule   GB-Eire 1972    1980    -       Oct     Sun>=23 2:00s   0       GMT
+# Summer Time Order, 1980 (S.I. 1980/1089)
+# Summer Time Order, 1982 (S.I. 1982/1673)
+# Summer Time Order, 1986 (S.I. 1986/223)
+# Summer Time Order, 1988 (S.I. 1988/931)
+Rule   GB-Eire 1981    1995    -       Mar     lastSun 1:00u   1:00    BST
+Rule   GB-Eire 1981    1989    -       Oct     Sun>=23 1:00u   0       GMT
+# Summer Time Order, 1989 (S.I. 1989/985)
+# Summer Time Order, 1992 (S.I. 1992/1729)
+# Summer Time Order 1994 (S.I. 1994/2798)
+Rule   GB-Eire 1990    1995    -       Oct     Sun>=22 1:00u   0       GMT
+# Summer Time Order 1997 (S.I. 1997/2982)
+# See EU for rules starting in 1996.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/London   -0:01:15 -      LMT     1847 Dec  1 0:00s
+                        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
+Link   Europe/London   Europe/Jersey
+Link   Europe/London   Europe/Guernsey
+Link   Europe/London   Europe/Isle_of_Man
+Zone   Europe/Dublin   -0:25:00 -      LMT     1880 Aug  2
+                       -0:25:21 -      DMT     1916 May 21 2:00
+                       -0:25:21 1:00   IST     1916 Oct  1 2:00s
+                        0:00   GB-Eire %s      1921 Dec  6 # independence
+                        0:00   GB-Eire GMT/IST 1940 Feb 25 2:00
+                        0:00   1:00    IST     1946 Oct  6 2:00
+                        0:00   -       GMT     1947 Mar 16 2:00
+                        0:00   1:00    IST     1947 Nov  2 2:00
+                        0:00   -       GMT     1948 Apr 18 2:00
+                        0:00   GB-Eire GMT/IST 1968 Oct 27
+                        1:00   -       IST     1971 Oct 31 2:00u
+                        0:00   GB-Eire GMT/IST 1996
+                        0:00   EU      GMT/IST
+
+###############################################################################
+
+# Continental Europe
+
+# EU rules are for the European Union, previously known as the EC, EEC,
+# Common Market, etc.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   EU      1977    1980    -       Apr     Sun>=1   1:00u  1:00    S
+Rule   EU      1977    only    -       Sep     lastSun  1:00u  0       -
+Rule   EU      1978    only    -       Oct      1       1:00u  0       -
+Rule   EU      1979    1995    -       Sep     lastSun  1:00u  0       -
+Rule   EU      1981    max     -       Mar     lastSun  1:00u  1:00    S
+Rule   EU      1996    max     -       Oct     lastSun  1:00u  0       -
+# The most recent directive covers the years starting in 2002.  See:
+# <a href="http://europa.eu.int/eur-lex/en/lif/dat/2000/en_300L0084.html"
+# Directive 2000/84/EC of the European Parliament and of the Council
+# of 19 January 2001 on summer-time arrangements.
+# </a>
+
+# W-Eur differs from EU only in that W-Eur uses standard time.
+Rule   W-Eur   1977    1980    -       Apr     Sun>=1   1:00s  1:00    S
+Rule   W-Eur   1977    only    -       Sep     lastSun  1:00s  0       -
+Rule   W-Eur   1978    only    -       Oct      1       1:00s  0       -
+Rule   W-Eur   1979    1995    -       Sep     lastSun  1:00s  0       -
+Rule   W-Eur   1981    max     -       Mar     lastSun  1:00s  1:00    S
+Rule   W-Eur   1996    max     -       Oct     lastSun  1:00s  0       -
+
+# Older C-Eur rules are for convenience in the tables.
+# From 1977 on, C-Eur differs from EU only in that C-Eur uses standard time.
+Rule   C-Eur   1916    only    -       Apr     30      23:00   1:00    S
+Rule   C-Eur   1916    only    -       Oct      1       1:00   0       -
+Rule   C-Eur   1917    1918    -       Apr     Mon>=15  2:00s  1:00    S
+Rule   C-Eur   1917    1918    -       Sep     Mon>=15  2:00s  0       -
+Rule   C-Eur   1940    only    -       Apr      1       2:00s  1:00    S
+Rule   C-Eur   1942    only    -       Nov      2       2:00s  0       -
+Rule   C-Eur   1943    only    -       Mar     29       2:00s  1:00    S
+Rule   C-Eur   1943    only    -       Oct      4       2:00s  0       -
+Rule   C-Eur   1944    only    -       Apr      3       2:00s  1:00    S
+# Whitman gives 1944 Oct 7; go with Shanks & Pottenger.
+Rule   C-Eur   1944    only    -       Oct      2       2:00s  0       -
+Rule   C-Eur   1977    1980    -       Apr     Sun>=1   2:00s  1:00    S
+Rule   C-Eur   1977    only    -       Sep     lastSun  2:00s  0       -
+Rule   C-Eur   1978    only    -       Oct      1       2:00s  0       -
+Rule   C-Eur   1979    1995    -       Sep     lastSun  2:00s  0       -
+Rule   C-Eur   1981    max     -       Mar     lastSun  2:00s  1:00    S
+Rule   C-Eur   1996    max     -       Oct     lastSun  2:00s  0       -
+
+# E-Eur differs from EU only in that E-Eur switches at midnight local time.
+Rule   E-Eur   1977    1980    -       Apr     Sun>=1   0:00   1:00    S
+Rule   E-Eur   1977    only    -       Sep     lastSun  0:00   0       -
+Rule   E-Eur   1978    only    -       Oct      1       0:00   0       -
+Rule   E-Eur   1979    1995    -       Sep     lastSun  0:00   0       -
+Rule   E-Eur   1981    max     -       Mar     lastSun  0:00   1:00    S
+Rule   E-Eur   1996    max     -       Oct     lastSun  0:00   0       -
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Russia  1917    only    -       Jul      1      23:00   1:00    MST     # Moscow Summer Time
+Rule   Russia  1917    only    -       Dec     28       0:00   0       MMT     # Moscow Mean Time
+Rule   Russia  1918    only    -       May     31      22:00   2:00    MDST    # Moscow Double Summer Time
+Rule   Russia  1918    only    -       Sep     16       1:00   1:00    MST
+Rule   Russia  1919    only    -       May     31      23:00   2:00    MDST
+Rule   Russia  1919    only    -       Jul      1       2:00   1:00    S
+Rule   Russia  1919    only    -       Aug     16       0:00   0       -
+Rule   Russia  1921    only    -       Feb     14      23:00   1:00    S
+Rule   Russia  1921    only    -       Mar     20      23:00   2:00    M # Midsummer
+Rule   Russia  1921    only    -       Sep      1       0:00   1:00    S
+Rule   Russia  1921    only    -       Oct      1       0:00   0       -
+# Act No.925 of the Council of Ministers of the USSR (1980-10-24):
+Rule   Russia  1981    1984    -       Apr      1       0:00   1:00    S
+Rule   Russia  1981    1983    -       Oct      1       0:00   0       -
+# Act No.967 of the Council of Ministers of the USSR (1984-09-13), repeated in
+# Act No.227 of the Council of Ministers of the USSR (1989-03-14):
+Rule   Russia  1984    1991    -       Sep     lastSun  2:00s  0       -
+Rule   Russia  1985    1991    -       Mar     lastSun  2:00s  1:00    S
+#
+Rule   Russia  1992    only    -       Mar     lastSat  23:00  1:00    S
+Rule   Russia  1992    only    -       Sep     lastSat  23:00  0       -
+Rule   Russia  1993    max     -       Mar     lastSun  2:00s  1:00    S
+Rule   Russia  1993    1995    -       Sep     lastSun  2:00s  0       -
+Rule   Russia  1996    max     -       Oct     lastSun  2:00s  0       -
+
+# These are for backward compatibility with older versions.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   WET             0:00    EU      WE%sT
+Zone   CET             1:00    C-Eur   CE%sT
+Zone   MET             1:00    C-Eur   ME%sT
+Zone   EET             2:00    EU      EE%sT
+
+# Previous editions of this database used abbreviations like MET DST
+# for Central European Summer Time, but this didn't agree with common usage.
+
+# From Markus Kuhn (1996-07-12):
+# The official German names ... are
+#
+#      Mitteleuropaeische Zeit (MEZ)         = UTC+01:00
+#      Mitteleuropaeische Sommerzeit (MESZ)  = UTC+02:00
+#
+# as defined in the German Time Act (Gesetz ueber die Zeitbestimmung (ZeitG),
+# 1978-07-25, Bundesgesetzblatt, Jahrgang 1978, Teil I, S. 1110-1111)....
+# I wrote ... to the German Federal Physical-Technical Institution
+#
+#      Physikalisch-Technische Bundesanstalt (PTB)
+#      Laboratorium 4.41 "Zeiteinheit"
+#      Postfach 3345
+#      D-38023 Braunschweig
+#      phone: +49 531 592-0
+#
+# ... I received today an answer letter from Dr. Peter Hetzel, head of the PTB
+# department for time and frequency transmission.  He explained that the
+# PTB translates MEZ and MESZ into English as
+#
+#      Central European Time (CET)         = UTC+01:00
+#      Central European Summer Time (CEST) = UTC+02:00
+
+
+# Albania
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Albania 1940    only    -       Jun     16      0:00    1:00    S
+Rule   Albania 1942    only    -       Nov      2      3:00    0       -
+Rule   Albania 1943    only    -       Mar     29      2:00    1:00    S
+Rule   Albania 1943    only    -       Apr     10      3:00    0       -
+Rule   Albania 1974    only    -       May      4      0:00    1:00    S
+Rule   Albania 1974    only    -       Oct      2      0:00    0       -
+Rule   Albania 1975    only    -       May      1      0:00    1:00    S
+Rule   Albania 1975    only    -       Oct      2      0:00    0       -
+Rule   Albania 1976    only    -       May      2      0:00    1:00    S
+Rule   Albania 1976    only    -       Oct      3      0:00    0       -
+Rule   Albania 1977    only    -       May      8      0:00    1:00    S
+Rule   Albania 1977    only    -       Oct      2      0:00    0       -
+Rule   Albania 1978    only    -       May      6      0:00    1:00    S
+Rule   Albania 1978    only    -       Oct      1      0:00    0       -
+Rule   Albania 1979    only    -       May      5      0:00    1:00    S
+Rule   Albania 1979    only    -       Sep     30      0:00    0       -
+Rule   Albania 1980    only    -       May      3      0:00    1:00    S
+Rule   Albania 1980    only    -       Oct      4      0:00    0       -
+Rule   Albania 1981    only    -       Apr     26      0:00    1:00    S
+Rule   Albania 1981    only    -       Sep     27      0:00    0       -
+Rule   Albania 1982    only    -       May      2      0:00    1:00    S
+Rule   Albania 1982    only    -       Oct      3      0:00    0       -
+Rule   Albania 1983    only    -       Apr     18      0:00    1:00    S
+Rule   Albania 1983    only    -       Oct      1      0:00    0       -
+Rule   Albania 1984    only    -       Apr      1      0:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Tirane   1:19:20 -       LMT     1914
+                       1:00    -       CET     1940 Jun 16
+                       1:00    Albania CE%sT   1984 Jul
+                       1:00    EU      CE%sT
+
+# Andorra
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Andorra  0:06:04 -       LMT     1901
+                       0:00    -       WET     1946 Sep 30
+                       1:00    -       CET     1985 Mar 31 2:00
+                       1:00    EU      CE%sT
+
+# Austria
+
+# From Paul Eggert (2006-03-22): Shanks & Pottenger give 1918-06-16 and
+# 1945-11-18, but the Austrian Federal Office of Metrology and
+# Surveying (BEV) gives 1918-09-16 and for Vienna gives the "alleged"
+# date of 1945-04-12 with no time.  For the 1980-04-06 transition
+# Shanks & Pottenger give 02:00, the BEV 00:00.  Go with the BEV,
+# and guess 02:00 for 1945-04-12.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Austria 1920    only    -       Apr      5      2:00s   1:00    S
+Rule   Austria 1920    only    -       Sep     13      2:00s   0       -
+Rule   Austria 1946    only    -       Apr     14      2:00s   1:00    S
+Rule   Austria 1946    1948    -       Oct     Sun>=1  2:00s   0       -
+Rule   Austria 1947    only    -       Apr      6      2:00s   1:00    S
+Rule   Austria 1948    only    -       Apr     18      2:00s   1:00    S
+Rule   Austria 1980    only    -       Apr      6      0:00    1:00    S
+Rule   Austria 1980    only    -       Sep     28      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Vienna   1:05:20 -       LMT     1893 Apr
+                       1:00    C-Eur   CE%sT   1920
+                       1:00    Austria CE%sT   1940 Apr  1 2:00s
+                       1:00    C-Eur   CE%sT   1945 Apr  2 2:00s
+                       1:00    1:00    CEST    1945 Apr 12 2:00s
+                       1:00    -       CET     1946
+                       1:00    Austria CE%sT   1981
+                       1:00    EU      CE%sT
+
+# Belarus
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Minsk    1:50:16 -       LMT     1880
+                       1:50    -       MMT     1924 May 2 # Minsk Mean Time
+                       2:00    -       EET     1930 Jun 21
+                       3:00    -       MSK     1941 Jun 28
+                       1:00    C-Eur   CE%sT   1944 Jul  3
+                       3:00    Russia  MSK/MSD 1990
+                       3:00    -       MSK     1991 Mar 31 2:00s
+                       2:00    1:00    EEST    1991 Sep 29 2:00s
+                       2:00    -       EET     1992 Mar 29 0:00s
+                       2:00    1:00    EEST    1992 Sep 27 0:00s
+                       2:00    Russia  EE%sT
+
+# Belgium
+#
+# From Paul Eggert (1997-07-02):
+# Entries from 1918 through 1991 are taken from:
+#      Annuaire de L'Observatoire Royal de Belgique,
+#      Avenue Circulaire, 3, B-1180 BRUXELLES, CLVIIe annee, 1991
+#      (Imprimerie HAYEZ, s.p.r.l., Rue Fin, 4, 1080 BRUXELLES, MCMXC),
+#      pp 8-9.
+# LMT before 1892 was 0:17:30, according to the official journal of Belgium:
+#      Moniteur Belge, Samedi 30 Avril 1892, N.121.
+# Thanks to Pascal Delmoitie for these references.
+# The 1918 rules are listed for completeness; they apply to unoccupied Belgium.
+# Assume Brussels switched to WET in 1918 when the armistice took effect.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Belgium 1918    only    -       Mar      9       0:00s  1:00    S
+Rule   Belgium 1918    1919    -       Oct     Sat>=1  23:00s  0       -
+Rule   Belgium 1919    only    -       Mar      1      23:00s  1:00    S
+Rule   Belgium 1920    only    -       Feb     14      23:00s  1:00    S
+Rule   Belgium 1920    only    -       Oct     23      23:00s  0       -
+Rule   Belgium 1921    only    -       Mar     14      23:00s  1:00    S
+Rule   Belgium 1921    only    -       Oct     25      23:00s  0       -
+Rule   Belgium 1922    only    -       Mar     25      23:00s  1:00    S
+Rule   Belgium 1922    1927    -       Oct     Sat>=1  23:00s  0       -
+Rule   Belgium 1923    only    -       Apr     21      23:00s  1:00    S
+Rule   Belgium 1924    only    -       Mar     29      23:00s  1:00    S
+Rule   Belgium 1925    only    -       Apr      4      23:00s  1:00    S
+# DSH writes that a royal decree of 1926-02-22 specified the Sun following 3rd
+# Sat in Apr (except if it's Easter, in which case it's one Sunday earlier),
+# to Sun following 1st Sat in Oct, and that a royal decree of 1928-09-15
+# changed the transition times to 02:00 GMT.
+Rule   Belgium 1926    only    -       Apr     17      23:00s  1:00    S
+Rule   Belgium 1927    only    -       Apr      9      23:00s  1:00    S
+Rule   Belgium 1928    only    -       Apr     14      23:00s  1:00    S
+Rule   Belgium 1928    1938    -       Oct     Sun>=2   2:00s  0       -
+Rule   Belgium 1929    only    -       Apr     21       2:00s  1:00    S
+Rule   Belgium 1930    only    -       Apr     13       2:00s  1:00    S
+Rule   Belgium 1931    only    -       Apr     19       2:00s  1:00    S
+Rule   Belgium 1932    only    -       Apr      3       2:00s  1:00    S
+Rule   Belgium 1933    only    -       Mar     26       2:00s  1:00    S
+Rule   Belgium 1934    only    -       Apr      8       2:00s  1:00    S
+Rule   Belgium 1935    only    -       Mar     31       2:00s  1:00    S
+Rule   Belgium 1936    only    -       Apr     19       2:00s  1:00    S
+Rule   Belgium 1937    only    -       Apr      4       2:00s  1:00    S
+Rule   Belgium 1938    only    -       Mar     27       2:00s  1:00    S
+Rule   Belgium 1939    only    -       Apr     16       2:00s  1:00    S
+Rule   Belgium 1939    only    -       Nov     19       2:00s  0       -
+Rule   Belgium 1940    only    -       Feb     25       2:00s  1:00    S
+Rule   Belgium 1944    only    -       Sep     17       2:00s  0       -
+Rule   Belgium 1945    only    -       Apr      2       2:00s  1:00    S
+Rule   Belgium 1945    only    -       Sep     16       2:00s  0       -
+Rule   Belgium 1946    only    -       May     19       2:00s  1:00    S
+Rule   Belgium 1946    only    -       Oct      7       2:00s  0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Brussels 0:17:30 -       LMT     1880
+                       0:17:30 -       BMT     1892 May  1 12:00 # Brussels MT
+                       0:00    -       WET     1914 Nov  8
+                       1:00    -       CET     1916 May  1  0:00
+                       1:00    C-Eur   CE%sT   1918 Nov 11 11:00u
+                       0:00    Belgium WE%sT   1940 May 20  2:00s
+                       1:00    C-Eur   CE%sT   1944 Sep  3
+                       1:00    Belgium CE%sT   1977
+                       1:00    EU      CE%sT
+
+# Bosnia and Herzegovina
+# see Serbia
+
+# Bulgaria
+#
+# From Plamen Simenov via Steffen Thorsen (1999-09-09):
+# A document of Government of Bulgaria (No.94/1997) says:
+# EET --> EETDST is in 03:00 Local time in last Sunday of March ...
+# EETDST --> EET is in 04:00 Local time in last Sunday of October
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Bulg    1979    only    -       Mar     31      23:00   1:00    S
+Rule   Bulg    1979    only    -       Oct      1       1:00   0       -
+Rule   Bulg    1980    1982    -       Apr     Sat>=1  23:00   1:00    S
+Rule   Bulg    1980    only    -       Sep     29       1:00   0       -
+Rule   Bulg    1981    only    -       Sep     27       2:00   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Sofia    1:33:16 -       LMT     1880
+                       1:56:56 -       IMT     1894 Nov 30 # Istanbul MT?
+                       2:00    -       EET     1942 Nov  2  3:00
+                       1:00    C-Eur   CE%sT   1945 Apr  2  3:00
+                       2:00    -       EET     1979 Mar 31 23:00
+                       2:00    Bulg    EE%sT   1982 Sep 26  2:00
+                       2:00    C-Eur   EE%sT   1991
+                       2:00    E-Eur   EE%sT   1997
+                       2:00    EU      EE%sT
+
+# Croatia
+# see Serbia
+
+# Cyprus
+# Please see the `asia' file for Asia/Nicosia.
+
+# Czech Republic
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Czech   1945    only    -       Apr      8      2:00s   1:00    S
+Rule   Czech   1945    only    -       Nov     18      2:00s   0       -
+Rule   Czech   1946    only    -       May      6      2:00s   1:00    S
+Rule   Czech   1946    1949    -       Oct     Sun>=1  2:00s   0       -
+Rule   Czech   1947    only    -       Apr     20      2:00s   1:00    S
+Rule   Czech   1948    only    -       Apr     18      2:00s   1:00    S
+Rule   Czech   1949    only    -       Apr      9      2:00s   1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Prague   0:57:44 -       LMT     1850
+                       0:57:44 -       PMT     1891 Oct     # Prague Mean Time
+                       1:00    C-Eur   CE%sT   1944 Sep 17 2:00s
+                       1:00    Czech   CE%sT   1979
+                       1:00    EU      CE%sT
+
+# Denmark, Faroe Islands, and Greenland
+
+# From Jesper Norgaard Welen (2005-04-26):
+# http://www.hum.aau.dk/~poe/tid/tine/DanskTid.htm says that the law
+# [introducing standard time] was in effect from 1894-01-01....
+# The page http://www.retsinfo.dk/_GETDOCI_/ACCN/A18930008330-REGL
+# confirms this, and states that the law was put forth 1893-03-29.
+#
+# The EU treaty with effect from 1973:
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19722110030-REGL
+#
+# This provoked a new law from 1974 to make possible summer time changes
+# in subsequenet decrees with the law
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/A19740022330-REGL
+#
+# It seems however that no decree was set forward until 1980.  I have
+# not found any decree, but in another related law, the effecting DST
+# changes are stated explicitly to be from 1980-04-06 at 02:00 to
+# 1980-09-28 at 02:00.  If this is true, this differs slightly from
+# the EU rule in that DST runs to 02:00, not 03:00.  We don't know
+# when Denmark began using the EU rule correctly, but we have only
+# confirmation of the 1980-time, so I presume it was correct in 1981:
+# The law is about the management of the extra hour, concerning
+# working hours reported and effect on obligatory-rest rules (which
+# was suspended on that night):
+# http://www.retsinfo.dk/_GETDOCI_/ACCN/C19801120554-REGL
+
+# From Jesper Norgaard Welen (2005-06-11):
+# The Herning Folkeblad (1980-09-26) reported that the night between
+# Saturday and Sunday the clock is set back from three to two.
+
+# From Paul Eggert (2005-06-11):
+# Hence the "02:00" of the 1980 law refers to standard time, not
+# wall-clock time, and so the EU rules were in effect in 1980.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Denmark 1916    only    -       May     14      23:00   1:00    S
+Rule   Denmark 1916    only    -       Sep     30      23:00   0       -
+Rule   Denmark 1940    only    -       May     15       0:00   1:00    S
+Rule   Denmark 1945    only    -       Apr      2       2:00s  1:00    S
+Rule   Denmark 1945    only    -       Aug     15       2:00s  0       -
+Rule   Denmark 1946    only    -       May      1       2:00s  1:00    S
+Rule   Denmark 1946    only    -       Sep      1       2:00s  0       -
+Rule   Denmark 1947    only    -       May      4       2:00s  1:00    S
+Rule   Denmark 1947    only    -       Aug     10       2:00s  0       -
+Rule   Denmark 1948    only    -       May      9       2:00s  1:00    S
+Rule   Denmark 1948    only    -       Aug      8       2:00s  0       -
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Copenhagen  0:50:20 -      LMT     1890
+                        0:50:20 -      CMT     1894 Jan  1 # Copenhagen MT
+                        1:00   Denmark CE%sT   1942 Nov  2 2:00s
+                        1:00   C-Eur   CE%sT   1945 Apr  2 2:00
+                        1:00   Denmark CE%sT   1980
+                        1:00   EU      CE%sT
+Zone Atlantic/Faroe    -0:27:04 -      LMT     1908 Jan 11     # Torshavn
+                        0:00   -       WET     1981
+                        0:00   EU      WE%sT
+#
+# From Paul Eggert (2004-10-31):
+# During World War II, Germany maintained secret manned weather stations in
+# East Greenland and Franz Josef Land, but we don't know their time zones.
+# My source for this is Wilhelm Dege's book mentioned under Svalbard.
+#
+# From Paul Eggert (2006-03-22):
+# Greenland joined the EU as part of Denmark, obtained home rule on 1979-05-01,
+# and left the EU on 1985-02-01.  It therefore should have been using EU
+# rules at least through 1984.  Shanks & Pottenger say Scoresbysund and Godthab
+# used C-Eur rules after 1980, but IATA SSIM (1991/1996) says they use EU
+# rules since at least 1991.  Assume EU rules since 1980.
+
+# From Gwillin Law (2001-06-06), citing
+# <http://www.statkart.no/efs/efshefter/2001/efs5-2001.pdf> (2001-03-15),
+# and with translations corrected by Steffen Thorsen:
+#
+# Greenland has four local times, and the relation to UTC
+# is according to the following time line:
+#
+# The military zone near Thule UTC-4
+# Standard Greenland time      UTC-3
+# Scoresbysund                 UTC-1
+# Danmarkshavn                 UTC
+#
+# In the military area near Thule and in Danmarkshavn DST will not be
+# introduced.
+
+# From Rives McDow (2001-11-01):
+#
+# I correspond regularly with the Dansk Polarcenter, and wrote them at
+# the time to clarify the situation in Thule.  Unfortunately, I have
+# not heard back from them regarding my recent letter.  [But I have
+# info from earlier correspondence.]
+#
+# According to the center, a very small local time zone around Thule
+# Air Base keeps the time according to UTC-4, implementing daylight
+# savings using North America rules, changing the time at 02:00 local time....
+#
+# The east coast of Greenland north of the community of Scoresbysund
+# uses UTC in the same way as in Iceland, year round, with no dst.
+# There are just a few stations on this coast, including the
+# Danmarkshavn ICAO weather station mentioned in your September 29th
+# email.  The other stations are two sledge patrol stations in
+# Mestersvig and Daneborg, the air force base at Station Nord, and the
+# DPC research station at Zackenberg.
+#
+# Scoresbysund and two small villages nearby keep time UTC-1 and use
+# the same daylight savings time period as in West Greenland (Godthab).
+#
+# The rest of Greenland, including Godthab (this area, although it
+# includes central Greenland, is known as west Greenland), keeps time
+# UTC-3, with daylight savings methods according to European rules.
+#
+# It is common procedure to use UTC 0 in the wilderness of East and
+# North Greenland, because it is mainly Icelandic aircraft operators
+# maintaining traffic in these areas.  However, the official status of
+# this area is that it sticks with Godthab time.  This area might be
+# considered a dual time zone in some respects because of this.
+
+# From Rives McDow (2001-11-19):
+# I heard back from someone stationed at Thule; the time change took place
+# there at 2:00 AM.
+
+# From Paul Eggert (2006-03-22):
+# From 1997 on the CIA map shows Danmarkshavn on GMT;
+# the 1995 map as like Godthab.
+# For lack of better info, assume they were like Godthab before 1996.
+# startkart.no says Thule does not observe DST, but this is clearly an error,
+# so go with Shanks & Pottenger for Thule transitions until this year.
+# For 2007 on assume Thule will stay in sync with US DST rules.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Thule   1991    1992    -       Mar     lastSun 2:00    1:00    D
+Rule   Thule   1991    1992    -       Sep     lastSun 2:00    0       S
+Rule   Thule   1993    2006    -       Apr     Sun>=1  2:00    1:00    D
+Rule   Thule   1993    2006    -       Oct     lastSun 2:00    0       S
+Rule   Thule   2007    max     -       Mar     Sun>=8  2:00    1:00    D
+Rule   Thule   2007    max     -       Nov     Sun>=1  2:00    0       S
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Danmarkshavn -1:14:40 -   LMT     1916 Jul 28
+                       -3:00   -       WGT     1980 Apr  6 2:00
+                       -3:00   EU      WG%sT   1996
+                       0:00    -       GMT
+Zone America/Scoresbysund -1:27:52 -   LMT     1916 Jul 28 # Ittoqqortoormiit
+                       -2:00   -       CGT     1980 Apr  6 2:00
+                       -2:00   C-Eur   CG%sT   1981 Mar 29
+                       -1:00   EU      EG%sT
+Zone America/Godthab   -3:26:56 -      LMT     1916 Jul 28 # Nuuk
+                       -3:00   -       WGT     1980 Apr  6 2:00
+                       -3:00   EU      WG%sT
+Zone America/Thule     -4:35:08 -      LMT     1916 Jul 28 # Pituffik air base
+                       -4:00   Thule   A%sT
+
+# Estonia
+# From Peter Ilieve (1994-10-15):
+# A relative in Tallinn confirms the accuracy of the data for 1989 onwards
+# [through 1994] and gives the legal authority for it,
+# a regulation of the Government of Estonia, No. 111 of 1989....
+#
+# From Peter Ilieve (1996-10-28):
+# [IATA SSIM (1992/1996) claims that the Baltic republics switch at 01:00s,
+# but a relative confirms that Estonia still switches at 02:00s, writing:]
+# ``I do not [know] exactly but there are some little different
+# (confusing) rules for International Air and Railway Transport Schedules
+# conversion in Sunday connected with end of summer time in Estonia....
+# A discussion is running about the summer time efficiency and effect on
+# human physiology.  It seems that Estonia maybe will not change to
+# summer time next spring.''
+
+# From Peter Ilieve (1998-11-04), heavily edited:
+# <a href="http://trip.rk.ee/cgi-bin/thw?${BASE}=akt&${OOHTML}=rtd&TA=1998&TO=1&AN=1390">
+# The 1998-09-22 Estonian time law
+# </a>
+# refers to the Eighth Directive and cites the association agreement between
+# the EU and Estonia, ratified by the Estonian law (RT II 1995, 22--27, 120).
+#
+# I also asked [my relative] whether they use any standard abbreviation
+# for their standard and summer times. He says no, they use "suveaeg"
+# (summer time) and "talveaeg" (winter time).
+
+# From <a href="http://www.baltictimes.com/">The Baltic Times</a> (1999-09-09)
+# via Steffen Thorsen:
+# This year will mark the last time Estonia shifts to summer time,
+# a council of the ruling coalition announced Sept. 6....
+# But what this could mean for Estonia's chances of joining the European
+# Union are still unclear.  In 1994, the EU declared summer time compulsory
+# for all member states until 2001.  Brussels has yet to decide what to do
+# after that.
+
+# From Mart Oruaas (2000-01-29):
+# Regulation no. 301 (1999-10-12) obsoletes previous regulation
+# no. 206 (1998-09-22) and thus sticks Estonia to +02:00 GMT for all
+# the year round.  The regulation is effective 1999-11-01.
+
+# From Toomas Soome (2002-02-21):
+# The Estonian government has changed once again timezone politics.
+# Now we are using again EU rules.
+#
+# From Urmet Jaanes (2002-03-28):
+# The legislative reference is Government decree No. 84 on 2002-02-21.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Tallinn  1:39:00 -       LMT     1880
+                       1:39:00 -       TMT     1918 Feb # Tallinn Mean Time
+                       1:00    C-Eur   CE%sT   1919 Jul
+                       1:39:00 -       TMT     1921 May
+                       2:00    -       EET     1940 Aug  6
+                       3:00    -       MSK     1941 Sep 15
+                       1:00    C-Eur   CE%sT   1944 Sep 22
+                       3:00    Russia  MSK/MSD 1989 Mar 26 2:00s
+                       2:00    1:00    EEST    1989 Sep 24 2:00s
+                       2:00    C-Eur   EE%sT   1998 Sep 22
+                       2:00    EU      EE%sT   1999 Nov  1
+                       2:00    -       EET     2002 Feb 21
+                       2:00    EU      EE%sT
+
+# Finland
+#
+# From Hannu Strang (1994-09-25 06:03:37 UTC):
+# Well, here in Helsinki we're just changing from summer time to regular one,
+# and it's supposed to change at 4am...
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say Finland has switched at 02:00 standard time
+# since 1981.  Go with Strang instead.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Finland 1942    only    -       Apr     3       0:00    1:00    S
+Rule   Finland 1942    only    -       Oct     3       0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Helsinki 1:39:52 -       LMT     1878 May 31
+                       1:39:52 -       HMT     1921 May    # Helsinki Mean Time
+                       2:00    Finland EE%sT   1981 Mar 29 2:00
+                       2:00    EU      EE%sT
+
+# Aaland Is
+Link   Europe/Helsinki Europe/Mariehamn
+
+
+# France
+
+# From Ciro Discepolo (2000-12-20):
+#
+# Henri Le Corre, Regimes Horaires pour le monde entier, Editions
+# Traditionnelles - Paris 2 books, 1993
+#
+# Gabriel, Traite de l'heure dans le monde, Guy Tredaniel editeur,
+# Paris, 1991
+#
+# Francoise Gauquelin, Problemes de l'heure resolus en astrologie,
+# Guy tredaniel, Paris 1987
+
+
+#
+# Shank & Pottenger seem to use `24:00' ambiguously; resolve it with Whitman.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   France  1916    only    -       Jun     14      23:00s  1:00    S
+Rule   France  1916    1919    -       Oct     Sun>=1  23:00s  0       -
+Rule   France  1917    only    -       Mar     24      23:00s  1:00    S
+Rule   France  1918    only    -       Mar      9      23:00s  1:00    S
+Rule   France  1919    only    -       Mar      1      23:00s  1:00    S
+Rule   France  1920    only    -       Feb     14      23:00s  1:00    S
+Rule   France  1920    only    -       Oct     23      23:00s  0       -
+Rule   France  1921    only    -       Mar     14      23:00s  1:00    S
+Rule   France  1921    only    -       Oct     25      23:00s  0       -
+Rule   France  1922    only    -       Mar     25      23:00s  1:00    S
+# DSH writes that a law of 1923-05-24 specified 3rd Sat in Apr at 23:00 to 1st
+# Sat in Oct at 24:00; and that in 1930, because of Easter, the transitions
+# were Apr 12 and Oct 5.  Go with Shanks & Pottenger.
+Rule   France  1922    1938    -       Oct     Sat>=1  23:00s  0       -
+Rule   France  1923    only    -       May     26      23:00s  1:00    S
+Rule   France  1924    only    -       Mar     29      23:00s  1:00    S
+Rule   France  1925    only    -       Apr      4      23:00s  1:00    S
+Rule   France  1926    only    -       Apr     17      23:00s  1:00    S
+Rule   France  1927    only    -       Apr      9      23:00s  1:00    S
+Rule   France  1928    only    -       Apr     14      23:00s  1:00    S
+Rule   France  1929    only    -       Apr     20      23:00s  1:00    S
+Rule   France  1930    only    -       Apr     12      23:00s  1:00    S
+Rule   France  1931    only    -       Apr     18      23:00s  1:00    S
+Rule   France  1932    only    -       Apr      2      23:00s  1:00    S
+Rule   France  1933    only    -       Mar     25      23:00s  1:00    S
+Rule   France  1934    only    -       Apr      7      23:00s  1:00    S
+Rule   France  1935    only    -       Mar     30      23:00s  1:00    S
+Rule   France  1936    only    -       Apr     18      23:00s  1:00    S
+Rule   France  1937    only    -       Apr      3      23:00s  1:00    S
+Rule   France  1938    only    -       Mar     26      23:00s  1:00    S
+Rule   France  1939    only    -       Apr     15      23:00s  1:00    S
+Rule   France  1939    only    -       Nov     18      23:00s  0       -
+Rule   France  1940    only    -       Feb     25       2:00   1:00    S
+# The French rules for 1941-1944 were not used in Paris, but Shanks & Pottenger
+# write that they were used in Monaco and in many French locations.
+# Le Corre writes that the upper limit of the free zone was Arneguy, Orthez,
+# Mont-de-Marsan, Bazas, Langon, Lamotte-Montravel, Marouil, La
+# Rochefoucault, Champagne-Mouton, La Roche-Posay, La Haye-Decartes,
+# Loches, Montrichard, Vierzon, Bourges, Moulins, Digoin,
+# Paray-le-Monial, Montceau-les-Mines, Chalons-sur-Saone, Arbois,
+# Dole, Morez, St-Claude, and Collognes (Haute-Savioe).
+Rule   France  1941    only    -       May      5       0:00   2:00    M # Midsummer
+# Shanks & Pottenger say this transition occurred at Oct 6 1:00,
+# but go with Denis Excoffier (1997-12-12),
+# who quotes the Ephemerides Astronomiques for 1998 from Bureau des Longitudes
+# as saying 5/10/41 22hUT.
+Rule   France  1941    only    -       Oct      6       0:00   1:00    S
+Rule   France  1942    only    -       Mar      9       0:00   2:00    M
+Rule   France  1942    only    -       Nov      2       3:00   1:00    S
+Rule   France  1943    only    -       Mar     29       2:00   2:00    M
+Rule   France  1943    only    -       Oct      4       3:00   1:00    S
+Rule   France  1944    only    -       Apr      3       2:00   2:00    M
+Rule   France  1944    only    -       Oct      8       1:00   1:00    S
+Rule   France  1945    only    -       Apr      2       2:00   2:00    M
+Rule   France  1945    only    -       Sep     16       3:00   0       -
+# Shanks & Pottenger give Mar 28 2:00 and Sep 26 3:00;
+# go with Excoffier's 28/3/76 0hUT and 25/9/76 23hUT.
+Rule   France  1976    only    -       Mar     28       1:00   1:00    S
+Rule   France  1976    only    -       Sep     26       1:00   0       -
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time, and Whitman 0:09:05,
+# but Howse quotes the actual French legislation as saying 0:09:21.
+# Go with Howse.  Howse writes that the time in France was officially based
+# on PMT-0:09:21 until 1978-08-09, when the time base finally switched to UTC.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Paris    0:09:21 -       LMT     1891 Mar 15  0:01
+                       0:09:21 -       PMT     1911 Mar 11  0:01  # Paris MT
+# Shanks & Pottenger give 1940 Jun 14 0:00; go with Excoffier and Le Corre.
+                       0:00    France  WE%sT   1940 Jun 14 23:00
+# Le Corre says Paris stuck with occupied-France time after the liberation;
+# go with Shanks & Pottenger.
+                       1:00    C-Eur   CE%sT   1944 Aug 25
+                       0:00    France  WE%sT   1945 Sep 16  3:00
+                       1:00    France  CE%sT   1977
+                       1:00    EU      CE%sT
+
+# Germany
+
+# From Markus Kuhn (1998-09-29):
+# The German time zone web site by the Physikalisch-Technische
+# Bundesanstalt contains DST information back to 1916.
+# [See tz-link.htm for the URL.]
+
+# From Joerg Schilling (2002-10-23):
+# In 1945, Berlin was switched to Moscow Summer time (GMT+4) by <a
+# href="http://www.dhm.de/lemo/html/biografien/BersarinNikolai/">
+# General [Nikolai] Bersarin</a>.
+
+# From Paul Eggert (2003-03-08):
+# <a href="http://www.parlament-berlin.de/pds-fraktion.nsf/727459127c8b66ee8525662300459099/defc77cb784f180ac1256c2b0030274b/$FILE/bersarint.pdf">
+# says that Bersarin issued an order to use Moscow time on May 20.
+# However, Moscow did not observe daylight saving in 1945, so
+# this was equivalent to CEMT (GMT+3), not GMT+4.
+
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Germany 1945    only    -       Apr      2      2:00s   1:00    S
+Rule   Germany 1945    only    -       May     24      2:00    2:00    M # Midsummer
+Rule   Germany 1945    only    -       Sep     24      3:00    1:00    S
+Rule   Germany 1945    only    -       Nov     18      2:00s   0       -
+Rule   Germany 1946    only    -       Apr     14      2:00s   1:00    S
+Rule   Germany 1946    only    -       Oct      7      2:00s   0       -
+Rule   Germany 1947    1949    -       Oct     Sun>=1  2:00s   0       -
+Rule   Germany 1947    only    -       Apr      6      2:00s   1:00    S
+Rule   Germany 1947    only    -       May     11      2:00s   2:00    M
+Rule   Germany 1947    only    -       Jun     29      3:00    1:00    S
+Rule   Germany 1948    only    -       Apr     18      2:00s   1:00    S
+Rule   Germany 1949    only    -       Apr     10      2:00s   1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Berlin   0:53:28 -       LMT     1893 Apr
+                       1:00    C-Eur   CE%sT   1945 Apr 2 2:00
+                       1:00    Germany CE%sT   1980
+                       1:00    EU      CE%sT
+
+# Georgia
+# Please see the "asia" file for Asia/Tbilisi.
+# Herodotus (Histories, IV.45) says Georgia north of the Phasis (now Rioni)
+# is in Europe.  Our reference location Tbilisi is in the Asian part.
+
+# Gibraltar
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Gibraltar  -0:21:24 -      LMT     1880 Aug  2 0:00s
+                       0:00    GB-Eire %s      1957 Apr 14 2:00
+                       1:00    -       CET     1982
+                       1:00    EU      CE%sT
+
+# Greece
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Whitman gives 1932 Jul 5 - Nov 1; go with Shanks & Pottenger.
+Rule   Greece  1932    only    -       Jul      7      0:00    1:00    S
+Rule   Greece  1932    only    -       Sep      1      0:00    0       -
+# Whitman gives 1941 Apr 25 - ?; go with Shanks & Pottenger.
+Rule   Greece  1941    only    -       Apr      7      0:00    1:00    S
+# Whitman gives 1942 Feb 2 - ?; go with Shanks & Pottenger.
+Rule   Greece  1942    only    -       Nov      2      3:00    0       -
+Rule   Greece  1943    only    -       Mar     30      0:00    1:00    S
+Rule   Greece  1943    only    -       Oct      4      0:00    0       -
+# Whitman gives 1944 Oct 3 - Oct 31; go with Shanks & Pottenger.
+Rule   Greece  1952    only    -       Jul      1      0:00    1:00    S
+Rule   Greece  1952    only    -       Nov      2      0:00    0       -
+Rule   Greece  1975    only    -       Apr     12      0:00s   1:00    S
+Rule   Greece  1975    only    -       Nov     26      0:00s   0       -
+Rule   Greece  1976    only    -       Apr     11      2:00s   1:00    S
+Rule   Greece  1976    only    -       Oct     10      2:00s   0       -
+Rule   Greece  1977    1978    -       Apr     Sun>=1  2:00s   1:00    S
+Rule   Greece  1977    only    -       Sep     26      2:00s   0       -
+Rule   Greece  1978    only    -       Sep     24      4:00    0       -
+Rule   Greece  1979    only    -       Apr      1      9:00    1:00    S
+Rule   Greece  1979    only    -       Sep     29      2:00    0       -
+Rule   Greece  1980    only    -       Apr      1      0:00    1:00    S
+Rule   Greece  1980    only    -       Sep     28      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Athens   1:34:52 -       LMT     1895 Sep 14
+                       1:34:52 -       AMT     1916 Jul 28 0:01     # Athens MT
+                       2:00    Greece  EE%sT   1941 Apr 30
+                       1:00    Greece  CE%sT   1944 Apr  4
+                       2:00    Greece  EE%sT   1981
+                       # Shanks & Pottenger say it switched to C-Eur in 1981;
+                       # go with EU instead, since Greece joined it on Jan 1.
+                       2:00    EU      EE%sT
+
+# Hungary
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Hungary 1918    only    -       Apr      1       3:00   1:00    S
+Rule   Hungary 1918    only    -       Sep     29       3:00   0       -
+Rule   Hungary 1919    only    -       Apr     15       3:00   1:00    S
+Rule   Hungary 1919    only    -       Sep     15       3:00   0       -
+Rule   Hungary 1920    only    -       Apr      5       3:00   1:00    S
+Rule   Hungary 1920    only    -       Sep     30       3:00   0       -
+Rule   Hungary 1945    only    -       May      1      23:00   1:00    S
+Rule   Hungary 1945    only    -       Nov      3       0:00   0       -
+Rule   Hungary 1946    only    -       Mar     31       2:00s  1:00    S
+Rule   Hungary 1946    1949    -       Oct     Sun>=1   2:00s  0       -
+Rule   Hungary 1947    1949    -       Apr     Sun>=4   2:00s  1:00    S
+Rule   Hungary 1950    only    -       Apr     17       2:00s  1:00    S
+Rule   Hungary 1950    only    -       Oct     23       2:00s  0       -
+Rule   Hungary 1954    1955    -       May     23       0:00   1:00    S
+Rule   Hungary 1954    1955    -       Oct      3       0:00   0       -
+Rule   Hungary 1956    only    -       Jun     Sun>=1   0:00   1:00    S
+Rule   Hungary 1956    only    -       Sep     lastSun  0:00   0       -
+Rule   Hungary 1957    only    -       Jun     Sun>=1   1:00   1:00    S
+Rule   Hungary 1957    only    -       Sep     lastSun  3:00   0       -
+Rule   Hungary 1980    only    -       Apr      6       1:00   1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Budapest 1:16:20 -       LMT     1890 Oct
+                       1:00    C-Eur   CE%sT   1918
+                       1:00    Hungary CE%sT   1941 Apr  6  2:00
+                       1:00    C-Eur   CE%sT   1945 May  1 23:00
+                       1:00    Hungary CE%sT   1980 Sep 28  2:00s
+                       1:00    EU      CE%sT
+
+# Iceland
+#
+# From Adam David (1993-11-06):
+# The name of the timezone in Iceland for system / mail / news purposes is GMT.
+#
+# (1993-12-05):
+# This material is paraphrased from the 1988 edition of the University of
+# Iceland Almanak.
+#
+# From January 1st, 1908 the whole of Iceland was standardised at 1 hour
+# behind GMT. Previously, local mean solar time was used in different parts
+# of Iceland, the almanak had been based on Reykjavik mean solar time which
+# was 1 hour and 28 minutes behind GMT.
+#
+# "first day of winter" referred to [below] means the first day of the 26 weeks
+# of winter, according to the old icelandic calendar that dates back to the
+# time the norsemen first settled Iceland.  The first day of winter is always
+# Saturday, but is not dependent on the Julian or Gregorian calendars.
+#
+# (1993-12-10):
+# I have a reference from the Oxford Icelandic-English dictionary for the
+# beginning of winter, which ties it to the ecclesiastical calendar (and thus
+# to the julian/gregorian calendar) over the period in question.
+#      the winter begins on the Saturday next before St. Luke's day
+#      (old style), or on St. Luke's day, if a Saturday.
+# St. Luke's day ought to be traceable from ecclesiastical sources. "old style"
+# might be a reference to the Julian calendar as opposed to Gregorian, or it
+# might mean something else (???).
+#
+# From Paul Eggert (2006-03-22):
+# The Iceland Almanak, Shanks & Pottenger, and Whitman disagree on many points.
+# We go with the Almanak, except for one claim from Shanks & Pottenger, namely
+# that Reykavik was 21W57 from 1837 to 1908, local mean time before that.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Iceland 1917    1918    -       Feb     19      23:00   1:00    S
+Rule   Iceland 1917    only    -       Oct     21       1:00   0       -
+Rule   Iceland 1918    only    -       Nov     16       1:00   0       -
+Rule   Iceland 1939    only    -       Apr     29      23:00   1:00    S
+Rule   Iceland 1939    only    -       Nov     29       2:00   0       -
+Rule   Iceland 1940    only    -       Feb     25       2:00   1:00    S
+Rule   Iceland 1940    only    -       Nov      3       2:00   0       -
+Rule   Iceland 1941    only    -       Mar      2       1:00s  1:00    S
+Rule   Iceland 1941    only    -       Nov      2       1:00s  0       -
+Rule   Iceland 1942    only    -       Mar      8       1:00s  1:00    S
+Rule   Iceland 1942    only    -       Oct     25       1:00s  0       -
+# 1943-1946 - first Sunday in March until first Sunday in winter
+Rule   Iceland 1943    1946    -       Mar     Sun>=1   1:00s  1:00    S
+Rule   Iceland 1943    1948    -       Oct     Sun>=22  1:00s  0       -
+# 1947-1967 - first Sunday in April until first Sunday in winter
+Rule   Iceland 1947    1967    -       Apr     Sun>=1   1:00s  1:00    S
+# 1949 Oct transition delayed by 1 week
+Rule   Iceland 1949    only    -       Oct     30       1:00s  0       -
+Rule   Iceland 1950    1966    -       Oct     Sun>=22  1:00s  0       -
+Rule   Iceland 1967    only    -       Oct     29       1:00s  0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/Reykjavik        -1:27:24 -      LMT     1837
+                       -1:27:48 -      RMT     1908 # Reykjavik Mean Time?
+                       -1:00   Iceland IS%sT   1968 Apr 7 1:00s
+                        0:00   -       GMT
+
+# Italy
+#
+# From Paul Eggert (2001-03-06):
+# Sicily and Sardinia each had their own time zones from 1866 to 1893,
+# called Palermo Time (+00:53:28) and Cagliari Time (+00:36:32).
+# During World War II, German-controlled Italy used German time.
+# But these events all occurred before the 1970 cutoff,
+# so record only the time in Rome.
+#
+# From Paul Eggert (2006-03-22):
+# For Italian DST we have three sources: Shanks & Pottenger, Whitman, and
+# F. Pollastri
+# <a href="http://toi.iriti.cnr.it/uk/ienitlt.html">
+# Day-light Saving Time in Italy (2006-02-03)
+# </a>
+# (`FP' below), taken from an Italian National Electrotechnical Institute
+# publication. When the three sources disagree, guess who's right, as follows:
+#
+# year FP      Shanks&P. (S)   Whitman (W)     Go with:
+# 1916 06-03   06-03 24:00     06-03 00:00     FP & W
+#      09-30   09-30 24:00     09-30 01:00     FP; guess 24:00s
+# 1917 04-01   03-31 24:00     03-31 00:00     FP & S
+#      09-30   09-29 24:00     09-30 01:00     FP & W
+# 1918 03-09   03-09 24:00     03-09 00:00     FP & S
+#      10-06   10-05 24:00     10-06 01:00     FP & W
+# 1919 03-01   03-01 24:00     03-01 00:00     FP & S
+#      10-04   10-04 24:00     10-04 01:00     FP; guess 24:00s
+# 1920 03-20   03-20 24:00     03-20 00:00     FP & S
+#      09-18   09-18 24:00     10-01 01:00     FP; guess 24:00s
+# 1944 04-02   04-03 02:00                     S (see C-Eur)
+#      09-16   10-02 03:00                     FP; guess 24:00s
+# 1945 09-14   09-16 24:00                     FP; guess 24:00s
+# 1970 05-21   05-31 00:00                     S
+#      09-20   09-27 00:00                     S
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Italy   1916    only    -       Jun      3      0:00s   1:00    S
+Rule   Italy   1916    only    -       Oct      1      0:00s   0       -
+Rule   Italy   1917    only    -       Apr      1      0:00s   1:00    S
+Rule   Italy   1917    only    -       Sep     30      0:00s   0       -
+Rule   Italy   1918    only    -       Mar     10      0:00s   1:00    S
+Rule   Italy   1918    1919    -       Oct     Sun>=1  0:00s   0       -
+Rule   Italy   1919    only    -       Mar      2      0:00s   1:00    S
+Rule   Italy   1920    only    -       Mar     21      0:00s   1:00    S
+Rule   Italy   1920    only    -       Sep     19      0:00s   0       -
+Rule   Italy   1940    only    -       Jun     15      0:00s   1:00    S
+Rule   Italy   1944    only    -       Sep     17      0:00s   0       -
+Rule   Italy   1945    only    -       Apr      2      2:00    1:00    S
+Rule   Italy   1945    only    -       Sep     15      0:00s   0       -
+Rule   Italy   1946    only    -       Mar     17      2:00s   1:00    S
+Rule   Italy   1946    only    -       Oct      6      2:00s   0       -
+Rule   Italy   1947    only    -       Mar     16      0:00s   1:00    S
+Rule   Italy   1947    only    -       Oct      5      0:00s   0       -
+Rule   Italy   1948    only    -       Feb     29      2:00s   1:00    S
+Rule   Italy   1948    only    -       Oct      3      2:00s   0       -
+Rule   Italy   1966    1968    -       May     Sun>=22 0:00    1:00    S
+Rule   Italy   1966    1969    -       Sep     Sun>=22 0:00    0       -
+Rule   Italy   1969    only    -       Jun      1      0:00    1:00    S
+Rule   Italy   1970    only    -       May     31      0:00    1:00    S
+Rule   Italy   1970    only    -       Sep     lastSun 0:00    0       -
+Rule   Italy   1971    1972    -       May     Sun>=22 0:00    1:00    S
+Rule   Italy   1971    only    -       Sep     lastSun 1:00    0       -
+Rule   Italy   1972    only    -       Oct      1      0:00    0       -
+Rule   Italy   1973    only    -       Jun      3      0:00    1:00    S
+Rule   Italy   1973    1974    -       Sep     lastSun 0:00    0       -
+Rule   Italy   1974    only    -       May     26      0:00    1:00    S
+Rule   Italy   1975    only    -       Jun      1      0:00s   1:00    S
+Rule   Italy   1975    1977    -       Sep     lastSun 0:00s   0       -
+Rule   Italy   1976    only    -       May     30      0:00s   1:00    S
+Rule   Italy   1977    1979    -       May     Sun>=22 0:00s   1:00    S
+Rule   Italy   1978    only    -       Oct      1      0:00s   0       -
+Rule   Italy   1979    only    -       Sep     30      0:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Rome     0:49:56 -       LMT     1866 Sep 22
+                       0:49:56 -       RMT     1893 Nov  1 0:00s # Rome Mean
+                       1:00    Italy   CE%sT   1942 Nov  2 2:00s
+                       1:00    C-Eur   CE%sT   1944 Jul
+                       1:00    Italy   CE%sT   1980
+                       1:00    EU      CE%sT
+
+Link   Europe/Rome     Europe/Vatican
+Link   Europe/Rome     Europe/San_Marino
+
+# Latvia
+
+# From Liene Kanepe (1998-09-17):
+
+# I asked about this matter Scientific Secretary of the Institute of Astronomy
+# of The University of Latvia Dr. paed Mr. Ilgonis Vilks. I also searched the
+# correct data in juridical acts and I found some juridical documents about
+# changes in the counting of time in Latvia from 1981....
+#
+# Act No.35 of the Council of Ministers of Latvian SSR of 1981-01-22 ...
+# according to the Act No.925 of the Council of Ministers of USSR of 1980-10-24
+# ...: all year round the time of 2nd time zone + 1 hour, in addition turning
+# the hands of the clock 1 hour forward on 1 April at 00:00 (GMT 31 March 21:00)
+# and 1 hour backward on the 1 October at 00:00 (GMT 30 September 20:00).
+#
+# Act No.592 of the Council of Ministers of Latvian SSR of 1984-09-24 ...
+# according to the Act No.967 of the Council of Ministers of USSR of 1984-09-13
+# ...: all year round the time of 2nd time zone + 1 hour, in addition turning
+# the hands of the clock 1 hour forward on the last Sunday of March at 02:00
+# (GMT 23:00 on the previous day) and 1 hour backward on the last Sunday of
+# September at 03:00 (GMT 23:00 on the previous day).
+#
+# Act No.81 of the Council of Ministers of Latvian SSR of 1989-03-22 ...
+# according to the Act No.227 of the Council of Ministers of USSR of 1989-03-14
+# ...: since the last Sunday of March 1989 in Lithuanian SSR, Latvian SSR,
+# Estonian SSR and Kaliningrad region of Russian Federation all year round the
+# time of 2nd time zone (Moscow time minus one hour). On the territory of Latvia
+# transition to summer time is performed on the last Sunday of March at 02:00
+# (GMT 00:00), turning the hands of the clock 1 hour forward.  The end of
+# daylight saving time is performed on the last Sunday of September at 03:00
+# (GMT 00:00), turning the hands of the clock 1 hour backward. Exception is
+# 1989-03-26, when we must not turn the hands of the clock....
+#
+# The Regulations of the Cabinet of Ministers of the Republic of Latvia of
+# 1997-01-21 on transition to Summer time ... established the same order of
+# daylight savings time settings as in the States of the European Union.
+
+# From Andrei Ivanov (2000-03-06):
+# This year Latvia will not switch to Daylight Savings Time (as specified in
+# <a href="http://www.lv-laiks.lv/wwwraksti/2000/071072/vd4.htm">
+# The Regulations of the Cabinet of Ministers of the Rep. of Latvia of
+# 29-Feb-2000 (#79)</a>, in Latvian for subscribers only).
+
+# <a href="http://www.rferl.org/newsline/2001/01/3-CEE/cee-030101.html">
+# From RFE/RL Newsline (2001-01-03), noted after a heads-up by Rives McDow:
+# </a>
+# The Latvian government on 2 January decided that the country will
+# institute daylight-saving time this spring, LETA reported.
+# Last February the three Baltic states decided not to turn back their
+# clocks one hour in the spring....
+# Minister of Economy Aigars Kalvitis noted that Latvia had too few
+# daylight hours and thus decided to comply with a draft European
+# Commission directive that provides for instituting daylight-saving
+# time in EU countries between 2002 and 2006. The Latvian government
+# urged Lithuania and Estonia to adopt a similar time policy, but it
+# appears that they will not do so....
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Latvia  1989    1996    -       Mar     lastSun  2:00s  1:00    S
+Rule   Latvia  1989    1996    -       Sep     lastSun  2:00s  0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Riga     1:36:24 -       LMT     1880
+                       1:36:24 -       RMT     1918 Apr 15 2:00 #Riga Mean Time
+                       1:36:24 1:00    LST     1918 Sep 16 3:00 #Latvian Summer
+                       1:36:24 -       RMT     1919 Apr  1 2:00
+                       1:36:24 1:00    LST     1919 May 22 3:00
+                       1:36:24 -       RMT     1926 May 11
+                       2:00    -       EET     1940 Aug  5
+                       3:00    -       MSK     1941 Jul
+                       1:00    C-Eur   CE%sT   1944 Oct 13
+                       3:00    Russia  MSK/MSD 1989 Mar lastSun 2:00s
+                       2:00    1:00    EEST    1989 Sep lastSun 2:00s
+                       2:00    Latvia  EE%sT   1997 Jan 21
+                       2:00    EU      EE%sT   2000 Feb 29
+                       2:00    -       EET     2001 Jan  2
+                       2:00    EU      EE%sT
+
+# Liechtenstein
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Vaduz    0:38:04 -       LMT     1894 Jun
+                       1:00    -       CET     1981
+                       1:00    EU      CE%sT
+
+# Lithuania
+
+# From Paul Eggert (1996-11-22):
+# IATA SSIM (1992/1996) says Lithuania uses W-Eur rules, but since it is
+# known to be wrong about Estonia and Latvia, assume it's wrong here too.
+
+# From Marius Gedminas (1998-08-07):
+# I would like to inform that in this year Lithuanian time zone
+# (Europe/Vilnius) was changed.
+
+# From <a href="http://www.elta.lt/">ELTA</a> No. 972 (2582) (1999-09-29),
+# via Steffen Thorsen:
+# Lithuania has shifted back to the second time zone (GMT plus two hours)
+# to be valid here starting from October 31,
+# as decided by the national government on Wednesday....
+# The Lithuanian government also announced plans to consider a
+# motion to give up shifting to summer time in spring, as it was
+# already done by Estonia.
+
+# From the <a href="http://www.tourism.lt/informa/ff.htm">
+# Fact File, Lithuanian State Department of Tourism
+# </a> (2000-03-27): Local time is GMT+2 hours ..., no daylight saving.
+
+# From a user via Klaus Marten (2003-02-07):
+# As a candidate for membership of the European Union, Lithuania will
+# observe Summer Time in 2003, changing its clocks at the times laid
+# down in EU Directive 2000/84 of 19.I.01 (i.e. at the same times as its
+# neighbour Latvia). The text of the Lithuanian government Order of
+# 7.XI.02 to this effect can be found at
+# http://www.lrvk.lt/nut/11/n1749.htm
+
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Vilnius  1:41:16 -       LMT     1880
+                       1:24:00 -       WMT     1917        # Warsaw Mean Time
+                       1:35:36 -       KMT     1919 Oct 10 # Kaunas Mean Time
+                       1:00    -       CET     1920 Jul 12
+                       2:00    -       EET     1920 Oct  9
+                       1:00    -       CET     1940 Aug  3
+                       3:00    -       MSK     1941 Jun 24
+                       1:00    C-Eur   CE%sT   1944 Aug
+                       3:00    Russia  MSK/MSD 1991 Mar 31 2:00s
+                       2:00    1:00    EEST    1991 Sep 29 2:00s
+                       2:00    C-Eur   EE%sT   1998
+                       2:00    -       EET     1998 Mar 29 1:00u
+                       1:00    EU      CE%sT   1999 Oct 31 1:00u
+                       2:00    -       EET     2003 Jan  1
+                       2:00    EU      EE%sT
+
+# Luxembourg
+# Whitman disagrees with most of these dates in minor ways;
+# go with Shanks & Pottenger.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Lux     1916    only    -       May     14      23:00   1:00    S
+Rule   Lux     1916    only    -       Oct      1       1:00   0       -
+Rule   Lux     1917    only    -       Apr     28      23:00   1:00    S
+Rule   Lux     1917    only    -       Sep     17       1:00   0       -
+Rule   Lux     1918    only    -       Apr     Mon>=15  2:00s  1:00    S
+Rule   Lux     1918    only    -       Sep     Mon>=15  2:00s  0       -
+Rule   Lux     1919    only    -       Mar      1      23:00   1:00    S
+Rule   Lux     1919    only    -       Oct      5       3:00   0       -
+Rule   Lux     1920    only    -       Feb     14      23:00   1:00    S
+Rule   Lux     1920    only    -       Oct     24       2:00   0       -
+Rule   Lux     1921    only    -       Mar     14      23:00   1:00    S
+Rule   Lux     1921    only    -       Oct     26       2:00   0       -
+Rule   Lux     1922    only    -       Mar     25      23:00   1:00    S
+Rule   Lux     1922    only    -       Oct     Sun>=2   1:00   0       -
+Rule   Lux     1923    only    -       Apr     21      23:00   1:00    S
+Rule   Lux     1923    only    -       Oct     Sun>=2   2:00   0       -
+Rule   Lux     1924    only    -       Mar     29      23:00   1:00    S
+Rule   Lux     1924    1928    -       Oct     Sun>=2   1:00   0       -
+Rule   Lux     1925    only    -       Apr      5      23:00   1:00    S
+Rule   Lux     1926    only    -       Apr     17      23:00   1:00    S
+Rule   Lux     1927    only    -       Apr      9      23:00   1:00    S
+Rule   Lux     1928    only    -       Apr     14      23:00   1:00    S
+Rule   Lux     1929    only    -       Apr     20      23:00   1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Luxembourg 0:24:36 -       LMT     1904 Jun
+                       1:00    Lux     CE%sT   1918 Nov 25
+                       0:00    Lux     WE%sT   1929 Oct  6 2:00s
+                       0:00    Belgium WE%sT   1940 May 14 3:00
+                       1:00    C-Eur   WE%sT   1944 Sep 18 3:00
+                       1:00    Belgium CE%sT   1977
+                       1:00    EU      CE%sT
+
+# Macedonia
+# see Serbia
+
+# Malta
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Malta   1973    only    -       Mar     31      0:00s   1:00    S
+Rule   Malta   1973    only    -       Sep     29      0:00s   0       -
+Rule   Malta   1974    only    -       Apr     21      0:00s   1:00    S
+Rule   Malta   1974    only    -       Sep     16      0:00s   0       -
+Rule   Malta   1975    1979    -       Apr     Sun>=15 2:00    1:00    S
+Rule   Malta   1975    1980    -       Sep     Sun>=15 2:00    0       -
+Rule   Malta   1980    only    -       Mar     31      2:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Malta    0:58:04 -       LMT     1893 Nov  2 0:00s # Valletta
+                       1:00    Italy   CE%sT   1942 Nov  2 2:00s
+                       1:00    C-Eur   CE%sT   1945 Apr  2 2:00s
+                       1:00    Italy   CE%sT   1973 Mar 31
+                       1:00    Malta   CE%sT   1981
+                       1:00    EU      CE%sT
+
+# Moldova
+
+# From Paul Eggert (2006-03-22):
+# A previous version of this database followed Shanks & Pottenger, who write
+# that Tiraspol switched to Moscow time on 1992-01-19 at 02:00.
+# However, this is most likely an error, as Moldova declared independence
+# on 1991-08-27 (the 1992-01-19 date is that of a Russian decree).
+# In early 1992 there was large-scale interethnic violence in the area
+# and it's possible that some Russophones continued to observe Moscow time.
+# But [two people] separately reported via
+# Jesper Norgaard that as of 2001-01-24 Tiraspol was like Chisinau.
+# The Tiraspol entry has therefore been removed for now.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Chisinau 1:55:20 -       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 1990
+                       3:00    -       MSK     1990 May 6
+                       2:00    -       EET     1991
+                       2:00    Russia  EE%sT   1992
+                       2:00    E-Eur   EE%sT   1997
+# See Romania commentary for the guessed 1997 transition to EU rules.
+                       2:00    EU      EE%sT
+
+# Monaco
+# Shanks & Pottenger give 0:09:20 for Paris Mean Time; go with Howse's
+# more precise 0:09:21.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Monaco   0:29:32 -       LMT     1891 Mar 15
+                       0:09:21 -       PMT     1911 Mar 11    # Paris Mean Time
+                       0:00    France  WE%sT   1945 Sep 16 3:00
+                       1:00    France  CE%sT   1977
+                       1:00    EU      CE%sT
+
+# Montenegro
+# see Serbia
+
+# Netherlands
+
+# Howse writes that the Netherlands' railways used GMT between 1892 and 1940,
+# but for other purposes the Netherlands used Amsterdam mean time.
+
+# However, Robert H. van Gent writes (2001-04-01):
+# Howse's statement is only correct up to 1909. From 1909-05-01 (00:00:00
+# Amsterdam mean time) onwards, the whole of the Netherlands (including
+# the Dutch railways) was required by law to observe Amsterdam mean time
+# (19 minutes 32.13 seconds ahead of GMT). This had already been the
+# common practice (except for the railways) for many decades but it was
+# not until 1909 when the Dutch government finally defined this by law.
+# On 1937-07-01 this was changed to 20 minutes (exactly) ahead of GMT and
+# was generally known as Dutch Time ("Nederlandse Tijd").
+#
+# (2001-04-08):
+# 1892-05-01 was the date when the Dutch railways were by law required to
+# observe GMT while the remainder of the Netherlands adhered to the common
+# practice of following Amsterdam mean time.
+#
+# (2001-04-09):
+# In 1835 the authorities of the province of North Holland requested the
+# municipal authorities of the towns and cities in the province to observe
+# Amsterdam mean time but I do not know in how many cases this request was
+# actually followed.
+#
+# From 1852 onwards the Dutch telegraph offices were by law required to
+# observe Amsterdam mean time. As the time signals from the observatory of
+# Leiden were also distributed by the telegraph system, I assume that most
+# places linked up with the telegraph (and railway) system automatically
+# adopted Amsterdam mean time.
+#
+# Although the early Dutch railway companies initially observed a variety
+# of times, most of them had adopted Amsterdam mean time by 1858 but it
+# was not until 1866 when they were all required by law to observe
+# Amsterdam mean time.
+
+# The data before 1945 are taken from
+# <http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm>.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Neth    1916    only    -       May      1      0:00    1:00    NST     # Netherlands Summer Time
+Rule   Neth    1916    only    -       Oct      1      0:00    0       AMT     # Amsterdam Mean Time
+Rule   Neth    1917    only    -       Apr     16      2:00s   1:00    NST
+Rule   Neth    1917    only    -       Sep     17      2:00s   0       AMT
+Rule   Neth    1918    1921    -       Apr     Mon>=1  2:00s   1:00    NST
+Rule   Neth    1918    1921    -       Sep     lastMon 2:00s   0       AMT
+Rule   Neth    1922    only    -       Mar     lastSun 2:00s   1:00    NST
+Rule   Neth    1922    1936    -       Oct     Sun>=2  2:00s   0       AMT
+Rule   Neth    1923    only    -       Jun     Fri>=1  2:00s   1:00    NST
+Rule   Neth    1924    only    -       Mar     lastSun 2:00s   1:00    NST
+Rule   Neth    1925    only    -       Jun     Fri>=1  2:00s   1:00    NST
+# From 1926 through 1939 DST began 05-15, except that it was delayed by a week
+# in years when 05-15 fell in the Pentecost weekend.
+Rule   Neth    1926    1931    -       May     15      2:00s   1:00    NST
+Rule   Neth    1932    only    -       May     22      2:00s   1:00    NST
+Rule   Neth    1933    1936    -       May     15      2:00s   1:00    NST
+Rule   Neth    1937    only    -       May     22      2:00s   1:00    NST
+Rule   Neth    1937    only    -       Jul      1      0:00    1:00    S
+Rule   Neth    1937    1939    -       Oct     Sun>=2  2:00s   0       -
+Rule   Neth    1938    1939    -       May     15      2:00s   1:00    S
+Rule   Neth    1945    only    -       Apr      2      2:00s   1:00    S
+Rule   Neth    1945    only    -       Sep     16      2:00s   0       -
+#
+# Amsterdam Mean Time was +00:19:32.13 exactly, but the .13 is omitted
+# below because the current format requires GMTOFF to be an integer.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Amsterdam  0:19:32 -       LMT     1835
+                       0:19:32 Neth    %s      1937 Jul  1
+                       0:20    Neth    NE%sT   1940 May 16 0:00 # Dutch Time
+                       1:00    C-Eur   CE%sT   1945 Apr  2 2:00
+                       1:00    Neth    CE%sT   1977
+                       1:00    EU      CE%sT
+
+# Norway
+# http://met.no/met/met_lex/q_u/sommertid.html (2004-01) agrees with Shanks &
+# Pottenger.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Norway  1916    only    -       May     22      1:00    1:00    S
+Rule   Norway  1916    only    -       Sep     30      0:00    0       -
+Rule   Norway  1945    only    -       Apr      2      2:00s   1:00    S
+Rule   Norway  1945    only    -       Oct      1      2:00s   0       -
+Rule   Norway  1959    1964    -       Mar     Sun>=15 2:00s   1:00    S
+Rule   Norway  1959    1965    -       Sep     Sun>=15 2:00s   0       -
+Rule   Norway  1965    only    -       Apr     25      2:00s   1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Oslo     0:43:00 -       LMT     1895 Jan  1
+                       1:00    Norway  CE%sT   1940 Aug 10 23:00
+                       1:00    C-Eur   CE%sT   1945 Apr  2  2:00
+                       1:00    Norway  CE%sT   1980
+                       1:00    EU      CE%sT
+
+# Svalbard & Jan Mayen
+
+# From Steffen Thorsen (2001-05-01):
+# Although I could not find it explicitly, it seems that Jan Mayen and
+# Svalbard have been using the same time as Norway at least since the
+# time they were declared as parts of Norway.  Svalbard was declared
+# as a part of Norway by law of 1925-07-17 no 11, section 4 and Jan
+# Mayen by law of 1930-02-27 no 2, section 2. (From
+# http://www.lovdata.no/all/nl-19250717-011.html and
+# http://www.lovdata.no/all/nl-19300227-002.html).  The law/regulation
+# for normal/standard time in Norway is from 1894-06-29 no 1 (came
+# into operation on 1895-01-01) and Svalbard/Jan Mayen seem to be a
+# part of this law since 1925/1930. (From
+# http://www.lovdata.no/all/nl-18940629-001.html ) I have not been
+# able to find if Jan Mayen used a different time zone (e.g. -0100)
+# before 1930. Jan Mayen has only been "inhabitated" since 1921 by
+# Norwegian meteorologists and maybe used the same time as Norway ever
+# since 1921.  Svalbard (Arctic/Longyearbyen) has been inhabited since
+# before 1895, and therefore probably changed the local time somewhere
+# between 1895 and 1925 (inclusive).
+
+# From Paul Eggert (2001-05-01):
+#
+# Actually, Jan Mayen was never occupied by Germany during World War II,
+# so it must have diverged from Oslo time during the war, as Oslo was
+# keeping Berlin time.
+#
+# <http://home.no.net/janmayen/history.htm> says that the meteorologists
+# burned down their station in 1940 and left the island, but returned in
+# 1941 with a small Norwegian garrison and continued operations despite
+# frequent air ttacks from Germans.  In 1943 the Americans established a
+# radiolocating station on the island, called "Atlantic City".  Possibly
+# the UTC offset changed during the war, but I think it unlikely that
+# Jan Mayen used German daylight-saving rules.
+#
+# Svalbard is more complicated, as it was raided in August 1941 by an
+# Allied party that evacuated the civilian population to England (says
+# <http://www.bartleby.com/65/sv/Svalbard.html>).  The Svalbard FAQ
+# <http://www.svalbard.com/SvalbardFAQ.html> says that the Germans were
+# expelled on 1942-05-14.  However, small parties of Germans did return,
+# and according to Wilhelm Dege's book "War North of 80" (1954)
+# <http://www.ucalgary.ca/UofC/departments/UP/1-55238/1-55238-110-2.html>
+# the German armed forces at the Svalbard weather station code-named
+# Haudegen did not surrender to the Allies until September 1945.
+#
+# All these events predate our cutoff date of 1970.  Unless we can
+# come up with more definitive info about the timekeeping during the
+# war years it's probably best just do do the following for now:
+Link   Europe/Oslo     Arctic/Longyearbyen
+Link   Europe/Oslo     Atlantic/Jan_Mayen
+
+# Poland
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Poland  1918    1919    -       Sep     16      2:00s   0       -
+Rule   Poland  1919    only    -       Apr     15      2:00s   1:00    S
+Rule   Poland  1944    only    -       Apr      3      2:00s   1:00    S
+# Whitman gives 1944 Nov 30; go with Shanks & Pottenger.
+Rule   Poland  1944    only    -       Oct      4      2:00    0       -
+# For 1944-1948 Whitman gives the previous day; go with Shanks & Pottenger.
+Rule   Poland  1945    only    -       Apr     29      0:00    1:00    S
+Rule   Poland  1945    only    -       Nov      1      0:00    0       -
+# For 1946 on the source is Kazimierz Borkowski,
+# Torun Center for Astronomy, Dept. of Radio Astronomy, Nicolaus Copernicus U.,
+# <http://www.astro.uni.torun.pl/~kb/Artykuly/U-PA/Czas2.htm#tth_tAb1>
+# Thanks to Przemyslaw Augustyniak (2005-05-28) for this reference.
+# He also gives these further references:
+# Mon Pol nr 13, poz 162 (1995) <http://www.abc.com.pl/serwis/mp/1995/0162.htm>
+# Druk nr 2180 (2003) <http://www.senat.gov.pl/k5/dok/sejm/053/2180.pdf>
+Rule   Poland  1946    only    -       Apr     14      0:00s   1:00    S
+Rule   Poland  1946    only    -       Oct      7      2:00s   0       -
+Rule   Poland  1947    only    -       May      4      2:00s   1:00    S
+Rule   Poland  1947    1949    -       Oct     Sun>=1  2:00s   0       -
+Rule   Poland  1948    only    -       Apr     18      2:00s   1:00    S
+Rule   Poland  1949    only    -       Apr     10      2:00s   1:00    S
+Rule   Poland  1957    only    -       Jun      2      1:00s   1:00    S
+Rule   Poland  1957    1958    -       Sep     lastSun 1:00s   0       -
+Rule   Poland  1958    only    -       Mar     30      1:00s   1:00    S
+Rule   Poland  1959    only    -       May     31      1:00s   1:00    S
+Rule   Poland  1959    1961    -       Oct     Sun>=1  1:00s   0       -
+Rule   Poland  1960    only    -       Apr      3      1:00s   1:00    S
+Rule   Poland  1961    1964    -       May     lastSun 1:00s   1:00    S
+Rule   Poland  1962    1964    -       Sep     lastSun 1:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Warsaw   1:24:00 -       LMT     1880
+                       1:24:00 -       WMT     1915 Aug  5   # Warsaw Mean Time
+                       1:00    C-Eur   CE%sT   1918 Sep 16 3:00
+                       2:00    Poland  EE%sT   1922 Jun
+                       1:00    Poland  CE%sT   1940 Jun 23 2:00
+                       1:00    C-Eur   CE%sT   1944 Oct
+                       1:00    Poland  CE%sT   1977
+                       1:00    W-Eur   CE%sT   1988
+                       1:00    EU      CE%sT
+
+# Portugal
+#
+# From Rui Pedro Salgueiro (1992-11-12):
+# Portugal has recently (September, 27) changed timezone
+# (from WET to MET or CET) to harmonize with EEC.
+#
+# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
+# that Portugal is reverting to 0:00 by not moving its clocks this spring.
+# The new Prime Minister was fed up with getting up in the dark in the winter.
+#
+# From Paul Eggert (1996-11-12):
+# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
+# at 02:00u, not 01:00u.  Assume that these are typos.
+# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
+# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
+# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
+# harmonized with the EU), and that they stayed +0:00 that winter.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
+# done every year, depending on what Spain did, because of railroad schedules.
+# Go with Shanks & Pottenger.
+Rule   Port    1916    only    -       Jun     17      23:00   1:00    S
+# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
+Rule   Port    1916    only    -       Nov      1       1:00   0       -
+Rule   Port    1917    only    -       Feb     28      23:00s  1:00    S
+Rule   Port    1917    1921    -       Oct     14      23:00s  0       -
+Rule   Port    1918    only    -       Mar      1      23:00s  1:00    S
+Rule   Port    1919    only    -       Feb     28      23:00s  1:00    S
+Rule   Port    1920    only    -       Feb     29      23:00s  1:00    S
+Rule   Port    1921    only    -       Feb     28      23:00s  1:00    S
+Rule   Port    1924    only    -       Apr     16      23:00s  1:00    S
+Rule   Port    1924    only    -       Oct     14      23:00s  0       -
+Rule   Port    1926    only    -       Apr     17      23:00s  1:00    S
+Rule   Port    1926    1929    -       Oct     Sat>=1  23:00s  0       -
+Rule   Port    1927    only    -       Apr      9      23:00s  1:00    S
+Rule   Port    1928    only    -       Apr     14      23:00s  1:00    S
+Rule   Port    1929    only    -       Apr     20      23:00s  1:00    S
+Rule   Port    1931    only    -       Apr     18      23:00s  1:00    S
+# Whitman gives 1931 Oct 8; go with Shanks & Pottenger.
+Rule   Port    1931    1932    -       Oct     Sat>=1  23:00s  0       -
+Rule   Port    1932    only    -       Apr      2      23:00s  1:00    S
+Rule   Port    1934    only    -       Apr      7      23:00s  1:00    S
+# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
+Rule   Port    1934    1938    -       Oct     Sat>=1  23:00s  0       -
+# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
+Rule   Port    1935    only    -       Mar     30      23:00s  1:00    S
+Rule   Port    1936    only    -       Apr     18      23:00s  1:00    S
+# Whitman gives 1937 Apr 2; go with Shanks & Pottenger.
+Rule   Port    1937    only    -       Apr      3      23:00s  1:00    S
+Rule   Port    1938    only    -       Mar     26      23:00s  1:00    S
+Rule   Port    1939    only    -       Apr     15      23:00s  1:00    S
+# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
+Rule   Port    1939    only    -       Nov     18      23:00s  0       -
+Rule   Port    1940    only    -       Feb     24      23:00s  1:00    S
+# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
+Rule   Port    1940    1941    -       Oct      5      23:00s  0       -
+Rule   Port    1941    only    -       Apr      5      23:00s  1:00    S
+Rule   Port    1942    1945    -       Mar     Sat>=8  23:00s  1:00    S
+Rule   Port    1942    only    -       Apr     25      22:00s  2:00    M # Midsummer
+Rule   Port    1942    only    -       Aug     15      22:00s  1:00    S
+Rule   Port    1942    1945    -       Oct     Sat>=24 23:00s  0       -
+Rule   Port    1943    only    -       Apr     17      22:00s  2:00    M
+Rule   Port    1943    1945    -       Aug     Sat>=25 22:00s  1:00    S
+Rule   Port    1944    1945    -       Apr     Sat>=21 22:00s  2:00    M
+Rule   Port    1946    only    -       Apr     Sat>=1  23:00s  1:00    S
+Rule   Port    1946    only    -       Oct     Sat>=1  23:00s  0       -
+Rule   Port    1947    1949    -       Apr     Sun>=1   2:00s  1:00    S
+Rule   Port    1947    1949    -       Oct     Sun>=1   2:00s  0       -
+# Shanks & Pottenger say DST was observed in 1950; go with Whitman.
+# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
+Rule   Port    1951    1965    -       Apr     Sun>=1   2:00s  1:00    S
+Rule   Port    1951    1965    -       Oct     Sun>=1   2:00s  0       -
+Rule   Port    1977    only    -       Mar     27       0:00s  1:00    S
+Rule   Port    1977    only    -       Sep     25       0:00s  0       -
+Rule   Port    1978    1979    -       Apr     Sun>=1   0:00s  1:00    S
+Rule   Port    1978    only    -       Oct      1       0:00s  0       -
+Rule   Port    1979    1982    -       Sep     lastSun  1:00s  0       -
+Rule   Port    1980    only    -       Mar     lastSun  0:00s  1:00    S
+Rule   Port    1981    1982    -       Mar     lastSun  1:00s  1:00    S
+Rule   Port    1983    only    -       Mar     lastSun  2:00s  1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Shanks & Pottenger say the transition from LMT to WET occurred 1911-05-24;
+# Willett says 1912-01-01.  Go with Willett.
+Zone   Europe/Lisbon   -0:36:32 -      LMT     1884
+                       -0:36:32 -      LMT     1912 Jan  1  # Lisbon Mean Time
+                        0:00   Port    WE%sT   1966 Apr  3 2:00
+                        1:00   -       CET     1976 Sep 26 1:00
+                        0:00   Port    WE%sT   1983 Sep 25 1:00s
+                        0:00   W-Eur   WE%sT   1992 Sep 27 1:00s
+                        1:00   EU      CE%sT   1996 Mar 31 1:00u
+                        0:00   EU      WE%sT
+Zone Atlantic/Azores   -1:42:40 -      LMT     1884            # Ponta Delgada
+                       -1:54:32 -      HMT     1911 May 24  # Horta Mean Time
+                       -2:00   Port    AZO%sT  1966 Apr  3 2:00 # Azores Time
+                       -1:00   Port    AZO%sT  1983 Sep 25 1:00s
+                       -1:00   W-Eur   AZO%sT  1992 Sep 27 1:00s
+                        0:00   EU      WE%sT   1993 Mar 28 1:00u
+                       -1:00   EU      AZO%sT
+Zone Atlantic/Madeira  -1:07:36 -      LMT     1884            # Funchal
+                       -1:07:36 -      FMT     1911 May 24  # Funchal Mean Time
+                       -1:00   Port    MAD%sT  1966 Apr  3 2:00 # Madeira Time
+                        0:00   Port    WE%sT   1983 Sep 25 1:00s
+                        0:00   EU      WE%sT
+
+# Romania
+#
+# From Paul Eggert (1999-10-07):
+# <a href="http://www.nineoclock.ro/POL/1778pol.html">
+# Nine O'clock</a> (1998-10-23) reports that the switch occurred at
+# 04:00 local time in fall 1998.  For lack of better info,
+# assume that Romania and Moldova switched to EU rules in 1997,
+# the same year as Bulgaria.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Romania 1932    only    -       May     21       0:00s  1:00    S
+Rule   Romania 1932    1939    -       Oct     Sun>=1   0:00s  0       -
+Rule   Romania 1933    1939    -       Apr     Sun>=2   0:00s  1:00    S
+Rule   Romania 1979    only    -       May     27       0:00   1:00    S
+Rule   Romania 1979    only    -       Sep     lastSun  0:00   0       -
+Rule   Romania 1980    only    -       Apr      5      23:00   1:00    S
+Rule   Romania 1980    only    -       Sep     lastSun  1:00   0       -
+Rule   Romania 1991    1993    -       Mar     lastSun  0:00s  1:00    S
+Rule   Romania 1991    1993    -       Sep     lastSun  0:00s  0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Bucharest  1:44:24 -       LMT     1891 Oct
+                       1:44:24 -       BMT     1931 Jul 24     # Bucharest MT
+                       2:00    Romania EE%sT   1981 Mar 29 2:00s
+                       2:00    C-Eur   EE%sT   1991
+                       2:00    Romania EE%sT   1994
+                       2:00    E-Eur   EE%sT   1997
+                       2:00    EU      EE%sT
+
+# Russia
+
+# From Paul Eggert (2006-03-22):
+# Except for Moscow after 1919-07-01, I invented the time zone abbreviations.
+# Moscow time zone abbreviations after 1919-07-01, and Moscow rules after 1991,
+# are from Andrey A. Chernov.  The rest is from Shanks & Pottenger,
+# except we follow Chernov's report that 1992 DST transitions were Sat
+# 23:00, not Sun 02:00s.
+#
+# From Stanislaw A. Kuzikowski (1994-06-29):
+# But now it is some months since Novosibirsk is 3 hours ahead of Moscow!
+# I do not know why they have decided to make this change;
+# as far as I remember it was done exactly during winter->summer switching
+# so we (Novosibirsk) simply did not switch.
+#
+# From Andrey A. Chernov (1996-10-04):
+# `MSK' and `MSD' were born and used initially on Moscow computers with
+# UNIX-like OSes by several developer groups (e.g. Demos group, Kiae group)....
+# The next step was the UUCP network, the Relcom predecessor
+# (used mainly for mail), and MSK/MSD was actively used there.
+#
+# From Chris Carrier (1996-10-30):
+# According to a friend of mine who rode the Trans-Siberian Railroad from
+# Moscow to Irkutsk in 1995, public air and rail transport in Russia ...
+# still follows Moscow time, no matter where in Russia it is located.
+#
+# For Grozny, Chechnya, we have the following story from
+# John Daniszewski, "Scavengers in the Rubble", Los Angeles Times (2001-02-07):
+# News--often false--is spread by word of mouth.  A rumor that it was
+# time to move the clocks back put this whole city out of sync with
+# the rest of Russia for two weeks--even soldiers stationed here began
+# enforcing curfew at the wrong time.
+#
+# From Gwillim Law (2001-06-05):
+# There's considerable evidence that Sakhalin Island used to be in
+# UTC+11, and has changed to UTC+10, in this decade.  I start with the
+# SSIM, which listed Yuzhno-Sakhalinsk in zone RU10 along with Magadan
+# until February 1997, and then in RU9 with Khabarovsk and Vladivostok
+# since September 1997....  Although the Kuril Islands are
+# administratively part of Sakhalin oblast', they appear to have
+# remained on UTC+11 along with Magadan.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+#
+# Kaliningradskaya oblast'.
+Zone Europe/Kaliningrad         1:22:00 -      LMT     1893 Apr
+                        1:00   C-Eur   CE%sT   1945
+                        2:00   Poland  CE%sT   1946
+                        3:00   Russia  MSK/MSD 1991 Mar 31 2:00s
+                        2:00   Russia  EE%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Adygeya, Arkhangel'skaya oblast',
+# Belgorodskaya oblast', Bryanskaya oblast', Vladimirskaya oblast',
+# Vologodskaya oblast', Voronezhskaya oblast',
+# Respublika Dagestan, Ivanovskaya oblast', Respublika Ingushetiya,
+# Kabarbino-Balkarskaya Respublika, Respublika Kalmykiya,
+# Kalyzhskaya oblast', Respublika Karachaevo-Cherkessiya,
+# Respublika Kareliya, Respublika Komi,
+# Kostromskaya oblast', Krasnodarskij kraj, Kurskaya oblast',
+# Leningradskaya oblast', Lipetskaya oblast', Respublika Marij El,
+# Respublika Mordoviya, Moskva, Moskovskaya oblast',
+# Murmanskaya oblast', Nenetskij avtonomnyj okrug,
+# Nizhegorodskaya oblast', Novgorodskaya oblast', Orlovskaya oblast',
+# Penzenskaya oblast', Pskovskaya oblast', Rostovskaya oblast',
+# Ryazanskaya oblast', Sankt-Peterburg,
+# Respublika Severnaya Osetiya, Smolenskaya oblast',
+# Stavropol'skij kraj, Tambovskaya oblast', Respublika Tatarstan,
+# Tverskaya oblast', Tyl'skaya oblast', Ul'yanovskaya oblast',
+# Chechenskaya Respublika, Chuvashskaya oblast',
+# Yaroslavskaya oblast'
+Zone Europe/Moscow      2:30:20 -      LMT     1880
+                        2:30   -       MMT     1916 Jul  3 # Moscow Mean Time
+                        2:30:48 Russia %s      1919 Jul  1 2:00
+                        3:00   Russia  MSK/MSD 1922 Oct
+                        2:00   -       EET     1930 Jun 21
+                        3:00   Russia  MSK/MSD 1991 Mar 31 2:00s
+                        2:00   Russia  EE%sT   1992 Jan 19 2:00s
+                        3:00   Russia  MSK/MSD
+#
+# Astrakhanskaya oblast', Kirovskaya oblast', Saratovskaya oblast',
+# Volgogradskaya oblast'.  Shanks & Pottenger say Kirov is still at +0400
+# but Wikipedia (2006-05-09) says +0300.  Perhaps it switched after the
+# others?  But we have no data.
+Zone Europe/Volgograd   2:57:40 -      LMT     1920 Jan  3
+                        3:00   -       TSAT    1925 Apr  6 # Tsaritsyn Time
+                        3:00   -       STAT    1930 Jun 21 # Stalingrad Time
+                        4:00   -       STAT    1961 Nov 11
+                        4:00   Russia  VOL%sT  1989 Mar 26 2:00s # Volgograd T
+                        3:00   Russia  VOL%sT  1991 Mar 31 2:00s
+                        4:00   -       VOLT    1992 Mar 29 2:00s
+                        3:00   Russia  VOL%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Samarskaya oblast', Udmyrtskaya respublika
+Zone Europe/Samara      3:20:36 -      LMT     1919 Jul  1 2:00
+                        3:00   -       SAMT    1930 Jun 21
+                        4:00   -       SAMT    1935 Jan 27
+                        4:00   Russia  KUY%sT  1989 Mar 26 2:00s # Kuybyshev
+                        3:00   Russia  KUY%sT  1991 Mar 31 2:00s
+                        2:00   Russia  KUY%sT  1991 Sep 29 2:00s
+                        3:00   -       KUYT    1991 Oct 20 3:00
+                        4:00   Russia  SAM%sT  # Samara Time
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Bashkortostan, Komi-Permyatskij avtonomnyj okrug,
+# Kurganskaya oblast', Orenburgskaya oblast', Permskaya oblast',
+# Sverdlovskaya oblast', Tyumenskaya oblast',
+# Khanty-Manskijskij avtonomnyj okrug, Chelyabinskaya oblast',
+# Yamalo-Nenetskij avtonomnyj okrug.
+Zone Asia/Yekaterinburg         4:02:24 -      LMT     1919 Jul 15 4:00
+                        4:00   -       SVET    1930 Jun 21 # Sverdlovsk Time
+                        5:00   Russia  SVE%sT  1991 Mar 31 2:00s
+                        4:00   Russia  SVE%sT  1992 Jan 19 2:00s
+                        5:00   Russia  YEK%sT  # Yekaterinburg Time
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Altaj, Altajskij kraj, Omskaya oblast'.
+Zone Asia/Omsk          4:53:36 -      LMT     1919 Nov 14
+                        5:00   -       OMST    1930 Jun 21 # Omsk TIme
+                        6:00   Russia  OMS%sT  1991 Mar 31 2:00s
+                        5:00   Russia  OMS%sT  1992 Jan 19 2:00s
+                        6:00   Russia  OMS%sT
+#
+# From Paul Eggert (2006-08-19): I'm guessing about Tomsk here; it's
+# not clear when it switched from +7 to +6.
+# Novosibirskaya oblast', Tomskaya oblast'.
+Zone Asia/Novosibirsk   5:31:40 -      LMT     1919 Dec 14 6:00
+                        6:00   -       NOVT    1930 Jun 21 # Novosibirsk Time
+                        7:00   Russia  NOV%sT  1991 Mar 31 2:00s
+                        6:00   Russia  NOV%sT  1992 Jan 19 2:00s
+                        7:00   Russia  NOV%sT  1993 May 23 # say Shanks & P.
+                        6:00   Russia  NOV%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Kemerovskaya oblast', Krasnoyarskij kraj,
+# Tajmyrskij (Dolgano-Nenetskij) avtonomnyj okrug,
+# Respublika Tuva, Respublika Khakasiya, Evenkijskij avtonomnyj okrug.
+Zone Asia/Krasnoyarsk   6:11:20 -      LMT     1920 Jan  6
+                        6:00   -       KRAT    1930 Jun 21 # Krasnoyarsk Time
+                        7:00   Russia  KRA%sT  1991 Mar 31 2:00s
+                        6:00   Russia  KRA%sT  1992 Jan 19 2:00s
+                        7:00   Russia  KRA%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Respublika Buryatiya, Irkutskaya oblast',
+# Ust'-Ordynskij Buryatskij avtonomnyj okrug.
+Zone Asia/Irkutsk       6:57:20 -      LMT     1880
+                        6:57:20 -      IMT     1920 Jan 25 # Irkutsk Mean Time
+                        7:00   -       IRKT    1930 Jun 21 # Irkutsk Time
+                        8:00   Russia  IRK%sT  1991 Mar 31 2:00s
+                        7:00   Russia  IRK%sT  1992 Jan 19 2:00s
+                        8:00   Russia  IRK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Aginskij Buryatskij avtonomnyj okrug, Amurskaya oblast',
+# [parts of] Respublika Sakha (Yakutiya), Chitinskaya oblast'.
+# The Sakha districts are: Aldanskij, Amginskij, Anabarskij,
+# Bulunskij, Verkhnekolymskij, Verkhnevilyujskij, Vilyujskij, Gornyj,
+# Zhiganskij, Kobyajskij, Lenskij, Megino-Kangalasskij, Mirninskij,
+# Namskij, Nyurbinskij, Olenekskij, Olekminskij, Srednekolymskij,
+# Suntarskij, Tattinskij, Ust'-Aldanskij, Khangalasskij,
+# Churapchinskij, Eveno-Bytantajskij.
+Zone Asia/Yakutsk       8:38:40 -      LMT     1919 Dec 15
+                        8:00   -       YAKT    1930 Jun 21 # Yakutsk Time
+                        9:00   Russia  YAK%sT  1991 Mar 31 2:00s
+                        8:00   Russia  YAK%sT  1992 Jan 19 2:00s
+                        9:00   Russia  YAK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Evrejskaya avtonomnaya oblast', Khabarovskij kraj, Primorskij kraj,
+# [parts of] Respublika Sakha (Yakutiya).
+# The Sakha districts are: Verkhoyanskij, Tomponskij, Ust'-Majskij,
+# Ust'-Yanskij.
+Zone Asia/Vladivostok   8:47:44 -      LMT     1922 Nov 15
+                        9:00   -       VLAT    1930 Jun 21 # Vladivostok Time
+                       10:00   Russia  VLA%sT  1991 Mar 31 2:00s
+                        9:00   Russia  VLA%sST 1992 Jan 19 2:00s
+                       10:00   Russia  VLA%sT
+#
+# Sakhalinskaya oblast'.
+# The Zone name should be Yuzhno-Sakhalinsk, but that's too long.
+Zone Asia/Sakhalin      9:30:48 -      LMT     1905 Aug 23
+                        9:00   -       CJT     1938
+                        9:00   -       JST     1945 Aug 25
+                       11:00   Russia  SAK%sT  1991 Mar 31 2:00s # Sakhalin T.
+                       10:00   Russia  SAK%sT  1992 Jan 19 2:00s
+                       11:00   Russia  SAK%sT  1997 Mar lastSun 2:00s
+                       10:00   Russia  SAK%sT
+#
+# From Oscar van Vlijmen (2003-10-18): [This region consists of]
+# Magadanskaya oblast', Respublika Sakha (Yakutiya).
+# Probably also: Kuril Islands.
+# The Sakha districts are: Abyjskij, Allaikhovskij, Momskij,
+# Nizhnekolymskij, Ojmyakonskij.
+Zone Asia/Magadan      10:03:12 -      LMT     1924 May  2
+                       10:00   -       MAGT    1930 Jun 21 # Magadan Time
+                       11:00   Russia  MAG%sT  1991 Mar 31 2:00s
+                       10:00   Russia  MAG%sT  1992 Jan 19 2:00s
+                       11:00   Russia  MAG%sT
+#
+# From Oscar van Vlijmen (2001-08-25): [This region consists of]
+# Kamchatskaya oblast', Koryakskij avtonomnyj okrug.
+#
+# The Zone name should be Asia/Petropavlovsk-Kamchatski, but that's too long.
+Zone Asia/Kamchatka    10:34:36 -      LMT     1922 Nov 10
+                       11:00   -       PETT    1930 Jun 21 # P-K Time
+                       12:00   Russia  PET%sT  1991 Mar 31 2:00s
+                       11:00   Russia  PET%sT  1992 Jan 19 2:00s
+                       12:00   Russia  PET%sT
+#
+# Chukotskij avtonomnyj okrug
+Zone Asia/Anadyr       11:49:56 -      LMT     1924 May  2
+                       12:00   -       ANAT    1930 Jun 21 # Anadyr Time
+                       13:00   Russia  ANA%sT  1982 Apr  1 0:00s
+                       12:00   Russia  ANA%sT  1991 Mar 31 2:00s
+                       11:00   Russia  ANA%sT  1992 Jan 19 2:00s
+                       12:00   Russia  ANA%sT
+
+# Serbia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Belgrade 1:22:00 -       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
+# Metod Kozelj reports that the legal date of
+# transition to EU rules was 1982-11-27, for all of Yugoslavia at the time.
+# Shanks & Pottenger don't give as much detail, so go with Kozelj.
+                       1:00    -       CET     1982 Nov 27
+                       1:00    EU      CE%sT
+Link Europe/Belgrade Europe/Ljubljana  # Slovenia
+Link Europe/Belgrade Europe/Podgorica  # Montenegro
+Link Europe/Belgrade Europe/Sarajevo   # Bosnia and Herzegovina
+Link Europe/Belgrade Europe/Skopje     # Macedonia
+Link Europe/Belgrade Europe/Zagreb     # Croatia
+
+# Slovakia
+Link Europe/Prague Europe/Bratislava
+
+# Slovenia
+# see Serbia
+
+# Spain
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# For 1917-1919 Whitman gives Apr Sat>=1 - Oct Sat>=1;
+# go with Shanks & Pottenger.
+Rule   Spain   1917    only    -       May      5      23:00s  1:00    S
+Rule   Spain   1917    1919    -       Oct      6      23:00s  0       -
+Rule   Spain   1918    only    -       Apr     15      23:00s  1:00    S
+Rule   Spain   1919    only    -       Apr      5      23:00s  1:00    S
+# Whitman gives 1921 Feb 28 - Oct 14; go with Shanks & Pottenger.
+Rule   Spain   1924    only    -       Apr     16      23:00s  1:00    S
+# Whitman gives 1924 Oct 14; go with Shanks & Pottenger.
+Rule   Spain   1924    only    -       Oct      4      23:00s  0       -
+Rule   Spain   1926    only    -       Apr     17      23:00s  1:00    S
+# Whitman says no DST in 1929; go with Shanks & Pottenger.
+Rule   Spain   1926    1929    -       Oct     Sat>=1  23:00s  0       -
+Rule   Spain   1927    only    -       Apr      9      23:00s  1:00    S
+Rule   Spain   1928    only    -       Apr     14      23:00s  1:00    S
+Rule   Spain   1929    only    -       Apr     20      23:00s  1:00    S
+# Whitman gives 1937 Jun 16, 1938 Apr 16, 1940 Apr 13;
+# go with Shanks & Pottenger.
+Rule   Spain   1937    only    -       May     22      23:00s  1:00    S
+Rule   Spain   1937    1939    -       Oct     Sat>=1  23:00s  0       -
+Rule   Spain   1938    only    -       Mar     22      23:00s  1:00    S
+Rule   Spain   1939    only    -       Apr     15      23:00s  1:00    S
+Rule   Spain   1940    only    -       Mar     16      23:00s  1:00    S
+# Whitman says no DST 1942-1945; go with Shanks & Pottenger.
+Rule   Spain   1942    only    -       May      2      22:00s  2:00    M # Midsummer
+Rule   Spain   1942    only    -       Sep      1      22:00s  1:00    S
+Rule   Spain   1943    1946    -       Apr     Sat>=13 22:00s  2:00    M
+Rule   Spain   1943    only    -       Oct      3      22:00s  1:00    S
+Rule   Spain   1944    only    -       Oct     10      22:00s  1:00    S
+Rule   Spain   1945    only    -       Sep     30       1:00   1:00    S
+Rule   Spain   1946    only    -       Sep     30       0:00   0       -
+Rule   Spain   1949    only    -       Apr     30      23:00   1:00    S
+Rule   Spain   1949    only    -       Sep     30       1:00   0       -
+Rule   Spain   1974    1975    -       Apr     Sat>=13 23:00   1:00    S
+Rule   Spain   1974    1975    -       Oct     Sun>=1   1:00   0       -
+Rule   Spain   1976    only    -       Mar     27      23:00   1:00    S
+Rule   Spain   1976    1977    -       Sep     lastSun  1:00   0       -
+Rule   Spain   1977    1978    -       Apr      2      23:00   1:00    S
+Rule   Spain   1978    only    -       Oct      1       1:00   0       -
+# The following rules are copied from Morocco from 1967 through 1978.
+Rule SpainAfrica 1967  only    -       Jun      3      12:00   1:00    S
+Rule SpainAfrica 1967  only    -       Oct      1       0:00   0       -
+Rule SpainAfrica 1974  only    -       Jun     24       0:00   1:00    S
+Rule SpainAfrica 1974  only    -       Sep      1       0:00   0       -
+Rule SpainAfrica 1976  1977    -       May      1       0:00   1:00    S
+Rule SpainAfrica 1976  only    -       Aug      1       0:00   0       -
+Rule SpainAfrica 1977  only    -       Sep     28       0:00   0       -
+Rule SpainAfrica 1978  only    -       Jun      1       0:00   1:00    S
+Rule SpainAfrica 1978  only    -       Aug      4       0:00   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Madrid   -0:14:44 -      LMT     1901 Jan  1  0:00s
+                        0:00   Spain   WE%sT   1946 Sep 30
+                        1:00   Spain   CE%sT   1979
+                        1:00   EU      CE%sT
+Zone   Africa/Ceuta    -0:21:16 -      LMT     1901
+                        0:00   -       WET     1918 May  6 23:00
+                        0:00   1:00    WEST    1918 Oct  7 23:00
+                        0:00   -       WET     1924
+                        0:00   Spain   WE%sT   1929
+                        0:00 SpainAfrica WE%sT 1984 Mar 16
+                        1:00   -       CET     1986
+                        1:00   EU      CE%sT
+Zone   Atlantic/Canary -1:01:36 -      LMT     1922 Mar # Las Palmas de Gran C.
+                       -1:00   -       CANT    1946 Sep 30 1:00 # Canaries Time
+                        0:00   -       WET     1980 Apr  6 0:00s
+                        0:00   1:00    WEST    1980 Sep 28 0:00s
+                        0:00   EU      WE%sT
+# IATA SSIM (1996-09) says the Canaries switch at 2:00u, not 1:00u.
+# Ignore this for now, as the Canaries are part of the EU.
+
+# Sweden
+
+# From Ivan Nilsson (2001-04-13), superseding Shanks & Pottenger:
+#
+# The law "Svensk forfattningssamling 1878, no 14" about standard time in 1879:
+# From the beginning of 1879 (that is 01-01 00:00) the time for all
+# places in the country is "the mean solar time for the meridian at
+# three degrees, or twelve minutes of time, to the west of the
+# meridian of the Observatory of Stockholm".  The law is dated 1878-05-31.
+#
+# The observatory at that time had the meridian 18 degrees 03' 30"
+# eastern longitude = 01:12:14 in time.  Less 12 minutes gives the
+# national standard time as 01:00:14 ahead of GMT....
+#
+# About the beginning of CET in Sweden. The lawtext ("Svensk
+# forfattningssamling 1899, no 44") states, that "from the beginning
+# of 1900... ... the same as the mean solar time for the meridian at
+# the distance of one hour of time from the meridian of the English
+# observatory at Greenwich, or at 12 minutes 14 seconds to the west
+# from the meridian of the Observatory of Stockholm". The law is dated
+# 1899-06-16.  In short: At 1900-01-01 00:00:00 the new standard time
+# in Sweden is 01:00:00 ahead of GMT.
+#
+# 1916: The lawtext ("Svensk forfattningssamling 1916, no 124") states
+# that "1916-05-15 is considered to begin one hour earlier". It is
+# pretty obvious that at 05-14 23:00 the clocks are set to 05-15 00:00....
+# Further the law says, that "1916-09-30 is considered to end one hour later".
+#
+# The laws regulating [DST] are available on the site of the Swedish
+# Parliament beginning with 1985 - the laws regulating 1980/1984 are
+# not available on the site (to my knowledge they are only available
+# in Swedish): <http://www.riksdagen.se/english/work/sfst.asp> (type
+# "sommartid" without the quotes in the field "Fritext" and then click
+# the Sok-button).
+#
+# (2001-05-13):
+#
+# I have now found a newspaper stating that at 1916-10-01 01:00
+# summertime the church-clocks etc were set back one hour to show
+# 1916-10-01 00:00 standard time.  The article also reports that some
+# people thought the switch to standard time would take place already
+# at 1916-10-01 00:00 summer time, but they had to wait for another
+# hour before the event took place.
+#
+# Source: The newspaper "Dagens Nyheter", 1916-10-01, page 7 upper left.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Europe/Stockholm  1:12:12 -       LMT     1879 Jan  1
+                       1:00:14 -       SET     1900 Jan  1     # Swedish Time
+                       1:00    -       CET     1916 May 14 23:00
+                       1:00    1:00    CEST    1916 Oct  1 01:00
+                       1:00    -       CET     1980
+                       1:00    EU      CE%sT
+
+# Switzerland
+# From Howse:
+# By the end of the 18th century clocks and watches became commonplace
+# and their performance improved enormously.  Communities began to keep
+# mean time in preference to apparent time -- Geneva from 1780 ....
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# From Whitman (who writes ``Midnight?''):
+Rule   Swiss   1940    only    -       Nov      2      0:00    1:00    S
+Rule   Swiss   1940    only    -       Dec     31      0:00    0       -
+# From Shanks & Pottenger:
+Rule   Swiss   1941    1942    -       May     Sun>=1  2:00    1:00    S
+Rule   Swiss   1941    1942    -       Oct     Sun>=1  0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Zurich   0:34:08 -       LMT     1848 Sep 12
+                       0:29:44 -       BMT     1894 Jun # Bern Mean Time
+                       1:00    Swiss   CE%sT   1981
+                       1:00    EU      CE%sT
+
+# Turkey
+
+# From Amar Devegowda (2007-01-03):
+# The time zone rules for Istanbul, Turkey have not been changed for years now.
+# ... The latest rules are available at -
+# http://www.timeanddate.com/worldclock/timezone.html?n=107
+# From Steffen Thorsen (2007-01-03):
+# I have been able to find press records back to 1996 which all say that
+# DST started 01:00 local time and end at 02:00 local time.  I am not sure
+# what happened before that.  One example for each year from 1996 to 2001:
+# http://newspot.byegm.gov.tr/arsiv/1996/21/N4.htm
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING97/03/97X03X25.TXT
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING98/03/98X03X02.HTM
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING99/10/99X10X26.HTM#%2016
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2000/03/00X03X06.HTM#%2021
+# http://www.byegm.gov.tr/YAYINLARIMIZ/CHR/ING2001/03/23x03x01.HTM#%2027
+# From Paul Eggert (2007-01-03):
+# Prefer the above source to Shanks & Pottenger for time stamps after 1990.
+
+# From Steffen Thorsen (2007-03-09):
+# Starting 2007 though, it seems that they are adopting EU's 1:00 UTC
+# start/end time, according to the following page (2007-03-07):
+# http://www.ntvmsnbc.com/news/402029.asp
+# The official document is located here - it is in Turkish...:
+# http://rega.basbakanlik.gov.tr/eskiler/2007/03/20070307-7.htm
+# I was able to locate the following seemingly official document
+# (on a non-government server though) describing dates between 2002 and 2006:
+# http://www.alomaliye.com/bkk_2002_3769.htm
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Turkey  1916    only    -       May      1      0:00    1:00    S
+Rule   Turkey  1916    only    -       Oct      1      0:00    0       -
+Rule   Turkey  1920    only    -       Mar     28      0:00    1:00    S
+Rule   Turkey  1920    only    -       Oct     25      0:00    0       -
+Rule   Turkey  1921    only    -       Apr      3      0:00    1:00    S
+Rule   Turkey  1921    only    -       Oct      3      0:00    0       -
+Rule   Turkey  1922    only    -       Mar     26      0:00    1:00    S
+Rule   Turkey  1922    only    -       Oct      8      0:00    0       -
+# Whitman gives 1923 Apr 28 - Sep 16 and no DST in 1924-1925;
+# go with Shanks & Pottenger.
+Rule   Turkey  1924    only    -       May     13      0:00    1:00    S
+Rule   Turkey  1924    1925    -       Oct      1      0:00    0       -
+Rule   Turkey  1925    only    -       May      1      0:00    1:00    S
+Rule   Turkey  1940    only    -       Jun     30      0:00    1:00    S
+Rule   Turkey  1940    only    -       Oct      5      0:00    0       -
+Rule   Turkey  1940    only    -       Dec      1      0:00    1:00    S
+Rule   Turkey  1941    only    -       Sep     21      0:00    0       -
+Rule   Turkey  1942    only    -       Apr      1      0:00    1:00    S
+# Whitman omits the next two transition and gives 1945 Oct 1;
+# go with Shanks & Pottenger.
+Rule   Turkey  1942    only    -       Nov      1      0:00    0       -
+Rule   Turkey  1945    only    -       Apr      2      0:00    1:00    S
+Rule   Turkey  1945    only    -       Oct      8      0:00    0       -
+Rule   Turkey  1946    only    -       Jun      1      0:00    1:00    S
+Rule   Turkey  1946    only    -       Oct      1      0:00    0       -
+Rule   Turkey  1947    1948    -       Apr     Sun>=16 0:00    1:00    S
+Rule   Turkey  1947    1950    -       Oct     Sun>=2  0:00    0       -
+Rule   Turkey  1949    only    -       Apr     10      0:00    1:00    S
+Rule   Turkey  1950    only    -       Apr     19      0:00    1:00    S
+Rule   Turkey  1951    only    -       Apr     22      0:00    1:00    S
+Rule   Turkey  1951    only    -       Oct      8      0:00    0       -
+Rule   Turkey  1962    only    -       Jul     15      0:00    1:00    S
+Rule   Turkey  1962    only    -       Oct      8      0:00    0       -
+Rule   Turkey  1964    only    -       May     15      0:00    1:00    S
+Rule   Turkey  1964    only    -       Oct      1      0:00    0       -
+Rule   Turkey  1970    1972    -       May     Sun>=2  0:00    1:00    S
+Rule   Turkey  1970    1972    -       Oct     Sun>=2  0:00    0       -
+Rule   Turkey  1973    only    -       Jun      3      1:00    1:00    S
+Rule   Turkey  1973    only    -       Nov      4      3:00    0       -
+Rule   Turkey  1974    only    -       Mar     31      2:00    1:00    S
+Rule   Turkey  1974    only    -       Nov      3      5:00    0       -
+Rule   Turkey  1975    only    -       Mar     30      0:00    1:00    S
+Rule   Turkey  1975    1976    -       Oct     lastSun 0:00    0       -
+Rule   Turkey  1976    only    -       Jun      1      0:00    1:00    S
+Rule   Turkey  1977    1978    -       Apr     Sun>=1  0:00    1:00    S
+Rule   Turkey  1977    only    -       Oct     16      0:00    0       -
+Rule   Turkey  1979    1980    -       Apr     Sun>=1  3:00    1:00    S
+Rule   Turkey  1979    1982    -       Oct     Mon>=11 0:00    0       -
+Rule   Turkey  1981    1982    -       Mar     lastSun 3:00    1:00    S
+Rule   Turkey  1983    only    -       Jul     31      0:00    1:00    S
+Rule   Turkey  1983    only    -       Oct      2      0:00    0       -
+Rule   Turkey  1985    only    -       Apr     20      0:00    1:00    S
+Rule   Turkey  1985    only    -       Sep     28      0:00    0       -
+Rule   Turkey  1986    1990    -       Mar     lastSun 2:00s   1:00    S
+Rule   Turkey  1986    1990    -       Sep     lastSun 2:00s   0       -
+Rule   Turkey  1991    2006    -       Mar     lastSun 1:00s   1:00    S
+Rule   Turkey  1991    1995    -       Sep     lastSun 1:00s   0       -
+Rule   Turkey  1996    2006    -       Oct     lastSun 1:00s   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   Europe/Istanbul 1:55:52 -       LMT     1880
+                       1:56:56 -       IMT     1910 Oct # Istanbul Mean Time?
+                       2:00    Turkey  EE%sT   1978 Oct 15
+                       3:00    Turkey  TR%sT   1985 Apr 20 # Turkey Time
+                       2:00    Turkey  EE%sT   2007
+                       2:00    EU      EE%sT
+Link   Europe/Istanbul Asia/Istanbul   # Istanbul is in both continents.
+
+# Ukraine
+#
+# From Igor Karpov, who works for the Ukranian Ministry of Justice,
+# via Garrett Wollman (2003-01-27):
+# BTW, I've found the official document on this matter. It's goverment
+# regulations number 509, May 13, 1996. In my poor translation it says:
+# "Time in Ukraine is set to second timezone (Kiev time). Each last Sunday
+# of March at 3am the time is changing to 4am and each last Sunday of
+# October the time at 4am is changing to 3am"
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Most of Ukraine since 1970 has been like Kiev.
+Zone Europe/Kiev       2:02:04 -       LMT     1880
+                       2:02:04 -       KMT     1924 May  2 # Kiev Mean Time
+                       2:00    -       EET     1930 Jun 21
+                       3:00    -       MSK     1941 Sep 20
+                       1:00    C-Eur   CE%sT   1943 Nov  6
+                       3:00    Russia  MSK/MSD 1990
+                       3:00    -       MSK     1990 Jul  1 2:00
+                       2:00    -       EET     1992
+                       2:00    E-Eur   EE%sT   1995
+                       2:00    EU      EE%sT
+# Ruthenia used CET 1990/1991.
+Zone Europe/Uzhgorod   1:29:12 -       LMT     1890 Oct
+                       1:00    -       CET     1940
+                       1:00    C-Eur   CE%sT   1944 Oct
+                       1:00    1:00    CEST    1944 Oct 26
+                       1:00    -       CET     1945 Jun 29
+                       3:00    Russia  MSK/MSD 1990
+                       3:00    -       MSK     1990 Jul  1 2:00
+                       1:00    -       CET     1991 Mar 31 3:00
+                       2:00    -       EET     1992
+                       2:00    E-Eur   EE%sT   1995
+                       2:00    EU      EE%sT
+# Zaporozh'ye and eastern Lugansk oblasts observed DST 1990/1991.
+# Zaporozh'ye has an apostrophe, but Posix file names can't have apostrophes.
+Zone Europe/Zaporozhye 2:20:40 -       LMT     1880
+                       2:20    -       CUT     1924 May  2 # Central Ukraine T
+                       2:00    -       EET     1930 Jun 21
+                       3:00    -       MSK     1941 Aug 25
+                       1:00    C-Eur   CE%sT   1943 Oct 25
+                       3:00    Russia  MSK/MSD 1991 Mar 31 2:00
+                       2:00    E-Eur   EE%sT   1995
+                       2:00    EU      EE%sT
+# Central Crimea used Moscow time 1994/1997.
+Zone Europe/Simferopol 2:16:24 -       LMT     1880
+                       2:16    -       SMT     1924 May  2 # Simferopol Mean T
+                       2:00    -       EET     1930 Jun 21
+                       3:00    -       MSK     1941 Nov
+                       1:00    C-Eur   CE%sT   1944 Apr 13
+                       3:00    Russia  MSK/MSD 1990
+                       3:00    -       MSK     1990 Jul  1 2:00
+                       2:00    -       EET     1992
+# From Paul Eggert (2006-03-22):
+# The _Economist_ (1994-05-28, p 45) reports that central Crimea switched
+# from Kiev to Moscow time sometime after the January 1994 elections.
+# Shanks (1999) says ``date of change uncertain'', but implies that it happened
+# sometime between the 1994 DST switches.  Shanks & Pottenger simply say
+# 1994-09-25 03:00, but that can't be right.  For now, guess it
+# changed in May.
+                       2:00    E-Eur   EE%sT   1994 May
+# From IATA SSIM (1994/1997), which also says that Kerch is still like Kiev.
+                       3:00    E-Eur   MSK/MSD 1996 Mar 31 3:00s
+                       3:00    1:00    MSD     1996 Oct 27 3:00s
+# IATA SSIM (1997-09) says Crimea switched to EET/EEST.
+# Assume it happened in March by not changing the clocks.
+                       3:00    Russia  MSK/MSD 1997
+                       3:00    -       MSK     1997 Mar lastSun 1:00u
+                       2:00    EU      EE%sT
+
+###############################################################################
+
+# One source shows that Bulgaria, Cyprus, Finland, and Greece observe DST from
+# the last Sunday in March to the last Sunday in September in 1986.
+# The source shows Romania changing a day later than everybody else.
+#
+# According to Bernard Sieloff's source, Poland is in the MET time zone but
+# uses the WE DST rules.  The Western USSR uses EET+1 and ME DST rules.
+# Bernard Sieloff's source claims Romania switches on the same day, but at
+# 00:00 standard time (i.e., 01:00 DST).  It also claims that Turkey
+# switches on the same day, but switches on at 01:00 standard time
+# and off at 00:00 standard time (i.e., 01:00 DST)
+
+# ...
+# Date: Wed, 28 Jan 87 16:56:27 -0100
+# From: Tom Hofmann
+# ...
+#
+# ...the European time rules are...standardized since 1981, when
+# most European coun[tr]ies started DST.  Before that year, only
+# a few countries (UK, France, Italy) had DST, each according
+# to own national rules.  In 1981, however, DST started on
+# 'Apr firstSun', and not on 'Mar lastSun' as in the following
+# years...
+# But also since 1981 there are some more national exceptions
+# than listed in 'europe': Switzerland, for example, joined DST
+# one year later, Denmark ended DST on 'Oct 1' instead of 'Sep
+# lastSun' in 1981---I don't know how they handle now.
+#
+# Finally, DST ist always from 'Apr 1' to 'Oct 1' in the
+# Soviet Union (as far as I know).
+#
+# Tom Hofmann, Scientific Computer Center, CIBA-GEIGY AG,
+# 4002 Basle, Switzerland
+# ...
+
+# ...
+# Date: Wed, 4 Feb 87 22:35:22 +0100
+# From: Dik T. Winter
+# ...
+#
+# The information from Tom Hofmann is (as far as I know) not entirely correct.
+# After a request from chongo at amdahl I tried to retrieve all information
+# about DST in Europe.  I was able to find all from about 1969.
+#
+# ...standardization on DST in Europe started in about 1977 with switches on
+# first Sunday in April and last Sunday in September...
+# In 1981 UK joined Europe insofar that
+# the starting day for both shifted to last Sunday in March.  And from 1982
+# the whole of Europe used DST, with switch dates April 1 and October 1 in
+# the Sov[i]et Union.  In 1985 the SU reverted to standard Europe[a]n switch
+# dates...
+#
+# It should also be remembered that time-zones are not constants; e.g.
+# Portugal switched in 1976 from MET (or CET) to WET with DST...
+# Note also that though there were rules for switch dates not
+# all countries abided to these dates, and many individual deviations
+# occurred, though not since 1982 I believe.  Another note: it is always
+# assumed that DST is 1 hour ahead of normal time, this need not be the
+# case; at least in the Netherlands there have been times when DST was 2 hours
+# in advance of normal time.
+#
+# ...
+# dik t. winter, cwi, amsterdam, nederland
+# ...
+
+# From Bob Devine (1988-01-28):
+# ...
+# Greece: Last Sunday in April to last Sunday in September (iffy on dates).
+# Since 1978.  Change at midnight.
+# ...
+# Monaco: has same DST as France.
+# ...
diff --git a/commands/zoneinfo/factory b/commands/zoneinfo/factory
new file mode 100644 (file)
index 0000000..946063c
--- /dev/null
@@ -0,0 +1,8 @@
+# @(#)factory  8.1
+
+# For companies who don't want to put time zone specification in
+# their installation procedures.  When users run date, they'll get the message.
+# Also useful for the "comp.sources" version.
+
+# Zone NAME    GMTOFF  RULES   FORMAT
+Zone   Factory 0       - "Local time zone must be set--see zic manual page"
diff --git a/commands/zoneinfo/ialloc.c b/commands/zoneinfo/ialloc.c
new file mode 100644 (file)
index 0000000..36e0b81
--- /dev/null
@@ -0,0 +1,99 @@
+#
+
+/*LINTLIBRARY*/
+
+#include "stdio.h"
+
+#ifndef lint
+#ifndef NOID
+static char    sccsid[] = "@(#)ialloc.c        7.14";
+#endif /* !NOID */
+#endif /* !lint */
+
+#ifndef alloc_t
+#define alloc_t        unsigned
+#endif /* !alloc_t */
+
+#ifdef MAL
+#define NULLMAL(x)     ((x) == NULL || (x) == MAL)
+#else /* !MAL */
+#define NULLMAL(x)     ((x) == NULL)
+#endif /* !MAL */
+
+extern char *  calloc();
+extern char *  malloc();
+extern char *  realloc();
+extern char *  strcpy();
+
+char *
+imalloc(n)
+{
+#ifdef MAL
+       register char * result;
+
+       if (n == 0)
+               n = 1;
+       result = malloc((alloc_t) n);
+       return (result == MAL) ? NULL : result;
+#else /* !MAL */
+       if (n == 0)
+               n = 1;
+       return malloc((alloc_t) n);
+#endif /* !MAL */
+}
+
+char *
+icalloc(nelem, elsize)
+{
+       if (nelem == 0 || elsize == 0)
+               nelem = elsize = 1;
+       return calloc((alloc_t) nelem, (alloc_t) elsize);
+}
+
+char *
+irealloc(pointer, size)
+char * pointer;
+{
+       if (NULLMAL(pointer))
+               return imalloc(size);
+       if (size == 0)
+               size = 1;
+       return realloc(pointer, (alloc_t) size);
+}
+
+char *
+icatalloc(old, new)
+char * old;
+char * new;
+{
+       register char * result;
+       register        oldsize, newsize;
+
+       oldsize = NULLMAL(old) ? 0 : strlen(old);
+       newsize = NULLMAL(new) ? 0 : strlen(new);
+       if ((result = irealloc(old, oldsize + newsize + 1)) != NULL)
+               if (!NULLMAL(new))
+                       (void) strcpy(result + oldsize, new);
+       return result;
+}
+
+char *
+icpyalloc(string)
+char * string;
+{
+       return icatalloc((char *) NULL, string);
+}
+
+ifree(p)
+char * p;
+{
+       if (!NULLMAL(p))
+               free(p);
+}
+
+icfree(p)
+char * p;
+{
+       if (!NULLMAL(p))
+               free(p);
+}
diff --git a/commands/zoneinfo/iso3166.tab b/commands/zoneinfo/iso3166.tab
new file mode 100644 (file)
index 0000000..0e985e9
--- /dev/null
@@ -0,0 +1,267 @@
+# ISO 3166 alpha-2 country codes
+#
+# @(#)iso3166.tab      8.4
+#
+# From Paul Eggert (2006-09-27):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166-1 alpha-2 country code, current as of
+#     ISO 3166-1 Newsletter No. V-12 (2006-09-26).  See:
+#     <a href="http://www.iso.org/iso/en/prods-services/iso3166ma/index.html">
+#     ISO 3166 Maintenance agency (ISO 3166/MA)
+#     </a>.
+# 2.  The usual English name for the country,
+#     chosen so that alphabetic sorting of subsets produces helpful lists.
+#     This is not the same as the English name in the ISO 3166 tables.
+#
+# Columns are separated by a single tab.
+# The table is sorted by country code.
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code  country name
+AD     Andorra
+AE     United Arab Emirates
+AF     Afghanistan
+AG     Antigua & Barbuda
+AI     Anguilla
+AL     Albania
+AM     Armenia
+AN     Netherlands Antilles
+AO     Angola
+AQ     Antarctica
+AR     Argentina
+AS     Samoa (American)
+AT     Austria
+AU     Australia
+AW     Aruba
+AX     Aaland Islands
+AZ     Azerbaijan
+BA     Bosnia & Herzegovina
+BB     Barbados
+BD     Bangladesh
+BE     Belgium
+BF     Burkina Faso
+BG     Bulgaria
+BH     Bahrain
+BI     Burundi
+BJ     Benin
+BM     Bermuda
+BN     Brunei
+BO     Bolivia
+BR     Brazil
+BS     Bahamas
+BT     Bhutan
+BV     Bouvet Island
+BW     Botswana
+BY     Belarus
+BZ     Belize
+CA     Canada
+CC     Cocos (Keeling) Islands
+CD     Congo (Dem. Rep.)
+CF     Central African Rep.
+CG     Congo (Rep.)
+CH     Switzerland
+CI     Cote d'Ivoire
+CK     Cook Islands
+CL     Chile
+CM     Cameroon
+CN     China
+CO     Colombia
+CR     Costa Rica
+CU     Cuba
+CV     Cape Verde
+CX     Christmas Island
+CY     Cyprus
+CZ     Czech Republic
+DE     Germany
+DJ     Djibouti
+DK     Denmark
+DM     Dominica
+DO     Dominican Republic
+DZ     Algeria
+EC     Ecuador
+EE     Estonia
+EG     Egypt
+EH     Western Sahara
+ER     Eritrea
+ES     Spain
+ET     Ethiopia
+FI     Finland
+FJ     Fiji
+FK     Falkland Islands
+FM     Micronesia
+FO     Faroe Islands
+FR     France
+GA     Gabon
+GB     Britain (UK)
+GD     Grenada
+GE     Georgia
+GF     French Guiana
+GG     Guernsey
+GH     Ghana
+GI     Gibraltar
+GL     Greenland
+GM     Gambia
+GN     Guinea
+GP     Guadeloupe
+GQ     Equatorial Guinea
+GR     Greece
+GS     South Georgia & the South Sandwich Islands
+GT     Guatemala
+GU     Guam
+GW     Guinea-Bissau
+GY     Guyana
+HK     Hong Kong
+HM     Heard Island & McDonald Islands
+HN     Honduras
+HR     Croatia
+HT     Haiti
+HU     Hungary
+ID     Indonesia
+IE     Ireland
+IL     Israel
+IM     Isle of Man
+IN     India
+IO     British Indian Ocean Territory
+IQ     Iraq
+IR     Iran
+IS     Iceland
+IT     Italy
+JE     Jersey
+JM     Jamaica
+JO     Jordan
+JP     Japan
+KE     Kenya
+KG     Kyrgyzstan
+KH     Cambodia
+KI     Kiribati
+KM     Comoros
+KN     St Kitts & Nevis
+KP     Korea (North)
+KR     Korea (South)
+KW     Kuwait
+KY     Cayman Islands
+KZ     Kazakhstan
+LA     Laos
+LB     Lebanon
+LC     St Lucia
+LI     Liechtenstein
+LK     Sri Lanka
+LR     Liberia
+LS     Lesotho
+LT     Lithuania
+LU     Luxembourg
+LV     Latvia
+LY     Libya
+MA     Morocco
+MC     Monaco
+MD     Moldova
+ME     Montenegro
+MG     Madagascar
+MH     Marshall Islands
+MK     Macedonia
+ML     Mali
+MM     Myanmar (Burma)
+MN     Mongolia
+MO     Macau
+MP     Northern Mariana Islands
+MQ     Martinique
+MR     Mauritania
+MS     Montserrat
+MT     Malta
+MU     Mauritius
+MV     Maldives
+MW     Malawi
+MX     Mexico
+MY     Malaysia
+MZ     Mozambique
+NA     Namibia
+NC     New Caledonia
+NE     Niger
+NF     Norfolk Island
+NG     Nigeria
+NI     Nicaragua
+NL     Netherlands
+NO     Norway
+NP     Nepal
+NR     Nauru
+NU     Niue
+NZ     New Zealand
+OM     Oman
+PA     Panama
+PE     Peru
+PF     French Polynesia
+PG     Papua New Guinea
+PH     Philippines
+PK     Pakistan
+PL     Poland
+PM     St Pierre & Miquelon
+PN     Pitcairn
+PR     Puerto Rico
+PS     Palestine
+PT     Portugal
+PW     Palau
+PY     Paraguay
+QA     Qatar
+RE     Reunion
+RO     Romania
+RS     Serbia
+RU     Russia
+RW     Rwanda
+SA     Saudi Arabia
+SB     Solomon Islands
+SC     Seychelles
+SD     Sudan
+SE     Sweden
+SG     Singapore
+SH     St Helena
+SI     Slovenia
+SJ     Svalbard & Jan Mayen
+SK     Slovakia
+SL     Sierra Leone
+SM     San Marino
+SN     Senegal
+SO     Somalia
+SR     Suriname
+ST     Sao Tome & Principe
+SV     El Salvador
+SY     Syria
+SZ     Swaziland
+TC     Turks & Caicos Is
+TD     Chad
+TF     French Southern & Antarctic Lands
+TG     Togo
+TH     Thailand
+TJ     Tajikistan
+TK     Tokelau
+TL     East Timor
+TM     Turkmenistan
+TN     Tunisia
+TO     Tonga
+TR     Turkey
+TT     Trinidad & Tobago
+TV     Tuvalu
+TW     Taiwan
+TZ     Tanzania
+UA     Ukraine
+UG     Uganda
+UM     US minor outlying islands
+US     United States
+UY     Uruguay
+UZ     Uzbekistan
+VA     Vatican City
+VC     St Vincent
+VE     Venezuela
+VG     Virgin Islands (UK)
+VI     Virgin Islands (US)
+VN     Vietnam
+VU     Vanuatu
+WF     Wallis & Futuna
+WS     Samoa (western)
+YE     Yemen
+YT     Mayotte
+ZA     South Africa
+ZM     Zambia
+ZW     Zimbabwe
diff --git a/commands/zoneinfo/itca.jpg b/commands/zoneinfo/itca.jpg
new file mode 100644 (file)
index 0000000..89a7119
Binary files /dev/null and b/commands/zoneinfo/itca.jpg differ
diff --git a/commands/zoneinfo/leapseconds b/commands/zoneinfo/leapseconds
new file mode 100644 (file)
index 0000000..6b99037
--- /dev/null
@@ -0,0 +1,82 @@
+# @(#)leapseconds      8.3
+
+# 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
+
+# ...
+# Sent: Thursday, February 01, 2007 9:49 AM
+# ...
+# Subject: Bulletin C number 33
+#
+#      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)
+# ...
+#
+#                                                Paris, 1 February 2007
+#                                                Bulletin C 33
+#                                                To authorities responsible
+#                                                for the measurement and
+#                                                distribution of time
+#
+#                           INFORMATION ON UTC - TAI
+#
+# NO positive leap second will be introduced at the end of June 2007.
+# The difference between Coordinated Universal Time UTC and the
+# International Atomic Time TAI is:
+#      from 2006 January 1, 0h UTC, until further notice : UTC-TAI = -33 s
+# 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
+#                              Director
+#                              Earth Orientation Center of IERS
+#                              Observatoire de Paris, France
diff --git a/commands/zoneinfo/localtime.c b/commands/zoneinfo/localtime.c
new file mode 100644 (file)
index 0000000..023ca22
--- /dev/null
@@ -0,0 +1,1914 @@
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)localtime.c    7.99";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*
+** Leap second handling from Bradley White.
+** POSIX-style TZ environment variable handling from Guy Harris.
+*/
+
+/*LINTLIBRARY*/
+
+#include "private.h"
+#include "tzfile.h"
+#include "fcntl.h"
+#include "float.h"     /* for FLT_MAX and DBL_MAX */
+
+#ifndef TZ_ABBR_MAX_LEN
+#define TZ_ABBR_MAX_LEN        16
+#endif /* !defined TZ_ABBR_MAX_LEN */
+
+#ifndef TZ_ABBR_CHAR_SET
+#define TZ_ABBR_CHAR_SET \
+       "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 :+-._"
+#endif /* !defined TZ_ABBR_CHAR_SET */
+
+#ifndef TZ_ABBR_ERR_CHAR
+#define TZ_ABBR_ERR_CHAR       '_'
+#endif /* !defined TZ_ABBR_ERR_CHAR */
+
+/*
+** SunOS 4.1.1 headers lack O_BINARY.
+*/
+
+#ifdef O_BINARY
+#define OPEN_MODE      (O_RDONLY | O_BINARY)
+#endif /* defined O_BINARY */
+#ifndef O_BINARY
+#define OPEN_MODE      O_RDONLY
+#endif /* !defined O_BINARY */
+
+#ifndef WILDABBR
+/*
+** Someone might make incorrect use of a time zone abbreviation:
+**     1.      They might reference tzname[0] before calling tzset (explicitly
+**             or implicitly).
+**     2.      They might reference tzname[1] before calling tzset (explicitly
+**             or implicitly).
+**     3.      They might reference tzname[1] after setting to a time zone
+**             in which Daylight Saving Time is never observed.
+**     4.      They might reference tzname[0] after setting to a time zone
+**             in which Standard Time is never observed.
+**     5.      They might reference tm.TM_ZONE after calling offtime.
+** What's best to do in the above cases is open to debate;
+** for now, we just set things up so that in any of the five cases
+** WILDABBR is used. Another possibility: initialize tzname[0] to the
+** string "tzname[0] used before set", and similarly for the other cases.
+** And another: initialize tzname[0] to "ERA", with an explanation in the
+** manual page of what this "time zone abbreviation" means (doing this so
+** that tzname[0] has the "normal" length of three characters).
+*/
+#define WILDABBR       "   "
+#endif /* !defined WILDABBR */
+
+static char            wildabbr[] = WILDABBR;
+
+static const char      gmt[] = "GMT";
+
+/*
+** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
+** We default to US rules as of 1999-08-17.
+** POSIX 1003.1 section 8.1.1 says that the default DST rules are
+** implementation dependent; for historical reasons, US rules are a
+** common default.
+*/
+#ifndef TZDEFRULESTRING
+#define TZDEFRULESTRING ",M4.1.0,M10.5.0"
+#endif /* !defined TZDEFDST */
+
+struct ttinfo {                                /* time type information */
+       long            tt_gmtoff;      /* UTC offset in seconds */
+       int             tt_isdst;       /* used to set tm_isdst */
+       int             tt_abbrind;     /* abbreviation list index */
+       int             tt_ttisstd;     /* TRUE if transition is std time */
+       int             tt_ttisgmt;     /* TRUE if transition is UTC */
+};
+
+struct lsinfo {                                /* leap second information */
+       time_t          ls_trans;       /* transition time */
+       long            ls_corr;        /* correction to apply */
+};
+
+#define BIGGEST(a, b)  (((a) > (b)) ? (a) : (b))
+
+#ifdef TZNAME_MAX
+#define MY_TZNAME_MAX  TZNAME_MAX
+#endif /* defined TZNAME_MAX */
+#ifndef TZNAME_MAX
+#define MY_TZNAME_MAX  255
+#endif /* !defined TZNAME_MAX */
+
+struct state {
+       int             leapcnt;
+       int             timecnt;
+       int             typecnt;
+       int             charcnt;
+       time_t          ats[TZ_MAX_TIMES];
+       unsigned char   types[TZ_MAX_TIMES];
+       struct ttinfo   ttis[TZ_MAX_TYPES];
+       char            chars[BIGGEST(BIGGEST(TZ_MAX_CHARS + 1, sizeof gmt),
+                               (2 * (MY_TZNAME_MAX + 1)))];
+       struct lsinfo   lsis[TZ_MAX_LEAPS];
+};
+
+struct rule {
+       int             r_type;         /* type of rule--see below */
+       int             r_day;          /* day number of rule */
+       int             r_week;         /* week number of rule */
+       int             r_mon;          /* month number of rule */
+       long            r_time;         /* transition time of rule */
+};
+
+#define JULIAN_DAY             0       /* Jn - Julian day */
+#define DAY_OF_YEAR            1       /* n - day of year */
+#define MONTH_NTH_DAY_OF_WEEK  2       /* Mm.n.d - month, week, day of week */
+
+/*
+** Prototypes for static functions.
+*/
+
+static long            detzcode P((const char * codep));
+static const char *    getzname P((const char * strp));
+static const char *    getqzname P((const char * strp, const char delim));
+static const char *    getnum P((const char * strp, int * nump, int min,
+                               int max));
+static const char *    getsecs P((const char * strp, long * secsp));
+static const char *    getoffset P((const char * strp, long * offsetp));
+static const char *    getrule P((const char * strp, struct rule * rulep));
+static void            gmtload P((struct state * sp));
+static struct tm *     gmtsub P((const time_t * timep, long offset,
+                               struct tm * tmp));
+static struct tm *     localsub P((const time_t * timep, long offset,
+                               struct tm * tmp));
+static int             increment_overflow P((int * number, int delta));
+static int             leaps_thru_end_of P((int y));
+static int             long_increment_overflow P((long * number, int delta));
+static int             long_normalize_overflow P((long * tensptr,
+                               int * unitsptr, int base));
+static int             normalize_overflow P((int * tensptr, int * unitsptr,
+                               int base));
+static void            settzname P((void));
+static time_t          time1 P((struct tm * tmp,
+                               struct tm * (*funcp) P((const time_t *,
+                               long, struct tm *)),
+                               long offset));
+static time_t          time2 P((struct tm *tmp,
+                               struct tm * (*funcp) P((const time_t *,
+                               long, struct tm*)),
+                               long offset, int * okayp));
+static time_t          time2sub P((struct tm *tmp,
+                               struct tm * (*funcp) P((const time_t *,
+                               long, struct tm*)),
+                               long offset, int * okayp, int do_norm_secs));
+static struct tm *     timesub P((const time_t * timep, long offset,
+                               const struct state * sp, struct tm * tmp));
+static int             tmcomp P((const struct tm * atmp,
+                               const struct tm * btmp));
+static time_t          transtime P((time_t janfirst, int year,
+                               const struct rule * rulep, long offset));
+static int             tzload P((const char * name, struct state * sp));
+static int             tzparse P((const char * name, struct state * sp,
+                               int lastditch));
+
+#ifdef ALL_STATE
+static struct state *  lclptr;
+static struct state *  gmtptr;
+#endif /* defined ALL_STATE */
+
+#ifndef ALL_STATE
+static struct state    lclmem;
+static struct state    gmtmem;
+#define lclptr         (&lclmem)
+#define gmtptr         (&gmtmem)
+#endif /* State Farm */
+
+#ifndef TZ_STRLEN_MAX
+#define TZ_STRLEN_MAX 255
+#endif /* !defined TZ_STRLEN_MAX */
+
+static char            lcl_TZname[TZ_STRLEN_MAX + 1];
+static int             lcl_is_set;
+static int             gmt_is_set;
+
+char *                 tzname[2] = {
+       wildabbr,
+       wildabbr
+};
+
+/*
+** Section 4.12.3 of X3.159-1989 requires that
+**     Except for the strftime function, these functions [asctime,
+**     ctime, gmtime, localtime] return values in one of two static
+**     objects: a broken-down time structure and an array of char.
+** Thanks to Paul Eggert for noting this.
+*/
+
+static struct tm       tm;
+
+#ifdef USG_COMPAT
+time_t                 timezone = 0;
+int                    daylight = 0;
+#endif /* defined USG_COMPAT */
+
+#ifdef ALTZONE
+time_t                 altzone = 0;
+#endif /* defined ALTZONE */
+
+static long
+detzcode(codep)
+const char * const     codep;
+{
+       register long   result;
+       register int    i;
+
+       result = (codep[0] & 0x80) ? ~0L : 0L;
+       for (i = 0; i < 4; ++i)
+               result = (result << 8) | (codep[i] & 0xff);
+       return result;
+}
+
+static void
+settzname P((void))
+{
+       register struct state * const   sp = lclptr;
+       register int                    i;
+
+       tzname[0] = wildabbr;
+       tzname[1] = wildabbr;
+#ifdef USG_COMPAT
+       daylight = 0;
+       timezone = 0;
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+       altzone = 0;
+#endif /* defined ALTZONE */
+#ifdef ALL_STATE
+       if (sp == NULL) {
+               tzname[0] = tzname[1] = gmt;
+               return;
+       }
+#endif /* defined ALL_STATE */
+       for (i = 0; i < sp->typecnt; ++i) {
+               register const struct ttinfo * const    ttisp = &sp->ttis[i];
+
+               tzname[ttisp->tt_isdst] =
+                       &sp->chars[ttisp->tt_abbrind];
+#ifdef USG_COMPAT
+               if (ttisp->tt_isdst)
+                       daylight = 1;
+               if (i == 0 || !ttisp->tt_isdst)
+                       timezone = -(ttisp->tt_gmtoff);
+#endif /* defined USG_COMPAT */
+#ifdef ALTZONE
+               if (i == 0 || ttisp->tt_isdst)
+                       altzone = -(ttisp->tt_gmtoff);
+#endif /* defined ALTZONE */
+       }
+       /*
+       ** And to get the latest zone names into tzname. . .
+       */
+       for (i = 0; i < sp->timecnt; ++i) {
+               register const struct ttinfo * const    ttisp =
+                                                       &sp->ttis[
+                                                               sp->types[i]];
+
+               tzname[ttisp->tt_isdst] =
+                       &sp->chars[ttisp->tt_abbrind];
+       }
+       /*
+       ** Finally, scrub the abbreviations.
+       ** First, replace bogus characters.
+       */
+       for (i = 0; i < sp->charcnt; ++i)
+               if (strchr(TZ_ABBR_CHAR_SET, sp->chars[i]) == NULL)
+                       sp->chars[i] = TZ_ABBR_ERR_CHAR;
+       /*
+       ** Second, truncate long abbreviations.
+       */
+       for (i = 0; i < sp->typecnt; ++i) {
+               register const struct ttinfo * const    ttisp = &sp->ttis[i];
+               register char *                         cp = &sp->chars[ttisp->tt_abbrind];
+
+               if (strlen(cp) > TZ_ABBR_MAX_LEN &&
+                       strcmp(cp, GRANDPARENTED) != 0)
+                               *(cp + TZ_ABBR_MAX_LEN) = '\0';
+       }
+}
+
+static int
+tzload(name, sp)
+register const char *          name;
+register struct state * const  sp;
+{
+       register const char *   p;
+       register int            i;
+       register int            fid;
+
+       if (name == NULL && (name = TZDEFAULT) == NULL)
+               return -1;
+       {
+               register int    doaccess;
+               /*
+               ** Section 4.9.1 of the C standard says that
+               ** "FILENAME_MAX expands to an integral constant expression
+               ** that is the size needed for an array of char large enough
+               ** to hold the longest file name string that the implementation
+               ** guarantees can be opened."
+               */
+               char            fullname[FILENAME_MAX + 1];
+
+               if (name[0] == ':')
+                       ++name;
+               doaccess = name[0] == '/';
+               if (!doaccess) {
+                       if ((p = TZDIR) == NULL)
+                               return -1;
+                       if ((strlen(p) + strlen(name) + 1) >= sizeof fullname)
+                               return -1;
+                       (void) strcpy(fullname, p);
+                       (void) strcat(fullname, "/");
+                       (void) strcat(fullname, name);
+                       /*
+                       ** Set doaccess if '.' (as in "../") shows up in name.
+                       */
+                       if (strchr(name, '.') != NULL)
+                               doaccess = TRUE;
+                       name = fullname;
+               }
+               if (doaccess && access(name, R_OK) != 0)
+                       return -1;
+               if ((fid = open(name, OPEN_MODE)) == -1)
+                       return -1;
+       }
+       {
+               struct tzhead * tzhp;
+               union {
+                       struct tzhead   tzhead;
+                       char            buf[sizeof *sp + sizeof *tzhp];
+               } u;
+               int             ttisstdcnt;
+               int             ttisgmtcnt;
+
+               i = read(fid, u.buf, sizeof u.buf);
+               if (close(fid) != 0)
+                       return -1;
+               ttisstdcnt = (int) detzcode(u.tzhead.tzh_ttisstdcnt);
+               ttisgmtcnt = (int) detzcode(u.tzhead.tzh_ttisgmtcnt);
+               sp->leapcnt = (int) detzcode(u.tzhead.tzh_leapcnt);
+               sp->timecnt = (int) detzcode(u.tzhead.tzh_timecnt);
+               sp->typecnt = (int) detzcode(u.tzhead.tzh_typecnt);
+               sp->charcnt = (int) detzcode(u.tzhead.tzh_charcnt);
+               p = u.tzhead.tzh_charcnt + sizeof u.tzhead.tzh_charcnt;
+               if (sp->leapcnt < 0 || sp->leapcnt > TZ_MAX_LEAPS ||
+                       sp->typecnt <= 0 || sp->typecnt > TZ_MAX_TYPES ||
+                       sp->timecnt < 0 || sp->timecnt > TZ_MAX_TIMES ||
+                       sp->charcnt < 0 || sp->charcnt > TZ_MAX_CHARS ||
+                       (ttisstdcnt != sp->typecnt && ttisstdcnt != 0) ||
+                       (ttisgmtcnt != sp->typecnt && ttisgmtcnt != 0))
+                               return -1;
+               if (i - (p - u.buf) < sp->timecnt * 4 + /* ats */
+                       sp->timecnt +                   /* types */
+                       sp->typecnt * (4 + 2) +         /* ttinfos */
+                       sp->charcnt +                   /* chars */
+                       sp->leapcnt * (4 + 4) +         /* lsinfos */
+                       ttisstdcnt +                    /* ttisstds */
+                       ttisgmtcnt)                     /* ttisgmts */
+                               return -1;
+               for (i = 0; i < sp->timecnt; ++i) {
+                       sp->ats[i] = detzcode(p);
+                       p += 4;
+               }
+               for (i = 0; i < sp->timecnt; ++i) {
+                       sp->types[i] = (unsigned char) *p++;
+                       if (sp->types[i] >= sp->typecnt)
+                               return -1;
+               }
+               for (i = 0; i < sp->typecnt; ++i) {
+                       register struct ttinfo *        ttisp;
+
+                       ttisp = &sp->ttis[i];
+                       ttisp->tt_gmtoff = detzcode(p);
+                       p += 4;
+                       ttisp->tt_isdst = (unsigned char) *p++;
+                       if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1)
+                               return -1;
+                       ttisp->tt_abbrind = (unsigned char) *p++;
+                       if (ttisp->tt_abbrind < 0 ||
+                               ttisp->tt_abbrind > sp->charcnt)
+                                       return -1;
+               }
+               for (i = 0; i < sp->charcnt; ++i)
+                       sp->chars[i] = *p++;
+               sp->chars[i] = '\0';    /* ensure '\0' at end */
+               for (i = 0; i < sp->leapcnt; ++i) {
+                       register struct lsinfo *        lsisp;
+
+                       lsisp = &sp->lsis[i];
+                       lsisp->ls_trans = detzcode(p);
+                       p += 4;
+                       lsisp->ls_corr = detzcode(p);
+                       p += 4;
+               }
+               for (i = 0; i < sp->typecnt; ++i) {
+                       register struct ttinfo *        ttisp;
+
+                       ttisp = &sp->ttis[i];
+                       if (ttisstdcnt == 0)
+                               ttisp->tt_ttisstd = FALSE;
+                       else {
+                               ttisp->tt_ttisstd = *p++;
+                               if (ttisp->tt_ttisstd != TRUE &&
+                                       ttisp->tt_ttisstd != FALSE)
+                                               return -1;
+                       }
+               }
+               for (i = 0; i < sp->typecnt; ++i) {
+                       register struct ttinfo *        ttisp;
+
+                       ttisp = &sp->ttis[i];
+                       if (ttisgmtcnt == 0)
+                               ttisp->tt_ttisgmt = FALSE;
+                       else {
+                               ttisp->tt_ttisgmt = *p++;
+                               if (ttisp->tt_ttisgmt != TRUE &&
+                                       ttisp->tt_ttisgmt != FALSE)
+                                               return -1;
+                       }
+               }
+               /*
+               ** Out-of-sort ats should mean we're running on a
+               ** signed time_t system but using a data file with
+               ** unsigned values (or vice versa).
+               */
+               for (i = 0; i < sp->timecnt - 2; ++i)
+                       if (sp->ats[i] > sp->ats[i + 1]) {
+                               ++i;
+                               if (TYPE_SIGNED(time_t)) {
+                                       /*
+                                       ** Ignore the end (easy).
+                                       */
+                                       sp->timecnt = i;
+                               } else {
+                                       /*
+                                       ** Ignore the beginning (harder).
+                                       */
+                                       register int    j;
+
+                                       for (j = 0; j + i < sp->timecnt; ++j) {
+                                               sp->ats[j] = sp->ats[j + i];
+                                               sp->types[j] = sp->types[j + i];
+                                       }
+                                       sp->timecnt = j;
+                               }
+                               break;
+                       }
+       }
+       return 0;
+}
+
+static const int       mon_lengths[2][MONSPERYEAR] = {
+       { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+       { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+static const int       year_lengths[2] = {
+       DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+/*
+** Given a pointer into a time zone string, scan until a character that is not
+** a valid character in a zone name is found. Return a pointer to that
+** character.
+*/
+
+static const char *
+getzname(strp)
+register const char *  strp;
+{
+       register char   c;
+
+       while ((c = *strp) != '\0' && !is_digit(c) && c != ',' && c != '-' &&
+               c != '+')
+                       ++strp;
+       return strp;
+}
+
+/*
+** Given a pointer into an extended time zone string, scan until the ending
+** delimiter of the zone name is located.   Return a pointer to the delimiter.
+**
+** As with getzname above, the legal character set is actually quite
+** restricted, with other characters producing undefined results.
+** We choose not to care - allowing almost anything to be in the zone abbrev.
+*/
+
+static const char *
+#if __STDC__
+getqzname(register const char *strp, const char delim)
+#else /* !__STDC__ */
+getqzname(strp, delim)
+register const char *  strp;
+const char             delim;
+#endif /* !__STDC__ */
+{
+       register char   c;
+
+       while ((c = *strp) != '\0' && c != delim)
+               ++strp;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number from that string.
+** Check that the number is within a specified range; if it is not, return
+** NULL.
+** Otherwise, return a pointer to the first character not part of the number.
+*/
+
+static const char *
+getnum(strp, nump, min, max)
+register const char *  strp;
+int * const            nump;
+const int              min;
+const int              max;
+{
+       register char   c;
+       register int    num;
+
+       if (strp == NULL || !is_digit(c = *strp))
+               return NULL;
+       num = 0;
+       do {
+               num = num * 10 + (c - '0');
+               if (num > max)
+                       return NULL;    /* illegal value */
+               c = *++strp;
+       } while (is_digit(c));
+       if (num < min)
+               return NULL;            /* illegal value */
+       *nump = num;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a number of seconds,
+** in hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the number
+** of seconds.
+*/
+
+static const char *
+getsecs(strp, secsp)
+register const char *  strp;
+long * const           secsp;
+{
+       int     num;
+
+       /*
+       ** `HOURSPERDAY * DAYSPERWEEK - 1' allows quasi-Posix rules like
+       ** "M10.4.6/26", which does not conform to Posix,
+       ** but which specifies the equivalent of
+       ** ``02:00 on the first Sunday on or after 23 Oct''.
+       */
+       strp = getnum(strp, &num, 0, HOURSPERDAY * DAYSPERWEEK - 1);
+       if (strp == NULL)
+               return NULL;
+       *secsp = num * (long) SECSPERHOUR;
+       if (*strp == ':') {
+               ++strp;
+               strp = getnum(strp, &num, 0, MINSPERHOUR - 1);
+               if (strp == NULL)
+                       return NULL;
+               *secsp += num * SECSPERMIN;
+               if (*strp == ':') {
+                       ++strp;
+                       /* `SECSPERMIN' allows for leap seconds. */
+                       strp = getnum(strp, &num, 0, SECSPERMIN);
+                       if (strp == NULL)
+                               return NULL;
+                       *secsp += num;
+               }
+       }
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract an offset, in
+** [+-]hh[:mm[:ss]] form, from the string.
+** If any error occurs, return NULL.
+** Otherwise, return a pointer to the first character not part of the time.
+*/
+
+static const char *
+getoffset(strp, offsetp)
+register const char *  strp;
+long * const           offsetp;
+{
+       register int    neg = 0;
+
+       if (*strp == '-') {
+               neg = 1;
+               ++strp;
+       } else if (*strp == '+')
+               ++strp;
+       strp = getsecs(strp, offsetp);
+       if (strp == NULL)
+               return NULL;            /* illegal time */
+       if (neg)
+               *offsetp = -*offsetp;
+       return strp;
+}
+
+/*
+** Given a pointer into a time zone string, extract a rule in the form
+** date[/time]. See POSIX section 8 for the format of "date" and "time".
+** If a valid rule is not found, return NULL.
+** Otherwise, return a pointer to the first character not part of the rule.
+*/
+
+static const char *
+getrule(strp, rulep)
+const char *                   strp;
+register struct rule * const   rulep;
+{
+       if (*strp == 'J') {
+               /*
+               ** Julian day.
+               */
+               rulep->r_type = JULIAN_DAY;
+               ++strp;
+               strp = getnum(strp, &rulep->r_day, 1, DAYSPERNYEAR);
+       } else if (*strp == 'M') {
+               /*
+               ** Month, week, day.
+               */
+               rulep->r_type = MONTH_NTH_DAY_OF_WEEK;
+               ++strp;
+               strp = getnum(strp, &rulep->r_mon, 1, MONSPERYEAR);
+               if (strp == NULL)
+                       return NULL;
+               if (*strp++ != '.')
+                       return NULL;
+               strp = getnum(strp, &rulep->r_week, 1, 5);
+               if (strp == NULL)
+                       return NULL;
+               if (*strp++ != '.')
+                       return NULL;
+               strp = getnum(strp, &rulep->r_day, 0, DAYSPERWEEK - 1);
+       } else if (is_digit(*strp)) {
+               /*
+               ** Day of year.
+               */
+               rulep->r_type = DAY_OF_YEAR;
+               strp = getnum(strp, &rulep->r_day, 0, DAYSPERLYEAR - 1);
+       } else  return NULL;            /* invalid format */
+       if (strp == NULL)
+               return NULL;
+       if (*strp == '/') {
+               /*
+               ** Time specified.
+               */
+               ++strp;
+               strp = getsecs(strp, &rulep->r_time);
+       } else  rulep->r_time = 2 * SECSPERHOUR;        /* default = 2:00:00 */
+       return strp;
+}
+
+/*
+** Given the Epoch-relative time of January 1, 00:00:00 UTC, in a year, the
+** year, a rule, and the offset from UTC at the time that rule takes effect,
+** calculate the Epoch-relative time that rule takes effect.
+*/
+
+static time_t
+transtime(janfirst, year, rulep, offset)
+const time_t                           janfirst;
+const int                              year;
+register const struct rule * const     rulep;
+const long                             offset;
+{
+       register int    leapyear;
+       register time_t value;
+       register int    i;
+       int             d, m1, yy0, yy1, yy2, dow;
+
+       INITIALIZE(value);
+       leapyear = isleap(year);
+       switch (rulep->r_type) {
+
+       case JULIAN_DAY:
+               /*
+               ** Jn - Julian day, 1 == January 1, 60 == March 1 even in leap
+               ** years.
+               ** In non-leap years, or if the day number is 59 or less, just
+               ** add SECSPERDAY times the day number-1 to the time of
+               ** January 1, midnight, to get the day.
+               */
+               value = janfirst + (rulep->r_day - 1) * SECSPERDAY;
+               if (leapyear && rulep->r_day >= 60)
+                       value += SECSPERDAY;
+               break;
+
+       case DAY_OF_YEAR:
+               /*
+               ** n - day of year.
+               ** Just add SECSPERDAY times the day number to the time of
+               ** January 1, midnight, to get the day.
+               */
+               value = janfirst + rulep->r_day * SECSPERDAY;
+               break;
+
+       case MONTH_NTH_DAY_OF_WEEK:
+               /*
+               ** Mm.n.d - nth "dth day" of month m.
+               */
+               value = janfirst;
+               for (i = 0; i < rulep->r_mon - 1; ++i)
+                       value += mon_lengths[leapyear][i] * SECSPERDAY;
+
+               /*
+               ** Use Zeller's Congruence to get day-of-week of first day of
+               ** month.
+               */
+               m1 = (rulep->r_mon + 9) % 12 + 1;
+               yy0 = (rulep->r_mon <= 2) ? (year - 1) : year;
+               yy1 = yy0 / 100;
+               yy2 = yy0 % 100;
+               dow = ((26 * m1 - 2) / 10 +
+                       1 + yy2 + yy2 / 4 + yy1 / 4 - 2 * yy1) % 7;
+               if (dow < 0)
+                       dow += DAYSPERWEEK;
+
+               /*
+               ** "dow" is the day-of-week of the first day of the month. Get
+               ** the day-of-month (zero-origin) of the first "dow" day of the
+               ** month.
+               */
+               d = rulep->r_day - dow;
+               if (d < 0)
+                       d += DAYSPERWEEK;
+               for (i = 1; i < rulep->r_week; ++i) {
+                       if (d + DAYSPERWEEK >=
+                               mon_lengths[leapyear][rulep->r_mon - 1])
+                                       break;
+                       d += DAYSPERWEEK;
+               }
+
+               /*
+               ** "d" is the day-of-month (zero-origin) of the day we want.
+               */
+               value += d * SECSPERDAY;
+               break;
+       }
+
+       /*
+       ** "value" is the Epoch-relative time of 00:00:00 UTC on the day in
+       ** question. To get the Epoch-relative time of the specified local
+       ** time on that day, add the transition time and the current offset
+       ** from UTC.
+       */
+       return value + rulep->r_time + offset;
+}
+
+/*
+** Given a POSIX section 8-style TZ string, fill in the rule tables as
+** appropriate.
+*/
+
+static int
+tzparse(name, sp, lastditch)
+const char *                   name;
+register struct state * const  sp;
+const int                      lastditch;
+{
+       const char *                    stdname;
+       const char *                    dstname;
+       size_t                          stdlen;
+       size_t                          dstlen;
+       long                            stdoffset;
+       long                            dstoffset;
+       register time_t *               atp;
+       register unsigned char *        typep;
+       register char *                 cp;
+       register int                    load_result;
+
+       INITIALIZE(dstname);
+       stdname = name;
+       if (lastditch) {
+               stdlen = strlen(name);  /* length of standard zone name */
+               name += stdlen;
+               if (stdlen >= sizeof sp->chars)
+                       stdlen = (sizeof sp->chars) - 1;
+               stdoffset = 0;
+       } else {
+               if (*name == '<') {
+                       name++;
+                       stdname = name;
+                       name = getqzname(name, '>');
+                       if (*name != '>')
+                               return (-1);
+                       stdlen = name - stdname;
+                       name++;
+               } else {
+                       name = getzname(name);
+                       stdlen = name - stdname;
+               }
+               if (*name == '\0')
+                       return -1;
+               name = getoffset(name, &stdoffset);
+               if (name == NULL)
+                       return -1;
+       }
+       load_result = tzload(TZDEFRULES, sp);
+       if (load_result != 0)
+               sp->leapcnt = 0;                /* so, we're off a little */
+       if (*name != '\0') {
+               if (*name == '<') {
+                       dstname = ++name;
+                       name = getqzname(name, '>');
+                       if (*name != '>')
+                               return -1;
+                       dstlen = name - dstname;
+                       name++;
+               } else {
+                       dstname = name;
+                       name = getzname(name);
+                       dstlen = name - dstname; /* length of DST zone name */
+               }
+               if (*name != '\0' && *name != ',' && *name != ';') {
+                       name = getoffset(name, &dstoffset);
+                       if (name == NULL)
+                               return -1;
+               } else  dstoffset = stdoffset - SECSPERHOUR;
+               if (*name == '\0' && load_result != 0)
+                       name = TZDEFRULESTRING;
+               if (*name == ',' || *name == ';') {
+                       struct rule     start;
+                       struct rule     end;
+                       register int    year;
+                       register time_t janfirst;
+                       time_t          starttime;
+                       time_t          endtime;
+
+                       ++name;
+                       if ((name = getrule(name, &start)) == NULL)
+                               return -1;
+                       if (*name++ != ',')
+                               return -1;
+                       if ((name = getrule(name, &end)) == NULL)
+                               return -1;
+                       if (*name != '\0')
+                               return -1;
+                       sp->typecnt = 2;        /* standard time and DST */
+                       /*
+                       ** Two transitions per year, from EPOCH_YEAR to 2037.
+                       */
+                       sp->timecnt = 2 * (2037 - EPOCH_YEAR + 1);
+                       if (sp->timecnt > TZ_MAX_TIMES)
+                               return -1;
+                       sp->ttis[0].tt_gmtoff = -dstoffset;
+                       sp->ttis[0].tt_isdst = 1;
+                       sp->ttis[0].tt_abbrind = stdlen + 1;
+                       sp->ttis[1].tt_gmtoff = -stdoffset;
+                       sp->ttis[1].tt_isdst = 0;
+                       sp->ttis[1].tt_abbrind = 0;
+                       atp = sp->ats;
+                       typep = sp->types;
+                       janfirst = 0;
+                       for (year = EPOCH_YEAR; year <= 2037; ++year) {
+                               starttime = transtime(janfirst, year, &start,
+                                       stdoffset);
+                               endtime = transtime(janfirst, year, &end,
+                                       dstoffset);
+                               if (starttime > endtime) {
+                                       *atp++ = endtime;
+                                       *typep++ = 1;   /* DST ends */
+                                       *atp++ = starttime;
+                                       *typep++ = 0;   /* DST begins */
+                               } else {
+                                       *atp++ = starttime;
+                                       *typep++ = 0;   /* DST begins */
+                                       *atp++ = endtime;
+                                       *typep++ = 1;   /* DST ends */
+                               }
+                               janfirst += year_lengths[isleap(year)] *
+                                       SECSPERDAY;
+                       }
+               } else {
+                       register long   theirstdoffset;
+                       register long   theirdstoffset;
+                       register long   theiroffset;
+                       register int    isdst;
+                       register int    i;
+                       register int    j;
+
+                       if (*name != '\0')
+                               return -1;
+                       /*
+                       ** Initial values of theirstdoffset and theirdstoffset.
+                       */
+                       theirstdoffset = 0;
+                       for (i = 0; i < sp->timecnt; ++i) {
+                               j = sp->types[i];
+                               if (!sp->ttis[j].tt_isdst) {
+                                       theirstdoffset =
+                                               -sp->ttis[j].tt_gmtoff;
+                                       break;
+                               }
+                       }
+                       theirdstoffset = 0;
+                       for (i = 0; i < sp->timecnt; ++i) {
+                               j = sp->types[i];
+                               if (sp->ttis[j].tt_isdst) {
+                                       theirdstoffset =
+                                               -sp->ttis[j].tt_gmtoff;
+                                       break;
+                               }
+                       }
+                       /*
+                       ** Initially we're assumed to be in standard time.
+                       */
+                       isdst = FALSE;
+                       theiroffset = theirstdoffset;
+                       /*
+                       ** Now juggle transition times and types
+                       ** tracking offsets as you do.
+                       */
+                       for (i = 0; i < sp->timecnt; ++i) {
+                               j = sp->types[i];
+                               sp->types[i] = sp->ttis[j].tt_isdst;
+                               if (sp->ttis[j].tt_ttisgmt) {
+                                       /* No adjustment to transition time */
+                               } else {
+                                       /*
+                                       ** If summer time is in effect, and the
+                                       ** transition time was not specified as
+                                       ** standard time, add the summer time
+                                       ** offset to the transition time;
+                                       ** otherwise, add the standard time
+                                       ** offset to the transition time.
+                                       */
+                                       /*
+                                       ** Transitions from DST to DDST
+                                       ** will effectively disappear since
+                                       ** POSIX provides for only one DST
+                                       ** offset.
+                                       */
+                                       if (isdst && !sp->ttis[j].tt_ttisstd) {
+                                               sp->ats[i] += dstoffset -
+                                                       theirdstoffset;
+                                       } else {
+                                               sp->ats[i] += stdoffset -
+                                                       theirstdoffset;
+                                       }
+                               }
+                               theiroffset = -sp->ttis[j].tt_gmtoff;
+                               if (sp->ttis[j].tt_isdst)
+                                       theirdstoffset = theiroffset;
+                               else    theirstdoffset = theiroffset;
+                       }
+                       /*
+                       ** Finally, fill in ttis.
+                       ** ttisstd and ttisgmt need not be handled.
+                       */
+                       sp->ttis[0].tt_gmtoff = -stdoffset;
+                       sp->ttis[0].tt_isdst = FALSE;
+                       sp->ttis[0].tt_abbrind = 0;
+                       sp->ttis[1].tt_gmtoff = -dstoffset;
+                       sp->ttis[1].tt_isdst = TRUE;
+                       sp->ttis[1].tt_abbrind = stdlen + 1;
+                       sp->typecnt = 2;
+               }
+       } else {
+               dstlen = 0;
+               sp->typecnt = 1;                /* only standard time */
+               sp->timecnt = 0;
+               sp->ttis[0].tt_gmtoff = -stdoffset;
+               sp->ttis[0].tt_isdst = 0;
+               sp->ttis[0].tt_abbrind = 0;
+       }
+       sp->charcnt = stdlen + 1;
+       if (dstlen != 0)
+               sp->charcnt += dstlen + 1;
+       if ((size_t) sp->charcnt > sizeof sp->chars)
+               return -1;
+       cp = sp->chars;
+       (void) strncpy(cp, stdname, stdlen);
+       cp += stdlen;
+       *cp++ = '\0';
+       if (dstlen != 0) {
+               (void) strncpy(cp, dstname, dstlen);
+               *(cp + dstlen) = '\0';
+       }
+       return 0;
+}
+
+static void
+gmtload(sp)
+struct state * const   sp;
+{
+       if (tzload(gmt, sp) != 0)
+               (void) tzparse(gmt, sp, TRUE);
+}
+
+#ifndef STD_INSPIRED
+/*
+** A non-static declaration of tzsetwall in a system header file
+** may cause a warning about this upcoming static declaration...
+*/
+static
+#endif /* !defined STD_INSPIRED */
+void
+tzsetwall P((void))
+{
+       if (lcl_is_set < 0)
+               return;
+       lcl_is_set = -1;
+
+#ifdef ALL_STATE
+       if (lclptr == NULL) {
+               lclptr = (struct state *) malloc(sizeof *lclptr);
+               if (lclptr == NULL) {
+                       settzname();    /* all we can do */
+                       return;
+               }
+       }
+#endif /* defined ALL_STATE */
+       if (tzload((char *) NULL, lclptr) != 0)
+               gmtload(lclptr);
+       settzname();
+}
+
+void
+tzset P((void))
+{
+       register const char *   name;
+
+       name = getenv("TZ");
+       if (name == NULL) {
+               tzsetwall();
+               return;
+       }
+
+       if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0)
+               return;
+       lcl_is_set = strlen(name) < sizeof lcl_TZname;
+       if (lcl_is_set)
+               (void) strcpy(lcl_TZname, name);
+
+#ifdef ALL_STATE
+       if (lclptr == NULL) {
+               lclptr = (struct state *) malloc(sizeof *lclptr);
+               if (lclptr == NULL) {
+                       settzname();    /* all we can do */
+                       return;
+               }
+       }
+#endif /* defined ALL_STATE */
+       if (*name == '\0') {
+               /*
+               ** User wants it fast rather than right.
+               */
+               lclptr->leapcnt = 0;            /* so, we're off a little */
+               lclptr->timecnt = 0;
+               lclptr->typecnt = 0;
+               lclptr->ttis[0].tt_isdst = 0;
+               lclptr->ttis[0].tt_gmtoff = 0;
+               lclptr->ttis[0].tt_abbrind = 0;
+               (void) strcpy(lclptr->chars, gmt);
+       } else if (tzload(name, lclptr) != 0)
+               if (name[0] == ':' || tzparse(name, lclptr, FALSE) != 0)
+                       (void) gmtload(lclptr);
+       settzname();
+}
+
+/*
+** The easy way to behave "as if no library function calls" localtime
+** is to not call it--so we drop its guts into "localsub", which can be
+** freely called. (And no, the PANS doesn't require the above behavior--
+** but it *is* desirable.)
+**
+** The unused offset argument is for the benefit of mktime variants.
+*/
+
+/*ARGSUSED*/
+static struct tm *
+localsub(timep, offset, tmp)
+const time_t * const   timep;
+const long             offset;
+struct tm * const      tmp;
+{
+       register struct state *         sp;
+       register const struct ttinfo *  ttisp;
+       register int                    i;
+       register struct tm *            result;
+       const time_t                    t = *timep;
+
+       sp = lclptr;
+#ifdef ALL_STATE
+       if (sp == NULL)
+               return gmtsub(timep, offset, tmp);
+#endif /* defined ALL_STATE */
+       if (sp->timecnt == 0 || t < sp->ats[0]) {
+               i = 0;
+               while (sp->ttis[i].tt_isdst)
+                       if (++i >= sp->typecnt) {
+                               i = 0;
+                               break;
+                       }
+       } else {
+               for (i = 1; i < sp->timecnt; ++i)
+                       if (t < sp->ats[i])
+                               break;
+               i = (int) sp->types[i - 1];
+       }
+       ttisp = &sp->ttis[i];
+       /*
+       ** To get (wrong) behavior that's compatible with System V Release 2.0
+       ** you'd replace the statement below with
+       **      t += ttisp->tt_gmtoff;
+       **      timesub(&t, 0L, sp, tmp);
+       */
+       result = timesub(&t, ttisp->tt_gmtoff, sp, tmp);
+       tmp->tm_isdst = ttisp->tt_isdst;
+       tzname[tmp->tm_isdst] = &sp->chars[ttisp->tt_abbrind];
+#ifdef TM_ZONE
+       tmp->TM_ZONE = &sp->chars[ttisp->tt_abbrind];
+#endif /* defined TM_ZONE */
+       return result;
+}
+
+struct tm *
+localtime(timep)
+const time_t * const   timep;
+{
+       tzset();
+       return localsub(timep, 0L, &tm);
+}
+
+/*
+** Re-entrant version of localtime.
+*/
+
+struct tm *
+localtime_r(timep, tmp)
+const time_t * const   timep;
+struct tm *            tmp;
+{
+       return localsub(timep, 0L, tmp);
+}
+
+/*
+** gmtsub is to gmtime as localsub is to localtime.
+*/
+
+static struct tm *
+gmtsub(timep, offset, tmp)
+const time_t * const   timep;
+const long             offset;
+struct tm * const      tmp;
+{
+       register struct tm *    result;
+
+       if (!gmt_is_set) {
+               gmt_is_set = TRUE;
+#ifdef ALL_STATE
+               gmtptr = (struct state *) malloc(sizeof *gmtptr);
+               if (gmtptr != NULL)
+#endif /* defined ALL_STATE */
+                       gmtload(gmtptr);
+       }
+       result = timesub(timep, offset, gmtptr, tmp);
+#ifdef TM_ZONE
+       /*
+       ** Could get fancy here and deliver something such as
+       ** "UTC+xxxx" or "UTC-xxxx" if offset is non-zero,
+       ** but this is no time for a treasure hunt.
+       */
+       if (offset != 0)
+               tmp->TM_ZONE = wildabbr;
+       else {
+#ifdef ALL_STATE
+               if (gmtptr == NULL)
+                       tmp->TM_ZONE = gmt;
+               else    tmp->TM_ZONE = gmtptr->chars;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+               tmp->TM_ZONE = gmtptr->chars;
+#endif /* State Farm */
+       }
+#endif /* defined TM_ZONE */
+       return result;
+}
+
+struct tm *
+gmtime(timep)
+const time_t * const   timep;
+{
+       return gmtsub(timep, 0L, &tm);
+}
+
+/*
+* Re-entrant version of gmtime.
+*/
+
+struct tm *
+gmtime_r(timep, tmp)
+const time_t * const   timep;
+struct tm *            tmp;
+{
+       return gmtsub(timep, 0L, tmp);
+}
+
+#ifdef STD_INSPIRED
+
+struct tm *
+offtime(timep, offset)
+const time_t * const   timep;
+const long             offset;
+{
+       return gmtsub(timep, offset, &tm);
+}
+
+#endif /* defined STD_INSPIRED */
+
+/*
+** Return the number of leap years through the end of the given year
+** where, to make the math easy, the answer for year zero is defined as zero.
+*/
+
+static int
+leaps_thru_end_of(y)
+register const int     y;
+{
+       return (y >= 0) ? (y / 4 - y / 100 + y / 400) :
+               -(leaps_thru_end_of(-(y + 1)) + 1);
+}
+
+static struct tm *
+timesub(timep, offset, sp, tmp)
+const time_t * const                   timep;
+const long                             offset;
+register const struct state * const    sp;
+register struct tm * const             tmp;
+{
+       register const struct lsinfo *  lp;
+       register time_t                 tdays;
+       register int                    idays;  /* unsigned would be so 2003 */
+       register long                   rem;
+       int                             y;
+       register const int *            ip;
+       register long                   corr;
+       register int                    hit;
+       register int                    i;
+
+       corr = 0;
+       hit = 0;
+#ifdef ALL_STATE
+       i = (sp == NULL) ? 0 : sp->leapcnt;
+#endif /* defined ALL_STATE */
+#ifndef ALL_STATE
+       i = sp->leapcnt;
+#endif /* State Farm */
+       while (--i >= 0) {
+               lp = &sp->lsis[i];
+               if (*timep >= lp->ls_trans) {
+                       if (*timep == lp->ls_trans) {
+                               hit = ((i == 0 && lp->ls_corr > 0) ||
+                                       lp->ls_corr > sp->lsis[i - 1].ls_corr);
+                               if (hit)
+                                       while (i > 0 &&
+                                               sp->lsis[i].ls_trans ==
+                                               sp->lsis[i - 1].ls_trans + 1 &&
+                                               sp->lsis[i].ls_corr ==
+                                               sp->lsis[i - 1].ls_corr + 1) {
+                                                       ++hit;
+                                                       --i;
+                                       }
+                       }
+                       corr = lp->ls_corr;
+                       break;
+               }
+       }
+       y = EPOCH_YEAR;
+       tdays = *timep / SECSPERDAY;
+       rem = *timep - tdays * SECSPERDAY;
+       while (tdays < 0 || tdays >= year_lengths[isleap(y)]) {
+               int             newy;
+               register time_t tdelta;
+               register int    idelta;
+               register int    leapdays;
+
+               tdelta = tdays / DAYSPERLYEAR;
+               idelta = tdelta;
+               if (tdelta - idelta >= 1 || idelta - tdelta >= 1)
+                       return NULL;
+               if (idelta == 0)
+                       idelta = (tdays < 0) ? -1 : 1;
+               newy = y;
+               if (increment_overflow(&newy, idelta))
+                       return NULL;
+               leapdays = leaps_thru_end_of(newy - 1) -
+                       leaps_thru_end_of(y - 1);
+               tdays -= ((time_t) newy - y) * DAYSPERNYEAR;
+               tdays -= leapdays;
+               y = newy;
+       }
+       {
+               register long   seconds;
+
+               seconds = tdays * SECSPERDAY + 0.5;
+               tdays = seconds / SECSPERDAY;
+               rem += seconds - tdays * SECSPERDAY;
+       }
+       /*
+       ** Given the range, we can now fearlessly cast...
+       */
+       idays = tdays;
+       rem += offset - corr;
+       while (rem < 0) {
+               rem += SECSPERDAY;
+               --idays;
+       }
+       while (rem >= SECSPERDAY) {
+               rem -= SECSPERDAY;
+               ++idays;
+       }
+       while (idays < 0) {
+               if (increment_overflow(&y, -1))
+                       return NULL;
+               idays += year_lengths[isleap(y)];
+       }
+       while (idays >= year_lengths[isleap(y)]) {
+               idays -= year_lengths[isleap(y)];
+               if (increment_overflow(&y, 1))
+                       return NULL;
+       }
+       tmp->tm_year = y;
+       if (increment_overflow(&tmp->tm_year, -TM_YEAR_BASE))
+               return NULL;
+       tmp->tm_yday = idays;
+       /*
+       ** The "extra" mods below avoid overflow problems.
+       */
+       tmp->tm_wday = EPOCH_WDAY +
+               ((y - EPOCH_YEAR) % DAYSPERWEEK) *
+               (DAYSPERNYEAR % DAYSPERWEEK) +
+               leaps_thru_end_of(y - 1) -
+               leaps_thru_end_of(EPOCH_YEAR - 1) +
+               idays;
+       tmp->tm_wday %= DAYSPERWEEK;
+       if (tmp->tm_wday < 0)
+               tmp->tm_wday += DAYSPERWEEK;
+       tmp->tm_hour = (int) (rem / SECSPERHOUR);
+       rem %= SECSPERHOUR;
+       tmp->tm_min = (int) (rem / SECSPERMIN);
+       /*
+       ** A positive leap second requires a special
+       ** representation. This uses "... ??:59:60" et seq.
+       */
+       tmp->tm_sec = (int) (rem % SECSPERMIN) + hit;
+       ip = mon_lengths[isleap(y)];
+       for (tmp->tm_mon = 0; idays >= ip[tmp->tm_mon]; ++(tmp->tm_mon))
+               idays -= ip[tmp->tm_mon];
+       tmp->tm_mday = (int) (idays + 1);
+       tmp->tm_isdst = 0;
+#ifdef TM_GMTOFF
+       tmp->TM_GMTOFF = offset;
+#endif /* defined TM_GMTOFF */
+       return tmp;
+}
+
+char *
+ctime(timep)
+const time_t * const   timep;
+{
+/*
+** Section 4.12.3.2 of X3.159-1989 requires that
+**     The ctime function converts the calendar time pointed to by timer
+**     to local time in the form of a string. It is equivalent to
+**             asctime(localtime(timer))
+*/
+       return asctime(localtime(timep));
+}
+
+char *
+ctime_r(timep, buf)
+const time_t * const   timep;
+char *                 buf;
+{
+       struct tm       mytm;
+
+       return asctime_r(localtime_r(timep, &mytm), buf);
+}
+
+/*
+** Adapted from code provided by Robert Elz, who writes:
+**     The "best" way to do mktime I think is based on an idea of Bob
+**     Kridle's (so its said...) from a long time ago.
+**     It does a binary search of the time_t space. Since time_t's are
+**     just 32 bits, its a max of 32 iterations (even at 64 bits it
+**     would still be very reasonable).
+*/
+
+#ifndef WRONG
+#define WRONG  (-1)
+#endif /* !defined WRONG */
+
+/*
+** Simplified normalize logic courtesy Paul Eggert.
+*/
+
+static int
+increment_overflow(number, delta)
+int *  number;
+int    delta;
+{
+       int     number0;
+
+       number0 = *number;
+       *number += delta;
+       return (*number < number0) != (delta < 0);
+}
+
+static int
+long_increment_overflow(number, delta)
+long * number;
+int    delta;
+{
+       long    number0;
+
+       number0 = *number;
+       *number += delta;
+       return (*number < number0) != (delta < 0);
+}
+
+static int
+normalize_overflow(tensptr, unitsptr, base)
+int * const    tensptr;
+int * const    unitsptr;
+const int      base;
+{
+       register int    tensdelta;
+
+       tensdelta = (*unitsptr >= 0) ?
+               (*unitsptr / base) :
+               (-1 - (-1 - *unitsptr) / base);
+       *unitsptr -= tensdelta * base;
+       return increment_overflow(tensptr, tensdelta);
+}
+
+static int
+long_normalize_overflow(tensptr, unitsptr, base)
+long * const   tensptr;
+int * const    unitsptr;
+const int      base;
+{
+       register int    tensdelta;
+
+       tensdelta = (*unitsptr >= 0) ?
+               (*unitsptr / base) :
+               (-1 - (-1 - *unitsptr) / base);
+       *unitsptr -= tensdelta * base;
+       return long_increment_overflow(tensptr, tensdelta);
+}
+
+static int
+tmcomp(atmp, btmp)
+register const struct tm * const atmp;
+register const struct tm * const btmp;
+{
+       register int    result;
+
+       if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&
+               (result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
+               (result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
+               (result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
+               (result = (atmp->tm_min - btmp->tm_min)) == 0)
+                       result = atmp->tm_sec - btmp->tm_sec;
+       return result;
+}
+
+static time_t
+time2sub(tmp, funcp, offset, okayp, do_norm_secs)
+struct tm * const      tmp;
+struct tm * (* const   funcp) P((const time_t*, long, struct tm*));
+const long             offset;
+int * const            okayp;
+const int              do_norm_secs;
+{
+       register const struct state *   sp;
+       register int                    dir;
+       register int                    i, j;
+       register int                    saved_seconds;
+       register long                   li;
+       register time_t                 lo;
+       register time_t                 hi;
+       long                            y;
+       time_t                          newt;
+       time_t                          t;
+       struct tm                       yourtm, mytm;
+
+       *okayp = FALSE;
+       yourtm = *tmp;
+       if (do_norm_secs) {
+               if (normalize_overflow(&yourtm.tm_min, &yourtm.tm_sec,
+                       SECSPERMIN))
+                               return WRONG;
+       }
+       if (normalize_overflow(&yourtm.tm_hour, &yourtm.tm_min, MINSPERHOUR))
+               return WRONG;
+       if (normalize_overflow(&yourtm.tm_mday, &yourtm.tm_hour, HOURSPERDAY))
+               return WRONG;
+       y = yourtm.tm_year;
+       if (long_normalize_overflow(&y, &yourtm.tm_mon, MONSPERYEAR))
+               return WRONG;
+       /*
+       ** Turn y into an actual year number for now.
+       ** It is converted back to an offset from TM_YEAR_BASE later.
+       */
+       if (long_increment_overflow(&y, TM_YEAR_BASE))
+               return WRONG;
+       while (yourtm.tm_mday <= 0) {
+               if (long_increment_overflow(&y, -1))
+                       return WRONG;
+               li = y + (1 < yourtm.tm_mon);
+               yourtm.tm_mday += year_lengths[isleap(li)];
+       }
+       while (yourtm.tm_mday > DAYSPERLYEAR) {
+               li = y + (1 < yourtm.tm_mon);
+               yourtm.tm_mday -= year_lengths[isleap(li)];
+               if (long_increment_overflow(&y, 1))
+                       return WRONG;
+       }
+       for ( ; ; ) {
+               i = mon_lengths[isleap(y)][yourtm.tm_mon];
+               if (yourtm.tm_mday <= i)
+                       break;
+               yourtm.tm_mday -= i;
+               if (++yourtm.tm_mon >= MONSPERYEAR) {
+                       yourtm.tm_mon = 0;
+                       if (long_increment_overflow(&y, 1))
+                               return WRONG;
+               }
+       }
+       if (long_increment_overflow(&y, -TM_YEAR_BASE))
+               return WRONG;
+       yourtm.tm_year = y;
+       if (yourtm.tm_year != y)
+               return WRONG;
+       if (yourtm.tm_sec >= 0 && yourtm.tm_sec < SECSPERMIN)
+               saved_seconds = 0;
+       else if (y + TM_YEAR_BASE < EPOCH_YEAR) {
+               /*
+               ** We can't set tm_sec to 0, because that might push the
+               ** time below the minimum representable time.
+               ** Set tm_sec to 59 instead.
+               ** This assumes that the minimum representable time is
+               ** not in the same minute that a leap second was deleted from,
+               ** which is a safer assumption than using 58 would be.
+               */
+               if (increment_overflow(&yourtm.tm_sec, 1 - SECSPERMIN))
+                       return WRONG;
+               saved_seconds = yourtm.tm_sec;
+               yourtm.tm_sec = SECSPERMIN - 1;
+       } else {
+               saved_seconds = yourtm.tm_sec;
+               yourtm.tm_sec = 0;
+       }
+       /*
+       ** Do a binary search (this works whatever time_t's type is).
+       */
+       if (!TYPE_SIGNED(time_t)) {
+               lo = 0;
+               hi = lo - 1;
+       } else if (!TYPE_INTEGRAL(time_t)) {
+               if (sizeof(time_t) > sizeof(float))
+                       hi = (time_t) DBL_MAX;
+               else    hi = (time_t) FLT_MAX;
+               lo = -hi;
+       } else {
+               lo = 1;
+               for (i = 0; i < (int) TYPE_BIT(time_t) - 1; ++i)
+                       lo *= 2;
+               hi = -(lo + 1);
+       }
+       for ( ; ; ) {
+               t = lo / 2 + hi / 2;
+               if (t < lo)
+                       t = lo;
+               else if (t > hi)
+                       t = hi;
+               if ((*funcp)(&t, offset, &mytm) == NULL) {
+                       /*
+                       ** Assume that t is too extreme to be represented in
+                       ** a struct tm; arrange things so that it is less
+                       ** extreme on the next pass.
+                       */
+                       dir = (t > 0) ? 1 : -1;
+               } else  dir = tmcomp(&mytm, &yourtm);
+               if (dir != 0) {
+                       if (t == lo) {
+                               ++t;
+                               if (t <= lo)
+                                       return WRONG;
+                               ++lo;
+                       } else if (t == hi) {
+                               --t;
+                               if (t >= hi)
+                                       return WRONG;
+                               --hi;
+                       }
+                       if (lo > hi)
+                               return WRONG;
+                       if (dir > 0)
+                               hi = t;
+                       else    lo = t;
+                       continue;
+               }
+               if (yourtm.tm_isdst < 0 || mytm.tm_isdst == yourtm.tm_isdst)
+                       break;
+               /*
+               ** Right time, wrong type.
+               ** Hunt for right time, right type.
+               ** It's okay to guess wrong since the guess
+               ** gets checked.
+               */
+               /*
+               ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.
+               */
+               sp = (const struct state *)
+                       (((void *) funcp == (void *) localsub) ?
+                       lclptr : gmtptr);
+#ifdef ALL_STATE
+               if (sp == NULL)
+                       return WRONG;
+#endif /* defined ALL_STATE */
+               for (i = sp->typecnt - 1; i >= 0; --i) {
+                       if (sp->ttis[i].tt_isdst != yourtm.tm_isdst)
+                               continue;
+                       for (j = sp->typecnt - 1; j >= 0; --j) {
+                               if (sp->ttis[j].tt_isdst == yourtm.tm_isdst)
+                                       continue;
+                               newt = t + sp->ttis[j].tt_gmtoff -
+                                       sp->ttis[i].tt_gmtoff;
+                               if ((*funcp)(&newt, offset, &mytm) == NULL)
+                                       continue;
+                               if (tmcomp(&mytm, &yourtm) != 0)
+                                       continue;
+                               if (mytm.tm_isdst != yourtm.tm_isdst)
+                                       continue;
+                               /*
+                               ** We have a match.
+                               */
+                               t = newt;
+                               goto label;
+                       }
+               }
+               return WRONG;
+       }
+label:
+       newt = t + saved_seconds;
+       if ((newt < t) != (saved_seconds < 0))
+               return WRONG;
+       t = newt;
+       if ((*funcp)(&t, offset, tmp))
+               *okayp = TRUE;
+       return t;
+}
+
+static time_t
+time2(tmp, funcp, offset, okayp)
+struct tm * const      tmp;
+struct tm * (* const   funcp) P((const time_t*, long, struct tm*));
+const long             offset;
+int * const            okayp;
+{
+       time_t  t;
+
+       /*
+       ** First try without normalization of seconds
+       ** (in case tm_sec contains a value associated with a leap second).
+       ** If that fails, try with normalization of seconds.
+       */
+       t = time2sub(tmp, funcp, offset, okayp, FALSE);
+       return *okayp ? t : time2sub(tmp, funcp, offset, okayp, TRUE);
+}
+
+static time_t
+time1(tmp, funcp, offset)
+struct tm * const      tmp;
+struct tm * (* const   funcp) P((const time_t *, long, struct tm *));
+const long             offset;
+{
+       register time_t                 t;
+       register const struct state *   sp;
+       register int                    samei, otheri;
+       register int                    sameind, otherind;
+       register int                    i;
+       register int                    nseen;
+       int                             seen[TZ_MAX_TYPES];
+       int                             types[TZ_MAX_TYPES];
+       int                             okay;
+
+       if (tmp->tm_isdst > 1)
+               tmp->tm_isdst = 1;
+       t = time2(tmp, funcp, offset, &okay);
+#ifdef PCTS
+       /*
+       ** PCTS code courtesy Grant Sullivan.
+       */
+       if (okay)
+               return t;
+       if (tmp->tm_isdst < 0)
+               tmp->tm_isdst = 0;      /* reset to std and try again */
+#endif /* defined PCTS */
+#ifndef PCTS
+       if (okay || tmp->tm_isdst < 0)
+               return t;
+#endif /* !defined PCTS */
+       /*
+       ** We're supposed to assume that somebody took a time of one type
+       ** and did some math on it that yielded a "struct tm" that's bad.
+       ** We try to divine the type they started from and adjust to the
+       ** type they need.
+       */
+       /*
+       ** The (void *) casts are the benefit of SunOS 3.3 on Sun 2's.
+       */
+       sp = (const struct state *) (((void *) funcp == (void *) localsub) ?
+               lclptr : gmtptr);
+#ifdef ALL_STATE
+       if (sp == NULL)
+               return WRONG;
+#endif /* defined ALL_STATE */
+       for (i = 0; i < sp->typecnt; ++i)
+               seen[i] = FALSE;
+       nseen = 0;
+       for (i = sp->timecnt - 1; i >= 0; --i)
+               if (!seen[sp->types[i]]) {
+                       seen[sp->types[i]] = TRUE;
+                       types[nseen++] = sp->types[i];
+               }
+       for (sameind = 0; sameind < nseen; ++sameind) {
+               samei = types[sameind];
+               if (sp->ttis[samei].tt_isdst != tmp->tm_isdst)
+                       continue;
+               for (otherind = 0; otherind < nseen; ++otherind) {
+                       otheri = types[otherind];
+                       if (sp->ttis[otheri].tt_isdst == tmp->tm_isdst)
+                               continue;
+                       tmp->tm_sec += sp->ttis[otheri].tt_gmtoff -
+                                       sp->ttis[samei].tt_gmtoff;
+                       tmp->tm_isdst = !tmp->tm_isdst;
+                       t = time2(tmp, funcp, offset, &okay);
+                       if (okay)
+                               return t;
+                       tmp->tm_sec -= sp->ttis[otheri].tt_gmtoff -
+                                       sp->ttis[samei].tt_gmtoff;
+                       tmp->tm_isdst = !tmp->tm_isdst;
+               }
+       }
+       return WRONG;
+}
+
+time_t
+mktime(tmp)
+struct tm * const      tmp;
+{
+       tzset();
+       return time1(tmp, localsub, 0L);
+}
+
+#ifdef STD_INSPIRED
+
+time_t
+timelocal(tmp)
+struct tm * const      tmp;
+{
+       tmp->tm_isdst = -1;     /* in case it wasn't initialized */
+       return mktime(tmp);
+}
+
+time_t
+timegm(tmp)
+struct tm * const      tmp;
+{
+       tmp->tm_isdst = 0;
+       return time1(tmp, gmtsub, 0L);
+}
+
+time_t
+timeoff(tmp, offset)
+struct tm * const      tmp;
+const long             offset;
+{
+       tmp->tm_isdst = 0;
+       return time1(tmp, gmtsub, offset);
+}
+
+#endif /* defined STD_INSPIRED */
+
+#ifdef CMUCS
+
+/*
+** The following is supplied for compatibility with
+** previous versions of the CMUCS runtime library.
+*/
+
+long
+gtime(tmp)
+struct tm * const      tmp;
+{
+       const time_t    t = mktime(tmp);
+
+       if (t == WRONG)
+               return -1;
+       return t;
+}
+
+#endif /* defined CMUCS */
+
+/*
+** XXX--is the below the right way to conditionalize??
+*/
+
+#ifdef STD_INSPIRED
+
+/*
+** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599
+** shall correspond to "Wed Dec 31 23:59:59 UTC 1986", which
+** is not the case if we are accounting for leap seconds.
+** So, we provide the following conversion routines for use
+** when exchanging timestamps with POSIX conforming systems.
+*/
+
+static long
+leapcorr(timep)
+time_t *       timep;
+{
+       register struct state *         sp;
+       register struct lsinfo *        lp;
+       register int                    i;
+
+       sp = lclptr;
+       i = sp->leapcnt;
+       while (--i >= 0) {
+               lp = &sp->lsis[i];
+               if (*timep >= lp->ls_trans)
+                       return lp->ls_corr;
+       }
+       return 0;
+}
+
+time_t
+time2posix(t)
+time_t t;
+{
+       tzset();
+       return t - leapcorr(&t);
+}
+
+time_t
+posix2time(t)
+time_t t;
+{
+       time_t  x;
+       time_t  y;
+
+       tzset();
+       /*
+       ** For a positive leap second hit, the result
+       ** is not unique. For a negative leap second
+       ** hit, the corresponding time doesn't exist,
+       ** so we return an adjacent second.
+       */
+       x = t + leapcorr(&t);
+       y = x - leapcorr(&x);
+       if (y < t) {
+               do {
+                       x++;
+                       y = x - leapcorr(&x);
+               } while (y < t);
+               if (t != y)
+                       return x - 1;
+       } else if (y > t) {
+               do {
+                       --x;
+                       y = x - leapcorr(&x);
+               } while (y > t);
+               if (t != y)
+                       return x + 1;
+       }
+       return x;
+}
+
+#endif /* defined STD_INSPIRED */
diff --git a/commands/zoneinfo/logwtmp.c b/commands/zoneinfo/logwtmp.c
new file mode 100644 (file)
index 0000000..d84ff33
--- /dev/null
@@ -0,0 +1,71 @@
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)logwtmp.c      7.7";
+/* As received from UCB, with include reordering and OLD_TIME condition. */
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANT[A]BILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+#ifdef LIBC_SCCS
+static char sccsid[] = "@(#)logwtmp.c  5.2 (Berkeley) 9/20/88";
+#endif /* defined LIBC_SCCS */
+#endif /* !defined lint */
+
+#include <sys/types.h>
+#include <utmp.h>
+
+#ifdef OLD_TIME
+
+char dummy_to_keep_linker_happy;
+
+#endif /* defined OLD_TIME */
+
+#ifndef OLD_TIME
+
+#include <sys/file.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+
+#define WTMPFILE       "/usr/adm/wtmp"
+
+logwtmp(line, name, host)
+       char *line, *name, *host;
+{
+       struct utmp ut;
+       struct stat buf;
+       int fd;
+       time_t time();
+       char *strncpy();
+
+       if ((fd = open(WTMPFILE, O_WRONLY|O_APPEND, 0)) < 0)
+               return;
+       if (!fstat(fd, &buf)) {
+               (void)strncpy(ut.ut_line, line, sizeof(ut.ut_line));
+               (void)strncpy(ut.ut_name, name, sizeof(ut.ut_name));
+               (void)strncpy(ut.ut_host, host, sizeof(ut.ut_host));
+               (void)time(&ut.ut_time);
+               if (write(fd, (char *)&ut, sizeof(struct utmp)) !=
+                       sizeof(struct utmp))
+                               (void)ftruncate(fd, buf.st_size);
+       }
+       (void)close(fd);
+}
+
+#endif /* !defined OLD_TIME */
diff --git a/commands/zoneinfo/newctime.3 b/commands/zoneinfo/newctime.3
new file mode 100644 (file)
index 0000000..7fcf04f
--- /dev/null
@@ -0,0 +1,237 @@
+.TH NEWCTIME 3
+.SH NAME
+asctime, ctime, difftime, gmtime, localtime, mktime \- convert date and time to ASCII
+.SH SYNOPSIS
+.nf
+.B extern char *tzname[2];
+.PP
+.B void tzset()
+.PP
+.B #include <sys/types.h>
+.PP
+.B char *ctime(clock)
+.B const time_t *clock;
+.PP
+.B double difftime(time1, time0)
+.B time_t time1;
+.B time_t time0;
+.PP
+.B #include <time.h>
+.PP
+.B char *asctime(tm)
+.B const struct tm *tm;
+.PP
+.B struct tm *localtime(clock)
+.B const time_t *clock;
+.PP
+.B struct tm *gmtime(clock)
+.B const time_t *clock;
+.PP
+.B time_t mktime(tm)
+.B struct tm *tm;
+.PP
+.B cc ... -ltz
+.fi
+.SH DESCRIPTION
+.I Ctime\^
+converts a long integer, pointed to by
+.IR clock ,
+representing the time in seconds since
+00:00:00 UTC, 1970-01-01,
+and returns a pointer to a
+string of the form
+.br
+.ce
+.eo
+Thu Nov 24 18:22:48 1986\n\0
+.br
+.ec
+Years requiring fewer than four characters are padded with leading zeroes.
+For years longer than four characters, the string is of the form
+.br
+.ce
+.eo
+Thu Nov 24 18:22:48     81986\n\0
+.ec
+.br
+with five spaces before the year.
+These unusual formats are designed to make it less likely that older
+software that expects exactly 26 bytes of output will mistakenly output
+misleading values for out-of-range years.
+.PP
+.I Localtime\^
+and
+.I gmtime\^
+return pointers to ``tm'' structures, described below.
+.I Localtime\^
+corrects for the time zone and any time zone adjustments
+(such as Daylight Saving Time in the United States).
+After filling in the ``tm'' structure,
+.I localtime
+sets the
+.BR tm_isdst 'th
+element of
+.B tzname
+to a pointer to an
+ASCII string that's the time zone abbreviation to be used with
+.IR localtime 's
+return value.
+.PP
+.I Gmtime\^
+converts to Coordinated Universal Time.
+.PP
+.I Asctime\^
+converts a time value contained in a
+``tm'' structure to a string,
+as shown in the above example,
+and returns a pointer to the string.
+.PP
+.I Mktime\^
+converts the broken-down time,
+expressed as local time,
+in the structure pointed to by
+.I tm
+into a calendar time value with the same encoding as that of the values
+returned by the
+.I time
+function.
+The original values of the
+.B tm_wday
+and
+.B tm_yday
+components of the structure are ignored,
+and the original values of the other components are not restricted
+to their normal ranges.
+(A positive or zero value for
+.B tm_isdst
+causes
+.I mktime
+to presume initially that summer time (for example, Daylight Saving Time
+in the U.S.A.)
+respectively,
+is or is not in effect for the specified time.
+A negative value for
+.B tm_isdst
+causes the
+.I mktime
+function to attempt to divine whether summer time is in effect
+for the specified time.)
+On successful completion, the values of the
+.B tm_wday
+and
+.B tm_yday
+components of the structure are set appropriately,
+and the other components are set to represent the specified calendar time,
+but with their values forced to their normal ranges; the final value of
+.B tm_mday
+is not set until
+.B tm_mon
+and
+.B tm_year
+are determined.
+.I Mktime\^
+returns the specified calendar time;
+If the calendar time cannot be represented,
+it returns
+.BR -1 .
+.PP
+.I Difftime\^
+returns the difference between two calendar times,
+.RI ( time1
+-
+.IR time0 ),
+expressed in seconds.
+.PP
+Declarations of all the functions and externals, and the ``tm'' structure,
+are in the
+.B <time.h>\^
+header file.
+The structure (of type)
+.B struct tm
+includes the following fields:
+.RS
+.PP
+.nf
+.ta .5i +\w'long tm_gmtoff;\0\0'u
+       int tm_sec;     /\(** seconds (0 - 60) \(**/
+       int tm_min;     /\(** minutes (0 - 59) \(**/
+       int tm_hour;    /\(** hours (0 - 23) \(**/
+       int tm_mday;    /\(** day of month (1 - 31) \(**/
+       int tm_mon;     /\(** month of year (0 - 11) \(**/
+       int tm_year;    /\(** year \- 1900 \(**/
+       int tm_wday;    /\(** day of week (Sunday = 0) \(**/
+       int tm_yday;    /\(** day of year (0 - 365) \(**/
+       int tm_isdst;   /\(** is summer time in effect? \(**/
+       char \(**tm_zone;       /\(** abbreviation of timezone name \(**/
+       long tm_gmtoff; /\(** offset from UTC in seconds \(**/
+.fi
+.RE
+.PP
+The
+.I tm_zone
+and
+.I tm_gmtoff
+fields exist, and are filled in, only if arrangements to do
+so were made when the library containing these functions was
+created.
+There is no guarantee that these fields will continue to exist
+in this form in future releases of this code.
+.PP
+.I Tm_isdst\^
+is non-zero if summer time is in effect.
+.PP
+.I Tm_gmtoff
+is the offset (in seconds) of the time represented
+from UTC, with positive values indicating east
+of the Prime Meridian.
+.SH FILES
+.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
+/usr/local/etc/zoneinfo        time zone information directory
+.br
+/usr/local/etc/zoneinfo/localtime      local time zone file
+.br
+/usr/local/etc/zoneinfo/posixrules     used with POSIX-style TZ's
+.br
+/usr/local/etc/zoneinfo/GMT    for UTC leap seconds
+.sp
+If
+.B /usr/local/etc/zoneinfo/GMT
+is absent,
+UTC leap seconds are loaded from
+.BR /usr/local/etc/zoneinfo/posixrules .
+.SH SEE ALSO
+getenv(3),
+newstrftime(3),
+newtzset(3),
+time(2),
+tzfile(5)
+.SH NOTES
+The return values point to static data;
+the data is overwritten by each call.
+The
+.B tm_zone
+field of a returned
+.B "struct tm"
+points to a static array of characters, which
+will also be overwritten at the next call
+(and by calls to
+.IR tzset ).
+.PP
+.I Asctime\^
+and
+.I ctime\^
+behave strangely for years before 1000 or after 9999.
+The 1989 and 1999 editions of the C Standard say
+that years from \-99 through 999 are converted without
+extra spaces, but this conflicts with longstanding
+tradition and with this implementation.
+Traditional implementations of these two functions are
+restricted to years in the range 1900 through 2099.
+To avoid this portability mess, new programs should use
+.I strftime\^
+instead.
+.PP
+Avoid using out-of-range values with
+.I mktime
+when setting up lunch with promptness sticklers in Riyadh.
+.\" @(#)newctime.3     7.17
diff --git a/commands/zoneinfo/newctime.3.txt b/commands/zoneinfo/newctime.3.txt
new file mode 100644 (file)
index 0000000..b9f3be8
--- /dev/null
@@ -0,0 +1,147 @@
+NAME
+
+     asctime, ctime, difftime, gmtime, localtime, mktime -
+     convert date and time to ASCII
+
+SYNOPSIS
+     extern char *tzname[2];
+
+     void tzset()
+
+     #include <sys/types.h>
+
+     char *ctime(clock)
+     const time_t *clock;
+
+     double difftime(time1, time0)
+     time_t time1;
+     time_t time0;
+
+     #include <time.h>
+
+     char *asctime(tm)
+     const struct tm *tm;
+
+     struct tm *localtime(clock)
+     const time_t *clock;
+
+     struct tm *gmtime(clock)
+     const time_t *clock;
+
+     time_t mktime(tm)
+     struct tm *tm;
+
+     cc ... -ltz
+
+DESCRIPTION
+     Ctime converts a long integer, pointed to by clock,
+     representing the time in seconds since 00:00:00 UTC, 1970-
+     01-01, and returns a pointer to a string of the form
+                     Thu Nov 24 18:22:48 1986\n\0
+     Years requiring fewer than four characters are padded with
+     leading zeroes.  For years longer than four characters, the
+     string is of the form
+                  Thu Nov 24 18:22:48     81986\n\0
+     with five spaces before the year.  These unusual formats are
+     designed to make it less likely that older software that
+     expects exactly 26 bytes of output will mistakenly output
+     misleading values for out-of-range years.
+
+     Localtime and gmtime return pointers to ``tm'' structures,
+     described below.  Localtime corrects for the time zone and
+     any time zone adjustments (such as Daylight Saving Time in
+     the United States).  After filling in the ``tm'' structure,
+     localtime sets the tm_isdst'th element of tzname to a
+     pointer to an ASCII string that's the time zone abbreviation
+     to be used with localtime's return value.
+
+     Gmtime converts to Coordinated Universal Time.
+
+     Asctime converts a time value contained in a ``tm''
+     structure to a string, as shown in the above example, and
+     returns a pointer to the string.
+
+     Mktime converts the broken-down time, expressed as local
+     time, in the structure pointed to by tm into a calendar time
+     value with the same encoding as that of the values returned
+     by the time function.  The original values of the tm_wday
+     and tm_yday components of the structure are ignored, and the
+     original values of the other components are not restricted
+     to their normal ranges.  (A positive or zero value for
+     tm_isdst causes mktime to presume initially that summer time
+     (for example, Daylight Saving Time in the U.S.A.)
+     respectively, is or is not in effect for the specified time.
+     A negative value for tm_isdst causes the mktime function to
+     attempt to divine whether summer time is in effect for the
+     specified time.)  On successful completion, the values of
+     the tm_wday and tm_yday components of the structure are set
+     appropriately, and the other components are set to represent
+     the specified calendar time, but with their values forced to
+     their normal ranges; the final value of tm_mday is not set
+     until tm_mon and tm_year are determined.  Mktime returns the
+     specified calendar time; If the calendar time cannot be
+     represented, it returns -1.
+
+     Difftime returns the difference between two calendar times,
+     (time1 - time0), expressed in seconds.
+
+     Declarations of all the functions and externals, and the
+     ``tm'' structure, are in the <time.h> header file.  The
+     structure (of type) struct tm includes the following fields:
+
+               int tm_sec;      /* seconds (0 - 60) */
+               int tm_min;      /* minutes (0 - 59) */
+               int tm_hour;     /* hours (0 - 23) */
+               int tm_mday;     /* day of month (1 - 31) */
+               int tm_mon;      /* month of year (0 - 11) */
+               int tm_year;     /* year - 1900 */
+               int tm_wday;     /* day of week (Sunday = 0) */
+               int tm_yday;     /* day of year (0 - 365) */
+               int tm_isdst;    /* is summer time in effect? */
+               char *tm_zone;   /* abbreviation of timezone name */
+               long tm_gmtoff;  /* offset from UTC in seconds */
+
+     The tm_zone and tm_gmtoff fields exist, and are filled in,
+     only if arrangements to do so were made when the library
+     containing these functions was created.  There is no
+     guarantee that these fields will continue to exist in this
+     form in future releases of this code.
+
+     Tm_isdst is non-zero if summer time is in effect.
+
+     Tm_gmtoff is the offset (in seconds) of the time represented
+     from UTC, with positive values indicating east of the Prime
+     Meridian.
+
+FILES
+     /usr/local/etc/zoneinfo             time zone information
+     directory
+     /usr/local/etc/zoneinfo/localtime   local time zone file
+     /usr/local/etc/zoneinfo/posixrules  used with POSIX-style
+     TZ's
+     /usr/local/etc/zoneinfo/GMT         for UTC leap seconds
+
+     If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds
+     are loaded from /usr/local/etc/zoneinfo/posixrules.
+
+SEE ALSO
+     getenv(3), newstrftime(3), newtzset(3), time(2), tzfile(5)
+
+NOTES
+     The return values point to static data; the data is
+     overwritten by each call.  The tm_zone field of a returned
+     struct tm points to a static array of characters, which will
+     also be overwritten at the next call (and by calls to
+     tzset).
+
+     Asctime and ctime behave strangely for years before 1000 or
+     after 9999.  The 1989 and 1999 editions of the C Standard
+     say that years from -99 through 999 are converted without
+     extra spaces, but this conflicts with longstanding tradition
+     and with this implementation.  Traditional implementations
+     of these two functions are restricted to years in the range
+     1900 through 2099.  To avoid this portability mess, new
+     programs should use strftime instead.
+
+     Avoid using out-of-range values with mktime when setting up
+     lunch with promptness sticklers in Riyadh.
diff --git a/commands/zoneinfo/newstrftime.3 b/commands/zoneinfo/newstrftime.3
new file mode 100644 (file)
index 0000000..19db8ea
--- /dev/null
@@ -0,0 +1,230 @@
+.\" Based on the UCB file whose copyright information appears below.
+.\" Copyright (c) 1989, 1991 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to Berkeley by
+.\" the American National Standards Committee X3, on Information
+.\" Processing Systems.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"    This product includes software developed by the University of
+.\"    California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     from: @(#)strftime.3   5.12 (Berkeley) 6/29/91
+.\"    $Id: strftime.3,v 1.4 1993/12/15 20:33:00 jtc Exp $
+.\"
+.TH NEWSTRFTIME 3
+.SH NAME
+strftime \- format date and time
+.SH SYNOPSIS
+.nf
+.B #include <sys/types.h>
+.B #include <time.h>
+.PP
+.B size_t strftime(buf, maxsize, format, timeptr)
+.B char *buf;
+.B size_t maxsize;
+.B const char *format;
+.B const struct tm *timeptr
+.PP
+.B cc ... -ltz
+.fi
+.SH DESCRIPTION
+The
+.I strftime\^
+function formats the information from
+.I timeptr\^
+into the buffer
+.I buf\^
+according to the string pointed to by
+.IR format\^ .
+.PP
+The
+.I format\^
+string consists of zero or more conversion specifications and
+ordinary characters.
+All ordinary characters are copied directly into the buffer.
+A conversion specification consists of a percent sign
+.Ql %
+and one other character.
+.PP
+No more than
+.I maxsize\^
+characters are be placed into the array.
+If the total number of resulting characters, including the terminating
+null character, is not more than
+.IR maxsize\^ ,
+.I strftime\^
+returns the number of characters in the array, not counting the
+terminating null.
+Otherwise, zero is returned.
+.PP
+Each conversion specification is replaced by the characters as
+follows which are then copied into the buffer.
+.TP
+%A
+is replaced by the locale's full weekday name.
+.TP
+%a
+is replaced by the locale's abbreviated weekday name.
+.TP
+%B
+is replaced by the locale's full month name.
+.TP
+%b or %h
+is replaced by the locale's abbreviated month name.
+.TP
+%C
+is replaced by the century (a year divided by 100 and truncated to an integer)
+as a decimal number (00-99).
+.TP
+%c
+is replaced by the locale's appropriate date and time representation.
+.TP
+%D
+is replaced by the date in the format %m/%d/%y.
+.TP
+%d
+is replaced by the day of the month as a decimal number (01-31).
+.TP
+%e
+is replaced by the day of month as a decimal number (1-31);
+single digits are preceded by a blank.
+.TP
+%F
+is replaced by the date in the format %Y-%m-%d.
+.TP
+%G
+is replaced by the ISO 8601 year with century as a decimal number.
+.TP
+%g
+is replaced by the ISO 8601 year without century as a decimal number (00-99).
+.TP
+%H
+is replaced by the hour (24-hour clock) as a decimal number (00-23).
+.TP
+%I
+is replaced by the hour (12-hour clock) as a decimal number (01-12).
+.TP
+%j
+is replaced by the day of the year as a decimal number (001-366).
+.TP
+%k
+is replaced by the hour (24-hour clock) as a decimal number (0-23);
+single digits are preceded by a blank.
+.TP
+%l
+is replaced by the hour (12-hour clock) as a decimal number (1-12);
+single digits are preceded by a blank.
+.TP
+%M
+is replaced by the minute as a decimal number (00-59).
+.TP
+%m
+is replaced by the month as a decimal number (01-12).
+.TP
+%n
+is replaced by a newline.
+.TP
+%p
+is replaced by the locale's equivalent of either AM or PM.
+.TP
+%R
+is replaced by the time in the format %H:%M.
+.TP
+%r
+is replaced by the locale's representation of 12-hour clock time
+using AM/PM notation.
+.TP
+%S
+is replaced by the second as a decimal number (00-60).
+.TP
+%s
+is replaced by the number of seconds since the Epoch, UTC (see mktime(3)).
+.TP
+%T
+is replaced by the time in the format %H:%M:%S.
+.TP
+%t
+is replaced by a tab.
+.TP
+%U
+is replaced by the week number of the year (Sunday as the first day of
+the week) as a decimal number (00-53).
+.TP
+%u
+is replaced by the weekday (Monday as the first day of the week)
+as a decimal number (1-7).
+.TP
+%V
+is replaced by the week number of the year (Monday as the first day of
+the week) as a decimal number (01-53).  If the week containing January
+1 has four or more days in the new year, then it is week 1; otherwise
+it is week 53 of the previous year, and the next week is week 1.
+.TP
+%W
+is replaced by the week number of the year (Monday as the first day of
+the week) as a decimal number (00-53).
+.TP
+%w
+is replaced by the weekday (Sunday as the first day of the week)
+as a decimal number (0-6).
+.TP
+%X
+is replaced by the locale's appropriate time representation.
+.TP
+%x
+is replaced by the locale's appropriate date representation.
+.TP
+%Y
+is replaced by the year with century as a decimal number.
+.TP
+%y
+is replaced by the year without century as a decimal number (00-99).
+.TP
+%Z
+is replaced by the time zone name,
+or by the empty string if this is not determinable.
+.TP
+%z
+is replaced by the offset from UTC in the format +HHMM or -HHMM as appropriate,
+with positive values representing locations east of Greenwich,
+or by the empty string if this is not determinable.
+.TP
+%%
+is replaced by a single %.
+.TP
+%+
+is replaced by the date and time in date(1) format.
+.SH SEE ALSO
+date(1),
+getenv(3),
+newctime(3),
+newtzset(3),
+time(2),
+tzfile(5)
+.\" @(#)newstrftime.3  7.15
diff --git a/commands/zoneinfo/newstrftime.3.txt b/commands/zoneinfo/newstrftime.3.txt
new file mode 100644 (file)
index 0000000..29ef78b
--- /dev/null
@@ -0,0 +1,152 @@
+NAME
+
+     strftime - format date and time
+
+SYNOPSIS
+     #include <sys/types.h>
+     #include <time.h>
+
+     size_t strftime(buf, maxsize, format, timeptr)
+     char *buf;
+     size_t maxsize;
+     const char *format;
+     const struct tm *timeptr
+
+     cc ... -ltz
+
+DESCRIPTION
+     The strftime function formats the information from timeptr
+     into the buffer buf according to the string pointed to by
+     format.
+
+     The format string consists of zero or more conversion
+     specifications and ordinary characters.  All ordinary
+     characters are copied directly into the buffer.  A
+     conversion specification consists of a percent sign and one
+     other character.
+
+     No more than maxsize characters are be placed into the
+     array.  If the total number of resulting characters,
+     including the terminating null character, is not more than
+     maxsize, strftime returns the number of characters in the
+     array, not counting the terminating null.  Otherwise, zero
+     is returned.
+
+     Each conversion specification is replaced by the characters
+     as follows which are then copied into the buffer.
+
+     %A   is replaced by the locale's full weekday name.
+
+     %a   is replaced by the locale's abbreviated weekday name.
+
+     %B   is replaced by the locale's full month name.
+
+     %b or %h
+          is replaced by the locale's abbreviated month name.
+
+     %C   is replaced by the century (a year divided by 100 and
+          truncated to an integer) as a decimal number (00-99).
+
+     %c   is replaced by the locale's appropriate date and time
+          representation.
+
+     %D   is replaced by the date in the format %m/%d/%y.
+
+     %d   is replaced by the day of the month as a decimal number
+          (01-31).
+
+     %e   is replaced by the day of month as a decimal number
+          (1-31); single digits are preceded by a blank.
+
+     %F   is replaced by the date in the format %Y-%m-%d.
+
+     %G   is replaced by the ISO 8601 year with century as a
+          decimal number.
+
+     %g   is replaced by the ISO 8601 year without century as a
+          decimal number (00-99).
+
+     %H   is replaced by the hour (24-hour clock) as a decimal
+          number (00-23).
+
+     %I   is replaced by the hour (12-hour clock) as a decimal
+          number (01-12).
+
+     %j   is replaced by the day of the year as a decimal number
+          (001-366).
+
+     %k   is replaced by the hour (24-hour clock) as a decimal
+          number (0-23); single digits are preceded by a blank.
+
+     %l   is replaced by the hour (12-hour clock) as a decimal
+          number (1-12); single digits are preceded by a blank.
+
+     %M   is replaced by the minute as a decimal number (00-59).
+
+     %m   is replaced by the month as a decimal number (01-12).
+
+     %n   is replaced by a newline.
+
+     %p   is replaced by the locale's equivalent of either AM or
+          PM.
+
+     %R   is replaced by the time in the format %H:%M.
+
+     %r   is replaced by the locale's representation of 12-hour
+          clock time using AM/PM notation.
+
+     %S   is replaced by the second as a decimal number (00-60).
+
+     %s   is replaced by the number of seconds since the Epoch,
+          UTC (see mktime(3)).
+
+     %T   is replaced by the time in the format %H:%M:%S.
+
+     %t   is replaced by a tab.
+
+     %U   is replaced by the week number of the year (Sunday as
+          the first day of the week) as a decimal number (00-53).
+
+     %u   is replaced by the weekday (Monday as the first day of
+          the week) as a decimal number (1-7).
+
+     %V   is replaced by the week number of the year (Monday as
+          the first day of the week) as a decimal number (01-53).
+          If the week containing January 1 has four or more days
+          in the new year, then it is week 1; otherwise it is
+          week 53 of the previous year, and the next week is week
+          1.
+
+     %W   is replaced by the week number of the year (Monday as
+          the first day of the week) as a decimal number (00-53).
+
+     %w   is replaced by the weekday (Sunday as the first day of
+          the week) as a decimal number (0-6).
+
+     %X   is replaced by the locale's appropriate time
+          representation.
+
+     %x   is replaced by the locale's appropriate date
+          representation.
+
+     %Y   is replaced by the year with century as a decimal
+          number.
+
+     %y   is replaced by the year without century as a decimal
+          number (00-99).
+
+     %Z   is replaced by the time zone name, or by the empty
+          string if this is not determinable.
+
+     %z   is replaced by the offset from UTC in the format +HHMM
+          or -HHMM as appropriate, with positive values
+          representing locations east of Greenwich, or by the
+          empty string if this is not determinable.
+
+     %%   is replaced by a single %.
+
+     %+   is replaced by the date and time in date(1) format.
+
+SEE ALSO
+     date(1), getenv(3), newctime(3), newtzset(3), time(2),
+     tzfile(5)
diff --git a/commands/zoneinfo/newtzset.3 b/commands/zoneinfo/newtzset.3
new file mode 100644 (file)
index 0000000..427e473
--- /dev/null
@@ -0,0 +1,237 @@
+.TH NEWTZSET 3
+.SH NAME
+tzset \- initialize time conversion information
+.SH SYNOPSIS
+.nf
+.B void tzset()
+.PP
+.B cc ... -ltz
+.fi
+.SH DESCRIPTION
+.I Tzset
+uses the value of the environment variable
+.B TZ
+to set time conversion information used by
+.IR localtime .
+If
+.B TZ
+does not appear in the environment,
+the best available approximation to local wall clock time, as specified
+by the
+.IR tzfile (5)-format
+file
+.B localtime
+in the system time conversion information directory, is used by
+.IR localtime .
+If
+.B TZ
+appears in the environment but its value is a null string,
+Coordinated Universal Time (UTC) is used (without leap second
+correction).  If
+.B TZ
+appears in the environment and its value is not a null string:
+.IP
+if the value begins with a colon, it is used as a pathname of a file
+from which to read the time conversion information;
+.IP
+if the value does not begin with a colon, it is first used as the
+pathname of a file from which to read the time conversion information,
+and, if that file cannot be read, is used directly as a specification of
+the time conversion information.
+.PP
+When
+.B TZ
+is used as a pathname, if it begins with a slash,
+it is used as an absolute pathname; otherwise,
+it is used as a pathname relative to a system time conversion information
+directory.
+The file must be in the format specified in
+.IR tzfile (5).
+.PP
+When
+.B TZ
+is used directly as a specification of the time conversion information,
+it must have the following syntax (spaces inserted for clarity):
+.IP
+\fIstd\|offset\fR[\fIdst\fR[\fIoffset\fR][\fB,\fIrule\fR]]
+.PP
+Where:
+.RS
+.TP 15
+.IR std " and " dst
+Three or more bytes that are the designation for the standard
+.RI ( std )
+or summer
+.RI ( dst )
+time zone.  Only
+.I std
+is required; if
+.I dst
+is missing, then summer time does not apply in this locale.
+Upper- and lowercase letters are explicitly allowed.  Any characters
+except a leading colon
+.RB ( : ),
+digits, comma
+.RB ( , ),
+minus
+.RB ( \(mi ),
+plus
+.RB ( \(pl ),
+and ASCII NUL are allowed.
+.TP
+.I offset
+Indicates the value one must add to the local time to arrive at
+Coordinated Universal Time.  The
+.I offset
+has the form:
+.RS
+.IP
+\fIhh\fR[\fB:\fImm\fR[\fB:\fIss\fR]]
+.RE
+.IP
+The minutes
+.RI ( mm )
+and seconds
+.RI ( ss )
+are optional.  The hour
+.RI ( hh )
+is required and may be a single digit.  The
+.I offset
+following
+.I std
+is required.  If no
+.I offset
+follows
+.IR dst ,
+summer time is assumed to be one hour ahead of standard time.  One or
+more digits may be used; the value is always interpreted as a decimal
+number.  The hour must be between zero and 24, and the minutes (and
+seconds) \(em if present \(em between zero and 59.  If preceded by a
+.RB `` \(mi '',
+the time zone shall be east of the Prime Meridian; otherwise it shall be
+west (which may be indicated by an optional preceding
+.RB `` \(pl '').
+.TP
+.I rule
+Indicates when to change to and back from summer time.  The
+.I rule
+has the form:
+.RS
+.IP
+\fIdate\fB/\fItime\fB,\fIdate\fB/\fItime\fR
+.RE
+.IP
+where the first
+.I date
+describes when the change from standard to summer time occurs and the
+second
+.I date
+describes when the change back happens.  Each
+.I time
+field describes when, in current local time, the change to the other
+time is made.
+.IP
+The format of
+.I date
+is one of the following:
+.RS
+.TP 10
+.BI J n
+The Julian day
+.I n
+.RI "(1\ \(<=" "\ n\ " "\(<=\ 365).
+Leap days are not counted; that is, in all years \(em including leap
+years \(em February 28 is day 59 and March 1 is day 60.  It is
+impossible to explicitly refer to the occasional February 29.
+.TP
+.I n
+The zero-based Julian day
+.RI "(0\ \(<=" "\ n\ " "\(<=\ 365).
+Leap days are counted, and it is possible to refer to February 29.
+.TP
+.BI M m . n . d
+The
+.IR d' th
+day
+.RI "(0\ \(<=" "\ d\ " "\(<=\ 6)
+of week
+.I n
+of month
+.I m
+of the year
+.RI "(1\ \(<=" "\ n\ " "\(<=\ 5,
+.RI "1\ \(<=" "\ m\ " "\(<=\ 12,
+where week 5 means ``the last
+.I d
+day in month
+.IR m ''
+which may occur in either the fourth or the fifth week).  Week 1 is the
+first week in which the
+.IR d' th
+day occurs.  Day zero is Sunday.
+.RE
+.IP "" 15
+The
+.I time
+has the same format as
+.I offset
+except that no leading sign
+.RB (`` \(mi ''
+or
+.RB `` \(pl '')
+is allowed.  The default, if
+.I time
+is not given, is
+.BR 02:00:00 .
+.RE
+.LP
+If no
+.I rule
+is present in
+.BR TZ ,
+the rules specified
+by the
+.IR tzfile (5)-format
+file
+.B posixrules
+in the system time conversion information directory are used, with the
+standard and summer time offsets from UTC replaced by those specified by
+the
+.I offset
+values in
+.BR TZ .
+.PP
+For compatibility with System V Release 3.1, a semicolon
+.RB ( ; )
+may be used to separate the
+.I rule
+from the rest of the specification.
+.PP
+If the
+.B TZ
+environment variable does not specify a
+.IR tzfile (5)-format
+and cannot be interpreted as a direct specification,
+UTC is used.
+.SH FILES
+.ta \w'/usr/local/etc/zoneinfo/posixrules\0\0'u
+/usr/local/etc/zoneinfo        time zone information directory
+.br
+/usr/local/etc/zoneinfo/localtime      local time zone file
+.br
+/usr/local/etc/zoneinfo/posixrules     used with POSIX-style TZ's
+.br
+/usr/local/etc/zoneinfo/GMT    for UTC leap seconds
+.sp
+If
+.B /usr/local/etc/zoneinfo/GMT
+is absent,
+UTC leap seconds are loaded from
+.BR /usr/local/etc/zoneinfo/posixrules .
+.SH SEE ALSO
+getenv(3),
+newctime(3),
+newstrftime(3),
+time(2),
+tzfile(5)
+.\" @(#)newtzset.3     7.5
diff --git a/commands/zoneinfo/newtzset.3.txt b/commands/zoneinfo/newtzset.3.txt
new file mode 100644 (file)
index 0000000..0c0f72f
--- /dev/null
@@ -0,0 +1,153 @@
+NAME
+
+     tzset - initialize time conversion information
+
+SYNOPSIS
+     void tzset()
+
+     cc ... -ltz
+
+DESCRIPTION
+     Tzset uses the value of the environment variable TZ to set
+     time conversion information used by localtime.  If TZ does
+     not appear in the environment, the best available
+     approximation to local wall clock time, as specified by the
+     tzfile(5)-format file localtime in the system time
+     conversion information directory, is used by localtime.  If
+     TZ appears in the environment but its value is a null
+     string, Coordinated Universal Time (UTC) is used (without
+     leap second correction).  If TZ appears in the environment
+     and its value is not a null string:
+
+          if the value begins with a colon, it is used as a
+          pathname of a file from which to read the time
+          conversion information;
+
+          if the value does not begin with a colon, it is first
+          used as the pathname of a file from which to read the
+          time conversion information, and, if that file cannot
+          be read, is used directly as a specification of the
+          time conversion information.
+
+     When TZ is used as a pathname, if it begins with a slash, it
+     is used as an absolute pathname; otherwise, it is used as a
+     pathname relative to a system time conversion information
+     directory.  The file must be in the format specified in
+     tzfile(5).
+
+     When TZ is used directly as a specification of the time
+     conversion information, it must have the following syntax
+     (spaces inserted for clarity):
+
+          stdoffset[dst[offset][,rule]]
+
+     Where:
+
+          std and dst    Three or more bytes that are the
+                         designation for the standard (std) or
+                         summer (dst) time zone.  Only std is
+                         required; if dst is missing, then summer
+                         time does not apply in this locale.
+                         Upper- and lowercase letters are
+                         explicitly allowed.  Any characters
+                         except a leading colon (:), digits,
+                         comma (,), minus (-), plus (+), and
+                         ASCII NUL are allowed.
+
+          offset         Indicates the value one must add to the
+                         local time to arrive at Coordinated
+                         Universal Time.  The offset has the
+                         form:
+
+                              hh[:mm[:ss]]
+
+                         The minutes (mm) and seconds (ss) are
+                         optional.  The hour (hh) is required and
+                         may be a single digit.  The offset
+                         following std is required.  If no offset
+                         follows dst, summer time is assumed to
+                         be one hour ahead of standard time.  One
+                         or more digits may be used; the value is
+                         always interpreted as a decimal number.
+                         The hour must be between zero and 24,
+                         and the minutes (and seconds) - if
+                         present - between zero and 59.  If
+                         preceded by a ``-'', the time zone shall
+                         be east of the Prime Meridian; otherwise
+                         it shall be west (which may be indicated
+                         by an optional preceding ``+'').
+
+          rule           Indicates when to change to and back
+                         from summer time.  The rule has the
+                         form:
+
+                              date/time,date/time
+
+                         where the first date describes when the
+                         change from standard to summer time
+                         occurs and the second date describes
+                         when the change back happens.  Each time
+                         field describes when, in current local
+                         time, the change to the other time is
+                         made.
+
+                         The format of date is one of the
+                         following:
+
+                         Jn        The Julian day n
+                                   (1 < n < 365).  Leap days are
+                                   not counted; that is, in all
+                                   years - including leap years -
+                                   February 28 is day 59 and
+                                   March 1 is day 60.  It is
+                                   impossible to explicitly refer
+                                   to the occasional February 29.
+
+                         n         The zero-based Julian day
+                                   (0 < n < 365).  Leap days are
+                                   counted, and it is possible to
+                                   refer to February 29.
+
+                         Mm.n.d    The d'th day (0 < d < 6) of
+                                   week n of month m of the year
+                                   (1 < n < 5, 1 < m < 12, where
+                                   week 5 means ``the last d day
+                                   in month m'' which may occur
+                                   in either the fourth or the
+                                   fifth week).  Week 1 is the
+                                   first week in which the d'th
+                                   day occurs.  Day zero is
+                                   Sunday.
+
+                         The time has the same format as offset
+                         except that no leading sign (``-'' or
+                         ``+'') is allowed.  The default, if time
+                         is not given, is 02:00:00.
+
+     If no rule is present in TZ, the rules specified by the
+     tzfile(5)-format file posixrules in the system time
+     conversion information directory are used, with the standard
+     and summer time offsets from UTC replaced by those specified
+     by the offset values in TZ.
+
+     For compatibility with System V Release 3.1, a semicolon (;)
+     may be used to separate the rule from the rest of the
+     specification.
+
+     If the TZ environment variable does not specify a
+     tzfile(5)-format and cannot be interpreted as a direct
+     specification, UTC is used.
+
+FILES
+     /usr/local/etc/zoneinfo             time zone information
+     directory
+     /usr/local/etc/zoneinfo/localtime   local time zone file
+     /usr/local/etc/zoneinfo/posixrules  used with POSIX-style
+     TZ's
+     /usr/local/etc/zoneinfo/GMT         for UTC leap seconds
+
+     If /usr/local/etc/zoneinfo/GMT is absent, UTC leap seconds
+     are loaded from /usr/local/etc/zoneinfo/posixrules.
+
+SEE ALSO
+     getenv(3), newctime(3), newstrftime(3), time(2), tzfile(5)
diff --git a/commands/zoneinfo/northamerica b/commands/zoneinfo/northamerica
new file mode 100644 (file)
index 0000000..3184b7b
--- /dev/null
@@ -0,0 +1,2537 @@
+# @(#)northamerica     8.15
+# <pre>
+
+# also includes Central America and the Caribbean
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (1999-03-22):
+# A reliable and entertaining source about time zones is
+# Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+
+###############################################################################
+
+# United States
+
+# From Paul Eggert (1999-03-31):
+# Howse writes (pp 121-125) that time zones were invented by
+# Professor Charles Ferdinand Dowd (1825-1904),
+# Principal of Temple Grove Ladies' Seminary (Saratoga Springs, NY).
+# His pamphlet ``A System of National Time for Railroads'' (1870)
+# was the result of his proposals at the Convention of Railroad Trunk Lines
+# in New York City (1869-10).  His 1870 proposal was based on Washington, DC,
+# but in 1872-05 he moved the proposed origin to Greenwich.
+# His proposal was adopted by the railroads on 1883-11-18 at 12:00,
+# and the most of the country soon followed suit.
+
+# From Paul Eggert (2005-04-16):
+# That 1883 transition occurred at 12:00 new time, not at 12:00 old time.
+# See p 46 of David Prerau, Seize the daylight, Thunder's Mouth Press (2005).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data in the US is
+# Thomas G. Shanks, The American Atlas (5th edition),
+# San Diego: ACS Publications, Inc. (1991).
+# Make sure you have the errata sheet; the book is somewhat useless without it.
+# It is the source for most of the pre-1991 US entries below.
+
+# From Paul Eggert (2001-03-06):
+# Daylight Saving Time was first suggested as a joke by Benjamin Franklin
+# in his whimsical essay ``An Economical Project for Diminishing the Cost
+# of Light'' published in the Journal de Paris (1784-04-26).
+# Not everyone is happy with the results:
+#
+#      I don't really care how time is reckoned so long as there is some
+#      agreement about it, but I object to being told that I am saving
+#      daylight when my reason tells me that I am doing nothing of the kind.
+#      I even object to the implication that I am wasting something
+#      valuable if I stay in bed after the sun has risen.  As an admirer
+#      of moonlight I resent the bossy insistence of those who want to
+#      reduce my time for enjoying it.  At the back of the Daylight Saving
+#      scheme I detect the bony, blue-fingered hand of Puritanism, eager
+#      to push people into bed earlier, and get them up earlier, to make
+#      them healthy, wealthy and wise in spite of themselves.
+#
+#      -- Robertson Davies, The diary of Samuel Marchbanks,
+#         Clarke, Irwin (1947), XIX, Sunday
+#
+# For more about the first ten years of DST in the United States, see
+# Robert Garland's <a href="http://www.clpgh.org/exhibit/dst.html">
+# Ten years of daylight saving from the Pittsburgh standpoint
+# (Carnegie Library of Pittsburgh, 1927)</a>.
+#
+# Shanks says that DST was called "War Time" in the US in 1918 and 1919.
+# However, DST was imposed by the Standard Time Act of 1918, which
+# was the first nationwide legal time standard, and apparently
+# time was just called "Standard Time" or "Daylight Saving Time".
+
+# From Arthur David Olson:
+# US Daylight Saving Time ended on the last Sunday of *October* in 1974.
+# See, for example, the front page of the Saturday, 1974-10-26
+# and Sunday, 1974-10-27 editions of the Washington Post.
+
+# From Arthur David Olson:
+# Before the Uniform Time Act of 1966 took effect in 1967, observance of
+# Daylight Saving Time in the US was by local option, except during wartime.
+
+# From Arthur David Olson (2000-09-25):
+# Last night I heard part of a rebroadcast of a 1945 Arch Oboler radio drama.
+# In the introduction, Oboler spoke of "Eastern Peace Time."
+# An AltaVista search turned up
+# <a href="http://rowayton.org/rhs/hstaug45.html">:
+# "When the time is announced over the radio now, it is 'Eastern Peace
+# Time' instead of the old familiar 'Eastern War Time.'  Peace is wonderful."
+# </a> (August 1945) by way of confirmation.
+
+# From Joseph Gallant citing
+# George H. Douglas, _The Early Days of Radio Broadcasting_ (1987):
+# At 7 P.M. (Eastern War Time) [on 1945-08-14], the networks were set
+# to switch to London for Attlee's address, but the American people
+# never got to hear his speech live. According to one press account,
+# CBS' Bob Trout was first to announce the word of Japan's surrender,
+# but a few seconds later, NBC, ABC and Mutual also flashed the word
+# of surrender, all of whom interrupting the bells of Big Ben in
+# London which were to precede Mr. Attlee's speech.
+
+# From Paul Eggert (2003-02-09): It was Robert St John, not Bob Trout.  From
+# Myrna Oliver's obituary of St John on page B16 of today's Los Angeles Times:
+#
+# ... a war-weary U.S. clung to radios, awaiting word of Japan's surrender.
+# Any announcement from Asia would reach St. John's New York newsroom on a
+# wire service teletype machine, which had prescribed signals for major news.
+# Associated Press, for example, would ring five bells before spewing out
+# typed copy of an important story, and 10 bells for news "of transcendental
+# importance."
+#
+# On Aug. 14, stalling while talking steadily into the NBC networks' open
+# microphone, St. John heard five bells and waited only to hear a sixth bell,
+# before announcing confidently: "Ladies and gentlemen, World War II is over.
+# The Japanese have agreed to our surrender terms."
+#
+# He had scored a 20-second scoop on other broadcasters.
+
+# From Arthur David Olson (2005-08-22):
+# Paul has been careful to use the "US" rules only in those locations
+# that are part of the United States; this reflects the real scope of
+# U.S. government action.  So even though the "US" rules have changed
+# in the latest release, other countries won't be affected.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   US      1918    1919    -       Mar     lastSun 2:00    1:00    D
+Rule   US      1918    1919    -       Oct     lastSun 2:00    0       S
+Rule   US      1942    only    -       Feb     9       2:00    1:00    W # War
+Rule   US      1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   US      1945    only    -       Sep     30      2:00    0       S
+Rule   US      1967    2006    -       Oct     lastSun 2:00    0       S
+Rule   US      1967    1973    -       Apr     lastSun 2:00    1:00    D
+Rule   US      1974    only    -       Jan     6       2:00    1:00    D
+Rule   US      1975    only    -       Feb     23      2:00    1:00    D
+Rule   US      1976    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   US      1987    2006    -       Apr     Sun>=1  2:00    1:00    D
+Rule   US      2007    max     -       Mar     Sun>=8  2:00    1:00    D
+Rule   US      2007    max     -       Nov     Sun>=1  2:00    0       S
+
+# From Arthur David Olson, 2005-12-19
+# We generate the files specified below to guard against old files with
+# obsolete information being left in the time zone binary directory.
+# We limit the list to names that have appeared in previous versions of
+# this time zone package.
+# We do these as separate Zones rather than as Links to avoid problems if
+# a particular place changes whether it observes DST.
+# We put these specifications here in the northamerica file both to
+# increase the chances that they'll actually get compiled and to
+# avoid the need to duplicate the US rules in another file.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   EST              -5:00  -       EST
+Zone   MST              -7:00  -       MST
+Zone   HST             -10:00  -       HST
+Zone   EST5EDT          -5:00  US      E%sT
+Zone   CST6CDT          -6:00  US      C%sT
+Zone   MST7MDT          -7:00  US      M%sT
+Zone   PST8PDT          -8:00  US      P%sT
+
+# From Bob Devine (1988-01-28):
+# ...Alaska (and Hawaii) had the timezone names changed in 1967.
+#    old                        new
+#    Pacific Standard Time(PST)  -same-
+#    Yukon Standard Time(YST)    -same-
+#    Central Alaska S.T. (CAT)   Alaska-Hawaii St[an]dard Time (AHST)
+#    Nome Standard Time (NT)     Bering Standard Time (BST)
+#
+# ...Alaska's timezone lines were redrawn in 1983 to give only 2 tz.
+#    The YST zone now covers nearly all of the state, AHST just part
+#    of the Aleutian islands.   No DST.
+
+# From Paul Eggert (1995-12-19):
+# The tables below use `NST', not `NT', for Nome Standard Time.
+# I invented `CAWT' for Central Alaska War Time.
+
+# From U. S. Naval Observatory (1989-01-19):
+# USA  EASTERN       5 H  BEHIND UTC    NEW YORK, WASHINGTON
+# USA  EASTERN       4 H  BEHIND UTC    APR 3 - OCT 30
+# USA  CENTRAL       6 H  BEHIND UTC    CHICAGO, HOUSTON
+# USA  CENTRAL       5 H  BEHIND UTC    APR 3 - OCT 30
+# USA  MOUNTAIN      7 H  BEHIND UTC    DENVER
+# USA  MOUNTAIN      6 H  BEHIND UTC    APR 3 - OCT 30
+# USA  PACIFIC       8 H  BEHIND UTC    L.A., SAN FRANCISCO
+# USA  PACIFIC       7 H  BEHIND UTC    APR 3 - OCT 30
+# USA  ALASKA STD    9 H  BEHIND UTC    MOST OF ALASKA     (AKST)
+# USA  ALASKA STD    8 H  BEHIND UTC    APR 3 - OCT 30 (AKDT)
+# USA  ALEUTIAN     10 H  BEHIND UTC    ISLANDS WEST OF 170W
+# USA  - " -         9 H  BEHIND UTC    APR 3 - OCT 30
+# USA  HAWAII       10 H  BEHIND UTC
+# USA  BERING       11 H  BEHIND UTC    SAMOA, MIDWAY
+
+# From Arthur David Olson (1989-01-21):
+# The above dates are for 1988.
+# Note the "AKST" and "AKDT" abbreviations, the claim that there's
+# no DST in Samoa, and the claim that there is DST in Alaska and the
+# Aleutians.
+
+# From Arthur David Olson (1988-02-13):
+# Legal standard time zone names, from United States Code (1982 Edition and
+# Supplement III), Title 15, Chapter 6, Section 260 and forward.  First, names
+# up to 1967-04-01 (when most provisions of the Uniform Time Act of 1966
+# took effect), as explained in sections 263 and 261:
+#      (none)
+#      United States standard eastern time
+#      United States standard mountain time
+#      United States standard central time
+#      United States standard Pacific time
+#      (none)
+#      United States standard Alaska time
+#      (none)
+# Next, names from 1967-04-01 until 1983-11-30 (the date for
+# public law 98-181):
+#      Atlantic standard time
+#      eastern standard time
+#      central standard time
+#      mountain standard time
+#      Pacific standard time
+#      Yukon standard time
+#      Alaska-Hawaii standard time
+#      Bering standard time
+# And after 1983-11-30:
+#      Atlantic standard time
+#      eastern standard time
+#      central standard time
+#      mountain standard time
+#      Pacific standard time
+#      Alaska standard time
+#      Hawaii-Aleutian standard time
+#      Samoa standard time
+# The law doesn't give abbreviations.
+#
+# From Paul Eggert (2000-01-08), following a heads-up from Rives McDow:
+# Public law 106-564 (2000-12-23) introduced the abbreviation
+# "Chamorro Standard Time" for time in Guam and the Northern Marianas.
+# See the file "australasia".
+
+# From Arthur David Olson, 2005-08-09
+# The following was signed into law on 2005-08-08.
+#
+# H.R. 6, Energy Policy Act of 2005, SEC. 110. DAYLIGHT SAVINGS.
+#   (a) Amendment- Section 3(a) of the Uniform Time Act of 1966 (15
+#   U.S.C. 260a(a)) is amended--
+#     (1) by striking `first Sunday of April' and inserting `second
+#     Sunday of March'; and
+#     (2) by striking `last Sunday of October' and inserting `first
+#     Sunday of November'.
+#   (b) Effective Date- Subsection (a) shall take effect 1 year after the
+#   date of enactment of this Act or March 1, 2007, whichever is later.
+#   (c) Report to Congress- Not later than 9 months after the effective
+#   date stated in subsection (b), the Secretary shall report to Congress
+#   on the impact of this section on energy consumption in the United
+#   States.
+#   (d) Right to Revert- Congress retains the right to revert the
+#   Daylight Saving Time back to the 2005 time schedules once the
+#   Department study is complete.
+
+# US eastern time, represented by New York
+
+# Connecticut, Delaware, District of Columbia, most of Florida,
+# Georgia, southeast Indiana (Dearborn and Ohio counties), eastern Kentucky
+# (except America/Kentucky/Louisville below), Maine, Maryland, Massachusetts,
+# New Hampshire, New Jersey, New York, North Carolina, Ohio,
+# Pennsylvania, Rhode Island, South Carolina, eastern Tennessee,
+# Vermont, Virginia, West Virginia
+
+# From Dave Cantor (2004-11-02):
+# Early this summer I had the occasion to visit the Mount Washington
+# Observatory weather station atop (of course!) Mount Washington [, NH]....
+# One of the staff members said that the station was on Eastern Standard Time
+# and didn't change their clocks for Daylight Saving ... so that their
+# reports will always have times which are 5 hours behind UTC.
+
+# From Paul Eggert (2005-08-26):
+# According to today's Huntsville Times
+# <http://www.al.com/news/huntsvilletimes/index.ssf?/base/news/1125047783228320.xml&coll=1>
+# a few towns on Alabama's "eastern border with Georgia, such as Phenix City
+# in Russell County, Lanett in Chambers County and some towns in Lee County,
+# set their watches and clocks on Eastern time."  It quotes H.H. "Bubba"
+# Roberts, city administrator in Phenix City. as saying "We are in the Central
+# time zone, but we do go by the Eastern time zone because so many people work
+# in Columbus."
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   NYC     1920    only    -       Mar     lastSun 2:00    1:00    D
+Rule   NYC     1920    only    -       Oct     lastSun 2:00    0       S
+Rule   NYC     1921    1966    -       Apr     lastSun 2:00    1:00    D
+Rule   NYC     1921    1954    -       Sep     lastSun 2:00    0       S
+Rule   NYC     1955    1966    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/New_York  -4:56:02 -      LMT     1883 Nov 18 12:03:58
+                       -5:00   US      E%sT    1920
+                       -5:00   NYC     E%sT    1942
+                       -5:00   US      E%sT    1946
+                       -5:00   NYC     E%sT    1967
+                       -5:00   US      E%sT
+
+# US central time, represented by Chicago
+
+# Alabama, Arkansas, Florida panhandle (Bay, Calhoun, Escambia,
+# Gulf, Holmes, Jackson, Okaloosa, Santa Rosa, Walton, and
+# Washington counties), Illinois, western Indiana
+# (Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer,
+# Vanderburgh, and Warrick counties), Iowa, most of Kansas, western
+# Kentucky, Louisiana, Minnesota, Mississippi, Missouri, eastern
+# Nebraska, eastern North Dakota, Oklahoma, eastern South Dakota,
+# western Tennessee, most of Texas, Wisconsin
+
+# From Larry M. Smith (2006-04-26) re Wisconsin:
+# http://www.legis.state.wi.us/statutes/Stat0175.pdf ...
+# is currently enforced at the 01:00 time of change.  Because the local
+# "bar time" in the state corresponds to 02:00, a number of citations
+# are issued for the "sale of class 'B' alcohol after prohibited
+# hours" within the deviated hour of this change every year....
+#
+# From Douglas R. Bomberg (2007-03-12):
+# Wisconsin has enacted (nearly eleventh-hour) legislation to get WI
+# Statue 175 closer in synch with the US Congress' intent....
+# http://www.legis.state.wi.us/2007/data/acts/07Act3.pdf
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Chicago 1920    only    -       Jun     13      2:00    1:00    D
+Rule   Chicago 1920    1921    -       Oct     lastSun 2:00    0       S
+Rule   Chicago 1921    only    -       Mar     lastSun 2:00    1:00    D
+Rule   Chicago 1922    1966    -       Apr     lastSun 2:00    1:00    D
+Rule   Chicago 1922    1954    -       Sep     lastSun 2:00    0       S
+Rule   Chicago 1955    1966    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Chicago   -5:50:36 -      LMT     1883 Nov 18 12:09:24
+                       -6:00   US      C%sT    1920
+                       -6:00   Chicago C%sT    1936 Mar  1 2:00
+                       -5:00   -       EST     1936 Nov 15 2:00
+                       -6:00   Chicago C%sT    1942
+                       -6:00   US      C%sT    1946
+                       -6:00   Chicago C%sT    1967
+                       -6:00   US      C%sT
+# Oliver County, ND switched from mountain to central time on 1992-10-25.
+Zone America/North_Dakota/Center -6:45:12 - LMT        1883 Nov 18 12:14:48
+                       -7:00   US      M%sT    1992 Oct 25 02:00
+                       -6:00   US      C%sT
+# Morton County, ND, switched from mountain to central time on
+# 2003-10-26, except for the area around Mandan which was already central time.
+# See <http://dmses.dot.gov/docimages/p63/135818.pdf>.
+# Officially this switch also included part of Sioux County, and
+# Jones, Mellette, and Todd Counties in South Dakota;
+# but in practice these other counties were already observing central time.
+# See <http://www.epa.gov/fedrgstr/EPA-IMPACT/2003/October/Day-28/i27056.htm>.
+Zone America/North_Dakota/New_Salem -6:45:39 - LMT 1883 Nov 18 12:14:21
+                       -7:00   US      M%sT    2003 Oct 26 02:00
+                       -6:00   US      C%sT
+
+# US mountain time, represented by Denver
+#
+# Colorado, far western Kansas, Montana, western
+# Nebraska, Nevada border (Jackpot, Owyhee, and Mountain City),
+# New Mexico, southwestern North Dakota, far eastern Oregon,
+# western South Dakota, far western Texas (El Paso County, Hudspeth County,
+# and Pine Springs and Nickel Creek in Culberson County), Utah, Wyoming
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Denver  1920    1921    -       Mar     lastSun 2:00    1:00    D
+Rule   Denver  1920    only    -       Oct     lastSun 2:00    0       S
+Rule   Denver  1921    only    -       May     22      2:00    0       S
+Rule   Denver  1965    1966    -       Apr     lastSun 2:00    1:00    D
+Rule   Denver  1965    1966    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Denver    -6:59:56 -      LMT     1883 Nov 18 12:00:04
+                       -7:00   US      M%sT    1920
+                       -7:00   Denver  M%sT    1942
+                       -7:00   US      M%sT    1946
+                       -7:00   Denver  M%sT    1967
+                       -7:00   US      M%sT
+
+# US Pacific time, represented by Los Angeles
+#
+# California, northern Idaho (Benewah, Bonner, Boundary, Clearwater,
+# Idaho, Kootenai, Latah, Lewis, Nez Perce, and Shoshone counties),
+# most of Nevada, most of Oregon, and Washington
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   CA      1948    only    -       Mar     14      2:00    1:00    D
+Rule   CA      1949    only    -       Jan      1      2:00    0       S
+Rule   CA      1950    1966    -       Apr     lastSun 2:00    1:00    D
+Rule   CA      1950    1961    -       Sep     lastSun 2:00    0       S
+Rule   CA      1962    1966    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Los_Angeles -7:52:58 -    LMT     1883 Nov 18 12:07:02
+                       -8:00   US      P%sT    1946
+                       -8:00   CA      P%sT    1967
+                       -8:00   US      P%sT
+
+# Alaska
+# AK%sT is the modern abbreviation for -9:00 per USNO.
+#
+# From Paul Eggert (2001-05-30):
+# Howse writes that Alaska switched from the Julian to the Gregorian calendar,
+# and from east-of-GMT to west-of-GMT days, when the US bought it from Russia.
+# This was on 1867-10-18, a Friday; the previous day was 1867-10-06 Julian,
+# also a Friday.  Include only the time zone part of this transition,
+# ignoring the switch from Julian to Gregorian, since we can't represent
+# the Julian calendar.
+#
+# As far as we know, none of the exact locations mentioned below were
+# permanently inhabited in 1867 by anyone using either calendar.
+# (Yakutat was colonized by the Russians in 1799, but the settlement
+# was destroyed in 1805 by a Yakutat-kon war party.)  However, there
+# were nearby inhabitants in some cases and for our purposes perhaps
+# it's best to simply use the official transition.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Juneau     15:02:19 -     LMT     1867 Oct 18
+                        -8:57:41 -     LMT     1900 Aug 20 12:00
+                        -8:00  -       PST     1942
+                        -8:00  US      P%sT    1946
+                        -8:00  -       PST     1969
+                        -8:00  US      P%sT    1983 Oct 30 2:00
+                        -9:00  US      Y%sT    1983 Nov 30
+                        -9:00  US      AK%sT
+Zone America/Yakutat    14:41:05 -     LMT     1867 Oct 18
+                        -9:18:55 -     LMT     1900 Aug 20 12:00
+                        -9:00  -       YST     1942
+                        -9:00  US      Y%sT    1946
+                        -9:00  -       YST     1969
+                        -9:00  US      Y%sT    1983 Nov 30
+                        -9:00  US      AK%sT
+Zone America/Anchorage  14:00:24 -     LMT     1867 Oct 18
+                        -9:59:36 -     LMT     1900 Aug 20 12:00
+                       -10:00  -       CAT     1942
+                       -10:00  US      CAT/CAWT 1945 Aug 14 23:00u
+                       -10:00  US      CAT/CAPT 1946 # Peace
+                       -10:00  -       CAT     1967 Apr
+                       -10:00  -       AHST    1969
+                       -10:00  US      AH%sT   1983 Oct 30 2:00
+                        -9:00  US      Y%sT    1983 Nov 30
+                        -9:00  US      AK%sT
+Zone America/Nome       12:58:21 -     LMT     1867 Oct 18
+                       -11:01:38 -     LMT     1900 Aug 20 12:00
+                       -11:00  -       NST     1942
+                       -11:00  US      N%sT    1946
+                       -11:00  -       NST     1967 Apr
+                       -11:00  -       BST     1969
+                       -11:00  US      B%sT    1983 Oct 30 2:00
+                        -9:00  US      Y%sT    1983 Nov 30
+                        -9:00  US      AK%sT
+Zone America/Adak       12:13:21 -     LMT     1867 Oct 18
+                       -11:46:38 -     LMT     1900 Aug 20 12:00
+                       -11:00  -       NST     1942
+                       -11:00  US      N%sT    1946
+                       -11:00  -       NST     1967 Apr
+                       -11:00  -       BST     1969
+                       -11:00  US      B%sT    1983 Oct 30 2:00
+                       -10:00  US      AH%sT   1983 Nov 30
+                       -10:00  US      HA%sT
+# The following switches don't quite make our 1970 cutoff.
+#
+# Shanks writes that part of southwest Alaska (e.g. Aniak)
+# switched from -11:00 to -10:00 on 1968-09-22 at 02:00,
+# and another part (e.g. Akiak) made the same switch five weeks later.
+#
+# From David Flater (2004-11-09):
+# In e-mail, 2004-11-02, Ray Hudson, historian/liaison to the Unalaska
+# Historic Preservation Commission, provided this information, which
+# suggests that Unalaska deviated from statutory time from early 1967
+# possibly until 1983:
+#
+#  Minutes of the Unalaska City Council Meeting, January 10, 1967:
+#  "Except for St. Paul and Akutan, Unalaska is the only important
+#  location not on Alaska Standard Time.  The following resolution was
+#  made by William Robinson and seconded by Henry Swanson:  Be it
+#  resolved that the City of Unalaska hereby goes to Alaska Standard
+#  Time as of midnight Friday, January 13, 1967 (1 A.M. Saturday,
+#  January 14, Alaska Standard Time.)  This resolution was passed with
+#  three votes for and one against."
+
+# Hawaii
+#
+# From Arthur David Olson:
+# And then there's Hawaii.
+# DST was observed for one day in 1933;
+# standard time was changed by half an hour in 1947;
+# it's always standard as of 1986.
+#
+# From Paul Eggert:
+# Shanks says the 1933 experiment lasted for three weeks.  Go with Shanks.
+#
+Zone Pacific/Honolulu  -10:31:26 -     LMT     1900 Jan  1 12:00
+                       -10:30  -       HST     1933 Apr 30 2:00
+                       -10:30  1:00    HDT     1933 May 21 2:00
+                       -10:30  US      H%sT    1947 Jun  8 2:00
+                       -10:00  -       HST
+
+# Now we turn to US areas that have diverged from the consensus since 1970.
+
+# Arizona mostly uses MST.
+
+# From Paul Eggert (2002-10-20):
+#
+# The information in the rest of this paragraph is derived from the
+# <a href="http://www.dlapr.lib.az.us/links/daylight.htm">
+# Daylight Saving Time web page (2002-01-23)</a> maintained by the
+# Arizona State Library, Archives and Public Records.
+# Between 1944-01-01 and 1944-04-01 the State of Arizona used standard
+# time, but by federal law railroads, airlines, bus lines, military
+# personnel, and some engaged in interstate commerce continued to
+# observe war (i.e., daylight saving) time.  The 1944-03-17 Phoenix
+# Gazette says that was the date the law changed, and that 04-01 was
+# the date the state's clocks would change.  In 1945 the State of
+# Arizona used standard time all year, again with exceptions only as
+# mandated by federal law.  Arizona observed DST in 1967, but Arizona
+# Laws 1968, ch. 183 (effective 1968-03-21) repealed DST.
+#
+# Shanks says the 1944 experiment came to an end on 1944-03-17.
+# Go with the Arizona State Library instead.
+
+Zone America/Phoenix   -7:28:18 -      LMT     1883 Nov 18 11:31:42
+                       -7:00   US      M%sT    1944 Jan  1 00:01
+                       -7:00   -       MST     1944 Apr  1 00:01
+                       -7:00   US      M%sT    1944 Oct  1 00:01
+                       -7:00   -       MST     1967
+                       -7:00   US      M%sT    1968 Mar 21
+                       -7:00   -       MST
+# From Arthur David Olson (1988-02-13):
+# A writer from the Inter Tribal Council of Arizona, Inc.,
+# notes in private correspondence dated 1987-12-28 that "Presently, only the
+# Navajo Nation participates in the Daylight Saving Time policy, due to its
+# large size and location in three states."  (The "only" means that other
+# tribal nations don't use DST.)
+
+Link America/Denver America/Shiprock
+
+# Southern Idaho (Ada, Adams, Bannock, Bear Lake, Bingham, Blaine,
+# Boise, Bonneville, Butte, Camas, Canyon, Caribou, Cassia, Clark,
+# Custer, Elmore, Franklin, Fremont, Gem, Gooding, Jefferson, Jerome,
+# Lemhi, Lincoln, Madison, Minidoka, Oneida, Owyhee, Payette, Power,
+# Teton, Twin Falls, Valley, Washington counties) and eastern Oregon
+# switched four weeks late in 1974.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Boise     -7:44:49 -      LMT     1883 Nov 18 12:15:11
+                       -8:00   US      P%sT    1923 May 13 2:00
+                       -7:00   US      M%sT    1974
+                       -7:00   -       MST     1974 Feb  3 2:00
+                       -7:00   US      M%sT
+
+# Indiana
+#
+# For a map of Indiana's time zone regions, see:
+# <a href="http://www.mccsc.edu/time.html">
+# What time is it in Indiana?
+# </a> (2006-03-01)
+#
+# From Paul Eggert (2006-03-22):
+# Since 1970, most of Indiana has been like America/Indiana/Indianapolis,
+# with the following exceptions:
+#
+# - Gibson, Jasper, Lake, LaPorte, Newton, Porter, Posey, Spencer,
+#   Vandenburgh, and Warrick counties have been like America/Chicago.
+#
+# - Dearborn and Ohio counties have been like America/New_York.
+#
+# - Clark, Floyd, and Harrison counties have been like
+#   America/Kentucky/Louisville.
+#
+# - Daviess, Dubois, Knox, Martin, Perry, and Pulaski counties
+#   have been like America/Indiana/Vincennes.
+#
+# - Crawford, Pike, Starke, and Switzerland counties have their own time zone
+#   histories as noted below.
+#
+# Shanks partitioned Indiana into 345 regions, each with its own time history,
+# and wrote ``Even newspaper reports present contradictory information.''
+# Those Hoosiers!  Such a flighty and changeable people!
+# Fortunately, most of the complexity occurred before our cutoff date of 1970.
+#
+# Other than Indianapolis, the Indiana place names are so nondescript
+# that they would be ambiguous if we left them at the `America' level.
+# So we reluctantly put them all in a subdirectory `America/Indiana'.
+
+# From Paul Eggert (2005-08-16):
+# http://www.mccsc.edu/time.html says that Indiana will use DST starting 2006.
+
+# From Nathan Stratton Treadway (2006-03-30):
+# http://www.dot.gov/affairs/dot0406.htm [3705 B]
+# From Deborah Goldsmith (2006-01-18):
+# http://dmses.dot.gov/docimages/pdf95/382329_web.pdf [2.9 MB]
+# From Paul Eggert (2006-01-20):
+# It says "DOT is relocating the time zone boundary in Indiana to move Starke,
+# Pulaski, Knox, Daviess, Martin, Pike, Dubois, and Perry Counties from the
+# Eastern Time Zone to the Central Time Zone.... The effective date of
+# this rule is 2:OO a.m. EST Sunday, April 2, 2006, which is the
+# changeover date from standard time to Daylight Saving Time."
+# Strictly speaking, this means the affected counties will change their
+# clocks twice that night, but this obviously is in error.  The intent
+# is that 01:59:59 EST be followed by 02:00:00 CDT.
+
+# From Gwillim Law (2007-02-10):
+# The Associated Press has been reporting that Pulaski County, Indiana is
+# going to switch from Central to Eastern Time on March 11, 2007....
+# http://www.indystar.com/apps/pbcs.dll/article?AID=/20070207/LOCAL190108/702070524/0/LOCAL
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule Indianapolis 1941 only    -       Jun     22      2:00    1:00    D
+Rule Indianapolis 1941 1954    -       Sep     lastSun 2:00    0       S
+Rule Indianapolis 1946 1954    -       Apr     lastSun 2:00    1:00    D
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Indianapolis -5:44:38 - LMT 1883 Nov 18 12:15:22
+                       -6:00   US      C%sT    1920
+                       -6:00 Indianapolis C%sT 1942
+                       -6:00   US      C%sT    1946
+                       -6:00 Indianapolis C%sT 1955 Apr 24 2:00
+                       -5:00   -       EST     1957 Sep 29 2:00
+                       -6:00   -       CST     1958 Apr 27 2:00
+                       -5:00   -       EST     1969
+                       -5:00   US      E%sT    1971
+                       -5:00   -       EST     2006
+                       -5:00   US      E%sT
+#
+# Eastern Crawford County, Indiana, left its clocks alone in 1974,
+# as well as from 1976 through 2005.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Marengo 1951    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Marengo 1951    only    -       Sep     lastSun 2:00    0       S
+Rule   Marengo 1954    1960    -       Apr     lastSun 2:00    1:00    D
+Rule   Marengo 1954    1960    -       Sep     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Marengo -5:45:23 -        LMT     1883 Nov 18 12:14:37
+                       -6:00   US      C%sT    1951
+                       -6:00   Marengo C%sT    1961 Apr 30 2:00
+                       -5:00   -       EST     1969
+                       -5:00   US      E%sT    1974 Jan  6 2:00
+                       -6:00   1:00    CDT     1974 Oct 27 2:00
+                       -5:00   US      E%sT    1976
+                       -5:00   -       EST     2006
+                       -5:00   US      E%sT
+#
+# Daviess, Dubois, Knox, Martin, and Perry Counties, Indiana,
+# switched from eastern to central time in April 2006.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule Vincennes 1946    only    -       Apr     lastSun 2:00    1:00    D
+Rule Vincennes 1946    only    -       Sep     lastSun 2:00    0       S
+Rule Vincennes 1953    1954    -       Apr     lastSun 2:00    1:00    D
+Rule Vincennes 1953    1959    -       Sep     lastSun 2:00    0       S
+Rule Vincennes 1955    only    -       May      1      0:00    1:00    D
+Rule Vincennes 1956    1963    -       Apr     lastSun 2:00    1:00    D
+Rule Vincennes 1960    only    -       Oct     lastSun 2:00    0       S
+Rule Vincennes 1961    only    -       Sep     lastSun 2:00    0       S
+Rule Vincennes 1962    1963    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Vincennes -5:50:07 - LMT  1883 Nov 18 12:09:53
+                       -6:00   US      C%sT    1946
+                       -6:00 Vincennes C%sT    1964 Apr 26 2:00
+                       -5:00   -       EST     1969
+                       -5:00   US      E%sT    1971
+                       -5:00   -       EST     2006 Apr  2 2:00
+                       -6:00   US      C%sT
+#
+# Pike County, Indiana moved from central to eastern time in 1977,
+# then switched back in 2006.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Pike    1955    only    -       May      1      0:00    1:00    D
+Rule   Pike    1955    1960    -       Sep     lastSun 2:00    0       S
+Rule   Pike    1956    1964    -       Apr     lastSun 2:00    1:00    D
+Rule   Pike    1961    1964    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Petersburg -5:49:07 - LMT 1883 Nov 18 12:10:53
+                       -6:00   US      C%sT    1955
+                       -6:00   Pike    C%sT    1965 Apr 25 2:00
+                       -5:00   -       EST     1966 Oct 30 2:00
+                       -6:00   US      C%sT    1977 Oct 30 2:00
+                       -5:00   -       EST     2006 Apr  2 2:00
+                       -6:00   US      C%sT
+#
+# Starke County, Indiana moved from central to eastern time in 1991,
+# then switched back in 2006.
+# From Arthur David Olson (1991-10-28):
+# An article on page A3 of the Sunday, 1991-10-27 Washington Post
+# notes that Starke County switched from Central time to Eastern time as of
+# 1991-10-27.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Starke  1947    1961    -       Apr     lastSun 2:00    1:00    D
+Rule   Starke  1947    1954    -       Sep     lastSun 2:00    0       S
+Rule   Starke  1955    1956    -       Oct     lastSun 2:00    0       S
+Rule   Starke  1957    1958    -       Sep     lastSun 2:00    0       S
+Rule   Starke  1959    1961    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Knox -5:46:30 -   LMT     1883 Nov 18 12:13:30
+                       -6:00   US      C%sT    1947
+                       -6:00   Starke  C%sT    1962 Apr 29 2:00
+                       -5:00   -       EST     1963 Oct 27 2:00
+                       -6:00   US      C%sT    1991 Oct 27 2:00
+                       -5:00   -       EST     2006 Apr  2 2:00
+                       -6:00   US      C%sT
+#
+# Pulaski County, Indiana, switched from eastern to central time in
+# April 2006 and then switched back in March 2007.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Pulaski 1946    1960    -       Apr     lastSun 2:00    1:00    D
+Rule   Pulaski 1946    1954    -       Sep     lastSun 2:00    0       S
+Rule   Pulaski 1955    1956    -       Oct     lastSun 2:00    0       S
+Rule   Pulaski 1957    1960    -       Sep     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Winamac -5:46:25 - LMT    1883 Nov 18 12:13:35
+                       -6:00   US      C%sT    1946
+                       -6:00   Pulaski C%sT    1961 Apr 30 2:00
+                       -5:00   -       EST     1969
+                       -5:00   US      E%sT    1971
+                       -5:00   -       EST     2006 Apr  2 2:00
+                       -6:00   US      C%sT    2007 Mar 11 2:00
+                       -5:00   US      E%sT
+#
+# Switzerland County, Indiana, did not observe DST from 1973 through 2005.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Indiana/Vevay -5:40:16 -  LMT     1883 Nov 18 12:19:44
+                       -6:00   US      C%sT    1954 Apr 25 2:00
+                       -5:00   -       EST     1969
+                       -5:00   US      E%sT    1973
+                       -5:00   -       EST     2006
+                       -5:00   US      E%sT
+
+# Part of Kentucky left its clocks alone in 1974.
+# This also includes Clark, Floyd, and Harrison counties in Indiana.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule Louisville        1921    only    -       May     1       2:00    1:00    D
+Rule Louisville        1921    only    -       Sep     1       2:00    0       S
+Rule Louisville        1941    1961    -       Apr     lastSun 2:00    1:00    D
+Rule Louisville        1941    only    -       Sep     lastSun 2:00    0       S
+Rule Louisville        1946    only    -       Jun     2       2:00    0       S
+Rule Louisville        1950    1955    -       Sep     lastSun 2:00    0       S
+Rule Louisville        1956    1960    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Kentucky/Louisville -5:43:02 -    LMT     1883 Nov 18 12:16:58
+                       -6:00   US      C%sT    1921
+                       -6:00 Louisville C%sT   1942
+                       -6:00   US      C%sT    1946
+                       -6:00 Louisville C%sT   1961 Jul 23 2:00
+                       -5:00   -       EST     1968
+                       -5:00   US      E%sT    1974 Jan  6 2:00
+                       -6:00   1:00    CDT     1974 Oct 27 2:00
+                       -5:00   US      E%sT
+#
+# Wayne County, Kentucky
+#
+# From
+# <a href="http://www.lake-cumberland.com/life/archive/news990129time.shtml">
+# Lake Cumberland LIFE
+# </a> (1999-01-29) via WKYM-101.7:
+# Clinton County has joined Wayne County in asking the DoT to change from
+# the Central to the Eastern time zone....  The Wayne County government made
+# the same request in December.  And while Russell County officials have not
+# taken action, the majority of respondents to a poll conducted there in
+# August indicated they would like to change to "fast time" also.
+# The three Lake Cumberland counties are the farthest east of any U.S.
+# location in the Central time zone.
+#
+# From Rich Wales (2000-08-29):
+# After prolonged debate, and despite continuing deep differences of opinion,
+# Wayne County (central Kentucky) is switching from Central (-0600) to Eastern
+# (-0500) time.  They won't "fall back" this year.  See Sara Shipley,
+# The difference an hour makes, Nando Times (2000-08-29 15:33 -0400).
+#
+# From Paul Eggert (2001-07-16):
+# The final rule was published in the
+# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=2000_register&docid=fr17au00-22">
+# Federal Register 65, 160 (2000-08-17), page 50154-50158.
+# </a>
+#
+Zone America/Kentucky/Monticello -5:39:24 - LMT        1883 Nov 18 12:20:36
+                       -6:00   US      C%sT    1946
+                       -6:00   -       CST     1968
+                       -6:00   US      C%sT    2000 Oct 29  2:00
+                       -5:00   US      E%sT
+
+
+# From Rives McDow (2000-08-30):
+# Here ... are all the changes in the US since 1985.
+# Kearny County, KS (put all of county on central;
+#      previously split between MST and CST) ... 1990-10
+# Starke County, IN (from CST to EST) ... 1991-10
+# Oliver County, ND (from MST to CST) ... 1992-10
+# West Wendover, NV (from PST TO MST) ... 1999-10
+# Wayne County, KY (from CST to EST) ... 2000-10
+#
+# From Paul Eggert (2001-07-17):
+# We don't know where the line used to be within Kearny County, KS,
+# so omit that change for now.
+# See America/Indiana/Knox for the Starke County, IN change.
+# See America/North_Dakota/Center for the Oliver County, ND change.
+# West Wendover, NV officially switched from Pacific to mountain time on
+# 1999-10-31.  See the
+# <a href="http://frwebgate.access.gpo.gov/cgi-bin/getdoc.cgi?dbname=1999_register&docid=fr21oc99-15">
+# Federal Register 64, 203 (1999-10-21), page 56705-56707.
+# </a>
+# However, the Federal Register says that West Wendover already operated
+# on mountain time, and the rule merely made this official;
+# hence a separate tz entry is not needed.
+
+# Michigan
+#
+# From Bob Devine (1988-01-28):
+# Michigan didn't observe DST from 1968 to 1973.
+#
+# From Paul Eggert (1999-03-31):
+# Shanks writes that Michigan started using standard time on 1885-09-18,
+# but Howse writes (pp 124-125, referring to Popular Astronomy, 1901-01)
+# that Detroit kept
+#
+#      local time until 1900 when the City Council decreed that clocks should
+#      be put back twenty-eight minutes to Central Standard Time.  Half the
+#      city obeyed, half refused.  After considerable debate, the decision
+#      was rescinded and the city reverted to Sun time.  A derisive offer to
+#      erect a sundial in front of the city hall was referred to the
+#      Committee on Sewers.  Then, in 1905, Central time was adopted
+#      by city vote.
+#
+# This story is too entertaining to be false, so go with Howse over Shanks.
+#
+# From Paul Eggert (2001-03-06):
+# Garland (1927) writes ``Cleveland and Detroit advanced their clocks
+# one hour in 1914.''  This change is not in Shanks.  We have no more
+# info, so omit this for now.
+#
+# Most of Michigan observed DST from 1973 on, but was a bit late in 1975.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule   Detroit 1948    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Detroit 1948    only    -       Sep     lastSun 2:00    0       S
+Rule   Detroit 1967    only    -       Jun     14      2:00    1:00    D
+Rule   Detroit 1967    only    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Detroit   -5:32:11 -      LMT     1905
+                       -6:00   -       CST     1915 May 15 2:00
+                       -5:00   -       EST     1942
+                       -5:00   US      E%sT    1946
+                       -5:00   Detroit E%sT    1973
+                       -5:00   US      E%sT    1975
+                       -5:00   -       EST     1975 Apr 27 2:00
+                       -5:00   US      E%sT
+#
+# Dickinson, Gogebic, Iron, and Menominee Counties, Michigan,
+# switched from EST to CST/CDT in 1973.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER
+Rule Menominee 1946    only    -       Apr     lastSun 2:00    1:00    D
+Rule Menominee 1946    only    -       Sep     lastSun 2:00    0       S
+Rule Menominee 1966    only    -       Apr     lastSun 2:00    1:00    D
+Rule Menominee 1966    only    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Menominee -5:50:27 -      LMT     1885 Sep 18 12:00
+                       -6:00   US      C%sT    1946
+                       -6:00 Menominee C%sT    1969 Apr 27 2:00
+                       -5:00   -       EST     1973 Apr 29 2:00
+                       -6:00   US      C%sT
+
+# Navassa
+# administered by the US Fish and Wildlife Service
+# claimed by US under the provisions of the 1856 Guano Islands Act
+# also claimed by Haiti
+# occupied 1857/1900 by the Navassa Phosphate Co
+# US lighthouse 1917/1996-09
+# currently uninhabited
+# see Mark Fineman, ``An Isle Rich in Guano and Discord'',
+# _Los Angeles Times_ (1998-11-10), A1, A10; it cites
+# Jimmy Skaggs, _The Great Guano Rush_ (1994).
+
+################################################################################
+
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Other sources occasionally used include:
+#
+#      Edward W. Whitman, World Time Differences,
+#      Whitman Publishing Co, 2 Niagara Av, Ealing, London (undated),
+#      which I found in the UCLA library.
+#
+#      <a href="http://www.pettswoodvillage.co.uk/Daylight_Savings_William_Willett.pdf">
+#      William Willett, The Waste of Daylight, 19th edition
+#      </a> (1914-03)
+#
+# See the `europe' file for Greenland.
+
+# Canada
+
+# From Alain LaBont<e'> (1994-11-14):
+# I post here the time zone abbreviations standardized in Canada
+# for both English and French in the CAN/CSA-Z234.4-89 standard....
+#
+#      UTC     Standard time   Daylight savings time
+#      offset  French  English French  English
+#      -2:30   -       -       HAT     NDT
+#      -3      -       -       HAA     ADT
+#      -3:30   HNT     NST     -       -
+#      -4      HNA     AST     HAE     EDT
+#      -5      HNE     EST     HAC     CDT
+#      -6      HNC     CST     HAR     MDT
+#      -7      HNR     MST     HAP     PDT
+#      -8      HNP     PST     HAY     YDT
+#      -9      HNY     YST     -       -
+#
+#      HN: Heure Normale       ST: Standard Time
+#      HA: Heure Avanc<e'>e    DT: Daylight saving Time
+#
+#      A: de l'Atlantique      Atlantic
+#      C: du Centre            Central
+#      E: de l'Est             Eastern
+#      M:                      Mountain
+#      N:                      Newfoundland
+#      P: du Pacifique         Pacific
+#      R: des Rocheuses
+#      T: de Terre-Neuve
+#      Y: du Yukon             Yukon
+#
+# From Paul Eggert (1994-11-22):
+# Alas, this sort of thing must be handled by localization software.
+
+# Unless otherwise specified, the data for Canada are all from Shanks
+# & Pottenger.
+
+# From Chris Walton (2006-04-01, 2006-04-25, 2006-06-26, 2007-01-31,
+# 2007-03-01):
+# The British Columbia government announced yesterday that it will
+# adjust daylight savings next year to align with changes in the
+# U.S. and the rest of Canada....
+# http://www2.news.gov.bc.ca/news_releases_2005-2009/2006AG0014-000330.htm
+# ...
+# Nova Scotia
+# Daylight saving time will be extended by four weeks starting in 2007....
+# http://www.gov.ns.ca/just/regulations/rg2/2006/ma1206.pdf
+#
+# [For New Brunswick] the new legislation dictates that the time change is to
+# be done at 02:00 instead of 00:01.
+# http://www.gnb.ca/0062/acts/BBA-2006/Chap-19.pdf
+# ...
+# Manitoba has traditionally changed the clock every fall at 03:00.
+# As of 2006, the transition is to take place one hour earlier at 02:00.
+# http://web2.gov.mb.ca/laws/statutes/ccsm/o030e.php
+# ...
+# [Alberta, Ontario, Quebec] will follow US rules.
+# http://www.qp.gov.ab.ca/documents/spring/CH03_06.CFM
+# http://www.e-laws.gov.on.ca/DBLaws/Source/Regs/English/2006/R06111_e.htm
+# http://www2.publicationsduquebec.gouv.qc.ca/dynamicSearch/telecharge.php?type=5&file=2006C39A.PDF
+# ...
+# P.E.I. will follow US rules....
+# http://www.assembly.pe.ca/bills/pdf_chapter/62/3/chapter-41.pdf
+# ...
+# Province of Newfoundland and Labrador....
+# http://www.hoa.gov.nl.ca/hoa/bills/Bill0634.htm
+# ...
+# Yukon
+# http://www.gov.yk.ca/legislation/regs/oic2006_127.pdf
+# ...
+# N.W.T. will follow US rules.  Whoever maintains the government web site
+# does not seem to believe in bookmarks.  To see the news release, click the
+# following link and search for "Daylight Savings Time Change".  Press the
+# "Daylight Savings Time Change" link; it will fire off a popup using
+# JavaScript.
+# http://www.exec.gov.nt.ca/currentnews/currentPR.asp?mode=archive
+# ...
+# Nunavut
+# An amendment to the Interpretation Act was registered on February 19/2007....
+# http://action.attavik.ca/home/justice-gn/attach/2007/gaz02part2.pdf
+
+# From Paul Eggert (2006-04-25):
+# H. David Matthews and Mary Vincent's map
+# <a href="http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp">
+# "It's about TIME", _Canadian Geographic_ (September-October 1998)
+# </a> contains detailed boundaries for regions observing nonstandard
+# time and daylight saving time arrangements in Canada circa 1998.
+#
+# INMS, the Institute for National Measurement Standards in Ottawa, has <a
+# href="http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php">
+# information about standard and daylight saving time zones in Canada.
+# </a> (updated periodically).
+# Its unofficial information is often taken from Matthews and Vincent.
+
+# From Paul Eggert (2006-06-27):
+# For now, assume all of DST-observing Canada will fall into line with the
+# new US DST rules,
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Canada  1918    only    -       Apr     14      2:00    1:00    D
+Rule   Canada  1918    only    -       Oct     31      2:00    0       S
+Rule   Canada  1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   Canada  1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   Canada  1945    only    -       Sep     30      2:00    0       S
+Rule   Canada  1974    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   Canada  1974    2006    -       Oct     lastSun 2:00    0       S
+Rule   Canada  1987    2006    -       Apr     Sun>=1  2:00    1:00    D
+Rule   Canada  2007    max     -       Mar     Sun>=8  2:00    1:00    D
+Rule   Canada  2007    max     -       Nov     Sun>=1  2:00    0       S
+
+
+# Newfoundland and Labrador
+
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) write that Labrador should use NST/NDT,
+# but the only part of Labrador that follows the rules is the
+# southeast corner, including Port Hope Simpson and Mary's Harbour,
+# but excluding, say, Black Tickle.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   StJohns 1917    only    -       Apr      8      2:00    1:00    D
+Rule   StJohns 1917    only    -       Sep     17      2:00    0       S
+# Whitman gives 1919 Apr 5 and 1920 Apr 5; go with Shanks & Pottenger.
+Rule   StJohns 1919    only    -       May      5      23:00   1:00    D
+Rule   StJohns 1919    only    -       Aug     12      23:00   0       S
+# For 1931-1935 Whitman gives Apr same date; go with Shanks & Pottenger.
+Rule   StJohns 1920    1935    -       May     Sun>=1  23:00   1:00    D
+Rule   StJohns 1920    1935    -       Oct     lastSun 23:00   0       S
+# For 1936-1941 Whitman gives May Sun>=8 and Oct Sun>=1; go with Shanks &
+# Pottenger.
+Rule   StJohns 1936    1941    -       May     Mon>=9  0:00    1:00    D
+Rule   StJohns 1936    1941    -       Oct     Mon>=2  0:00    0       S
+# Whitman gives the following transitions:
+# 1942 03-01/12-31, 1943 05-30/09-05, 1944 07-10/09-02, 1945 01-01/10-07
+# but go with Shanks & Pottenger and assume they used Canadian rules.
+# For 1946-9 Whitman gives May 5,4,9,1 - Oct 1,5,3,2, and for 1950 he gives
+# Apr 30 - Sep 24; go with Shanks & Pottenger.
+Rule   StJohns 1946    1950    -       May     Sun>=8  2:00    1:00    D
+Rule   StJohns 1946    1950    -       Oct     Sun>=2  2:00    0       S
+Rule   StJohns 1951    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   StJohns 1951    1959    -       Sep     lastSun 2:00    0       S
+Rule   StJohns 1960    1986    -       Oct     lastSun 2:00    0       S
+# From Paul Eggert (2000-10-02):
+# INMS (2000-09-12) says that, since 1988 at least, Newfoundland switches
+# at 00:01 local time.  For now, assume it started in 1987.
+Rule   StJohns 1987    only    -       Apr     Sun>=1  0:01    1:00    D
+Rule   StJohns 1987    2006    -       Oct     lastSun 0:01    0       S
+Rule   StJohns 1988    only    -       Apr     Sun>=1  0:01    2:00    DD
+Rule   StJohns 1989    2006    -       Apr     Sun>=1  0:01    1:00    D
+Rule   StJohns 2007    max     -       Mar     Sun>=8  0:01    1:00    D
+Rule   StJohns 2007    max     -       Nov     Sun>=1  0:01    0       S
+#
+# St John's has an apostrophe, but Posix file names can't have apostrophes.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/St_Johns  -3:30:52 -      LMT     1884
+                       -3:30:52 StJohns N%sT   1918
+                       -3:30:52 Canada N%sT    1919
+                       -3:30:52 StJohns N%sT   1935 Mar 30
+                       -3:30   StJohns N%sT    1942 May 11
+                       -3:30   Canada  N%sT    1946
+                       -3:30   StJohns N%sT
+
+# most of east Labrador
+
+# The name `Happy Valley-Goose Bay' is too long; use `Goose Bay'.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Goose_Bay -4:01:40 -      LMT     1884 # Happy Valley-Goose Bay
+                       -3:30:52 -      NST     1918
+                       -3:30:52 Canada N%sT    1919
+                       -3:30:52 -      NST     1935 Mar 30
+                       -3:30   -       NST     1936
+                       -3:30   StJohns N%sT    1942 May 11
+                       -3:30   Canada  N%sT    1946
+                       -3:30   StJohns N%sT    1966 Mar 15 2:00
+                       -4:00   StJohns A%sT
+
+
+# west Labrador, Nova Scotia, Prince Edward I
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that since 1970 most of this region has been like
+# Halifax.  Many locales did not observe peacetime DST until 1972;
+# Glace Bay, NS is the largest that we know of.
+# Shanks & Pottenger also write that Liverpool, NS was the only town
+# in Canada to observe DST in 1971 but not 1970; for now we'll assume
+# this is a typo.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Halifax 1916    only    -       Apr      1      0:00    1:00    D
+Rule   Halifax 1916    only    -       Oct      1      0:00    0       S
+Rule   Halifax 1920    only    -       May      9      0:00    1:00    D
+Rule   Halifax 1920    only    -       Aug     29      0:00    0       S
+Rule   Halifax 1921    only    -       May      6      0:00    1:00    D
+Rule   Halifax 1921    1922    -       Sep      5      0:00    0       S
+Rule   Halifax 1922    only    -       Apr     30      0:00    1:00    D
+Rule   Halifax 1923    1925    -       May     Sun>=1  0:00    1:00    D
+Rule   Halifax 1923    only    -       Sep      4      0:00    0       S
+Rule   Halifax 1924    only    -       Sep     15      0:00    0       S
+Rule   Halifax 1925    only    -       Sep     28      0:00    0       S
+Rule   Halifax 1926    only    -       May     16      0:00    1:00    D
+Rule   Halifax 1926    only    -       Sep     13      0:00    0       S
+Rule   Halifax 1927    only    -       May      1      0:00    1:00    D
+Rule   Halifax 1927    only    -       Sep     26      0:00    0       S
+Rule   Halifax 1928    1931    -       May     Sun>=8  0:00    1:00    D
+Rule   Halifax 1928    only    -       Sep      9      0:00    0       S
+Rule   Halifax 1929    only    -       Sep      3      0:00    0       S
+Rule   Halifax 1930    only    -       Sep     15      0:00    0       S
+Rule   Halifax 1931    1932    -       Sep     Mon>=24 0:00    0       S
+Rule   Halifax 1932    only    -       May      1      0:00    1:00    D
+Rule   Halifax 1933    only    -       Apr     30      0:00    1:00    D
+Rule   Halifax 1933    only    -       Oct      2      0:00    0       S
+Rule   Halifax 1934    only    -       May     20      0:00    1:00    D
+Rule   Halifax 1934    only    -       Sep     16      0:00    0       S
+Rule   Halifax 1935    only    -       Jun      2      0:00    1:00    D
+Rule   Halifax 1935    only    -       Sep     30      0:00    0       S
+Rule   Halifax 1936    only    -       Jun      1      0:00    1:00    D
+Rule   Halifax 1936    only    -       Sep     14      0:00    0       S
+Rule   Halifax 1937    1938    -       May     Sun>=1  0:00    1:00    D
+Rule   Halifax 1937    1941    -       Sep     Mon>=24 0:00    0       S
+Rule   Halifax 1939    only    -       May     28      0:00    1:00    D
+Rule   Halifax 1940    1941    -       May     Sun>=1  0:00    1:00    D
+Rule   Halifax 1946    1949    -       Apr     lastSun 2:00    1:00    D
+Rule   Halifax 1946    1949    -       Sep     lastSun 2:00    0       S
+Rule   Halifax 1951    1954    -       Apr     lastSun 2:00    1:00    D
+Rule   Halifax 1951    1954    -       Sep     lastSun 2:00    0       S
+Rule   Halifax 1956    1959    -       Apr     lastSun 2:00    1:00    D
+Rule   Halifax 1956    1959    -       Sep     lastSun 2:00    0       S
+Rule   Halifax 1962    1973    -       Apr     lastSun 2:00    1:00    D
+Rule   Halifax 1962    1973    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Halifax   -4:14:24 -      LMT     1902 Jun 15
+                       -4:00   Halifax A%sT    1918
+                       -4:00   Canada  A%sT    1919
+                       -4:00   Halifax A%sT    1942 Feb  9 2:00s
+                       -4:00   Canada  A%sT    1946
+                       -4:00   Halifax A%sT    1974
+                       -4:00   Canada  A%sT
+Zone America/Glace_Bay -3:59:48 -      LMT     1902 Jun 15
+                       -4:00   Canada  A%sT    1953
+                       -4:00   Halifax A%sT    1954
+                       -4:00   -       AST     1972
+                       -4:00   Halifax A%sT    1974
+                       -4:00   Canada  A%sT
+
+# New Brunswick
+
+# From Paul Eggert (2007-01-31):
+# The Time Definition Act <http://www.gnb.ca/0062/PDF-acts/t-06.pdf>
+# says they changed at 00:01 through 2006, and
+# <http://www.canlii.org/nb/laws/sta/t-6/20030127/whole.html> makes it
+# clear that this was the case since at least 1993.
+# For now, assume it started in 1993.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Moncton 1933    1935    -       Jun     Sun>=8  1:00    1:00    D
+Rule   Moncton 1933    1935    -       Sep     Sun>=8  1:00    0       S
+Rule   Moncton 1936    1938    -       Jun     Sun>=1  1:00    1:00    D
+Rule   Moncton 1936    1938    -       Sep     Sun>=1  1:00    0       S
+Rule   Moncton 1939    only    -       May     27      1:00    1:00    D
+Rule   Moncton 1939    1941    -       Sep     Sat>=21 1:00    0       S
+Rule   Moncton 1940    only    -       May     19      1:00    1:00    D
+Rule   Moncton 1941    only    -       May      4      1:00    1:00    D
+Rule   Moncton 1946    1972    -       Apr     lastSun 2:00    1:00    D
+Rule   Moncton 1946    1956    -       Sep     lastSun 2:00    0       S
+Rule   Moncton 1957    1972    -       Oct     lastSun 2:00    0       S
+Rule   Moncton 1993    2006    -       Apr     Sun>=1  0:01    1:00    D
+Rule   Moncton 1993    2006    -       Oct     lastSun 0:01    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Moncton   -4:19:08 -      LMT     1883 Dec  9
+                       -5:00   -       EST     1902 Jun 15
+                       -4:00   Canada  A%sT    1933
+                       -4:00   Moncton A%sT    1942
+                       -4:00   Canada  A%sT    1946
+                       -4:00   Moncton A%sT    1973
+                       -4:00   Canada  A%sT    1993
+                       -4:00   Moncton A%sT    2007
+                       -4:00   Canada  A%sT
+
+# Quebec
+
+# From Paul Eggert (2006-07-09):
+# Shanks & Pottenger write that since 1970 most of Quebec has been
+# like Montreal.
+
+# From Paul Eggert (2006-06-27):
+# Matthews and Vincent (1998) also write that Quebec east of the -63
+# meridian is supposed to observe AST, but residents as far east as
+# Natashquan use EST/EDT, and residents east of Natashquan use AST.
+# In "Official time in Quebec" the Quebec department of justice writes in
+# http://www.justice.gouv.qc.ca/english/publications/generale/temps-regl-1-a.htm
+# that "The residents of the Municipality of the
+# Cote-Nord-du-Golfe-Saint-Laurent and the municipalities of Saint-Augustin,
+# Bonne-Esperance and Blanc-Sablon apply the Official Time Act as it is
+# written and use Atlantic standard time all year round. The same applies to
+# the residents of the Native facilities along the lower North Shore."
+# <http://www.assnat.qc.ca/eng/37legislature2/Projets-loi/Publics/06-a002.htm>
+# says this common practice was codified into law as of 2007.
+# For lack of better info, guess this practice began around 1970, contra to
+# Shanks & Pottenger who have this region observing AST/ADT.
+
+# 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/Blanc-Sablon -3:48:28 -   LMT     1884
+                       -4:00   Canada  A%sT    1970
+                       -4:00   -       AST
+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
+
+
+# Ontario
+
+# From Paul Eggert (2006-07-09):
+# Shanks & Pottenger write that since 1970 most of Ontario has been like
+# Toronto.
+# Thunder Bay skipped DST in 1973.
+# Many smaller locales did not observe peacetime DST until 1974;
+# Nipigon (EST) and Rainy River (CST) are the largest that we know of.
+# Far west Ontario is like Winnipeg; far east Quebec is like Halifax.
+
+# From Mark Brader (2003-07-26):
+# [According to the Toronto Star] Orillia, Ontario, adopted DST
+# effective Saturday, 1912-06-22, 22:00; the article mentions that
+# Port Arthur (now part of Thunder Bay, Ontario) as well as Moose Jaw
+# have already done so.  In Orillia DST was to run until Saturday,
+# 1912-08-31 (no time mentioned), but it was met with considerable
+# hostility from certain segments of the public, and was revoked after
+# only two weeks -- I copied it as Saturday, 1912-07-07, 22:00, but
+# presumably that should be -07-06.  (1912-06-19, -07-12; also letters
+# earlier in June).
+#
+# Kenora, Ontario, was to abandon DST on 1914-06-01 (-05-21).
+
+# From Paul Eggert (1997-10-17):
+# Mark Brader writes that an article in the 1997-10-14 Toronto Star
+# says that Atikokan, Ontario currently does not observe DST,
+# but will vote on 11-10 whether to use EST/EDT.
+# He also writes that the
+# <a href="http://www.gov.on.ca/MBS/english/publications/statregs/conttext.html">
+# Ontario Time Act (1990, Chapter T.9)
+# </a>
+# says that Ontario east of 90W uses EST/EDT, and west of 90W uses CST/CDT.
+# Officially Atikokan is therefore on CST/CDT, and most likely this report
+# concerns a non-official time observed as a matter of local practice.
+#
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) write that Atikokan, Pickle Lake, and
+# New Osnaburgh observe CST all year, that Big Trout Lake observes
+# CST/CDT, and that Upsala and Shebandowan observe EST/EDT, all in
+# violation of the official Ontario rules.
+#
+# From Paul Eggert (2006-07-09):
+# Chris Walton (2006-07-06) mentioned an article by Stephanie MacLellan in the
+# 2005-07-21 Chronicle-Journal, which said:
+#
+#      The clocks in Atikokan stay set on standard time year-round.
+#      This means they spend about half the time on central time and
+#      the other half on eastern time.
+#
+#      For the most part, the system works, Mayor Dennis Brown said.
+#
+#      "The majority of businesses in Atikokan deal more with Eastern
+#      Canada, but there are some that deal with Western Canada," he
+#      said.  "I don't see any changes happening here."
+#
+# Walton also writes "Supposedly Pickle Lake and Mishkeegogamang
+# [New Osnaburgh] follow the same practice."
+
+# From Garry McKinnon (2006-07-14) via Chris Walton:
+# I chatted with a member of my board who has an outstanding memory
+# and a long history in Atikokan (and in the telecom industry) and he
+# can say for certain that Atikokan has been practicing the current
+# time keeping since 1952, at least.
+
+# From Paul Eggert (2006-07-17):
+# Shanks & Pottenger say that Atikokan has agreed with Rainy River
+# ever since standard time was introduced, but the information from
+# McKinnon sounds more authoritative.  For now, assume that Atikokan
+# switched to EST immediately after WWII era daylight saving time
+# ended.  This matches the old (less-populous) America/Coral_Harbour
+# entry since our cutoff date of 1970, so we can move
+# America/Coral_Harbour to the 'backward' file.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Toronto 1919    only    -       Mar     30      23:30   1:00    D
+Rule   Toronto 1919    only    -       Oct     26      0:00    0       S
+Rule   Toronto 1920    only    -       May      2      2:00    1:00    D
+Rule   Toronto 1920    only    -       Sep     26      0:00    0       S
+Rule   Toronto 1921    only    -       May     15      2:00    1:00    D
+Rule   Toronto 1921    only    -       Sep     15      2:00    0       S
+Rule   Toronto 1922    1923    -       May     Sun>=8  2:00    1:00    D
+# Shanks & Pottenger say 1923-09-19; assume it's a typo and that "-16"
+# was meant.
+Rule   Toronto 1922    1926    -       Sep     Sun>=15 2:00    0       S
+Rule   Toronto 1924    1927    -       May     Sun>=1  2:00    1:00    D
+# The 1927-to-1939 rules can be expressed more simply as
+# Rule Toronto 1927    1937    -       Sep     Sun>=25 2:00    0       S
+# Rule Toronto 1928    1937    -       Apr     Sun>=25 2:00    1:00    D
+# Rule Toronto 1938    1940    -       Apr     lastSun 2:00    1:00    D
+# Rule Toronto 1938    1939    -       Sep     lastSun 2:00    0       S
+# The rules below avoid use of Sun>=25
+# (which pre-2004 versions of zic cannot handle).
+Rule   Toronto 1927    1932    -       Sep     lastSun 2:00    0       S
+Rule   Toronto 1928    1931    -       Apr     lastSun 2:00    1:00    D
+Rule   Toronto 1932    only    -       May     1       2:00    1:00    D
+Rule   Toronto 1933    1940    -       Apr     lastSun 2:00    1:00    D
+Rule   Toronto 1933    only    -       Oct     1       2:00    0       S
+Rule   Toronto 1934    1939    -       Sep     lastSun 2:00    0       S
+Rule   Toronto 1945    1946    -       Sep     lastSun 2:00    0       S
+Rule   Toronto 1946    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Toronto 1947    1949    -       Apr     lastSun 0:00    1:00    D
+Rule   Toronto 1947    1948    -       Sep     lastSun 0:00    0       S
+Rule   Toronto 1949    only    -       Nov     lastSun 0:00    0       S
+Rule   Toronto 1950    1973    -       Apr     lastSun 2:00    1:00    D
+Rule   Toronto 1950    only    -       Nov     lastSun 2:00    0       S
+Rule   Toronto 1951    1956    -       Sep     lastSun 2:00    0       S
+# Shanks & Pottenger say Toronto ended DST a week early in 1971,
+# namely on 1971-10-24, but Mark Brader wrote (2003-05-31) that this
+# is wrong, and that he had confirmed it by checking the 1971-10-30
+# Toronto Star, which said that DST was ending 1971-10-31 as usual.
+Rule   Toronto 1957    1973    -       Oct     lastSun 2:00    0       S
+
+# From Paul Eggert (2003-07-27):
+# Willett (1914-03) writes (p. 17) "In the Cities of Fort William, and
+# Port Arthur, Ontario, the principle of the Bill has been in
+# operation for the past three years, and in the City of Moose Jaw,
+# Saskatchewan, for one year."
+
+# From David Bryan via Tory Tronrud, Director/Curator,
+# Thunder Bay Museum (2003-11-12):
+# There is some suggestion, however, that, by-law or not, daylight
+# savings time was being practiced in Fort William and Port Arthur
+# before 1909.... [I]n 1910, the line between the Eastern and Central
+# Time Zones was permanently moved about two hundred miles west to
+# include the Thunder Bay area....  When Canada adopted daylight
+# savings time in 1916, Fort William and Port Arthur, having done so
+# already, did not change their clocks....  During the Second World
+# War,... [t]he cities agreed to implement DST during the summer
+# months for the remainder of the war years.
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Toronto   -5:17:32 -      LMT     1895
+                       -5:00   Canada  E%sT    1919
+                       -5:00   Toronto E%sT    1942 Feb  9 2:00s
+                       -5:00   Canada  E%sT    1946
+                       -5:00   Toronto E%sT    1974
+                       -5:00   Canada  E%sT
+Zone America/Thunder_Bay -5:57:00 -    LMT     1895
+                       -6:00   -       CST     1910
+                       -5:00   -       EST     1942
+                       -5:00   Canada  E%sT    1970
+                       -5:00   Mont    E%sT    1973
+                       -5:00   -       EST     1974
+                       -5:00   Canada  E%sT
+Zone America/Nipigon   -5:53:04 -      LMT     1895
+                       -5:00   Canada  E%sT    1940 Sep 29
+                       -5:00   1:00    EDT     1942 Feb  9 2:00s
+                       -5:00   Canada  E%sT
+Zone America/Rainy_River -6:18:16 -    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
+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
+
+
+# Manitoba
+
+# From Rob Douglas (2006-04-06):
+# the old Manitoba Time Act - as amended by Bill 2, assented to
+# March 27, 1987 ... said ...
+# "between two o'clock Central Standard Time in the morning of
+# the first Sunday of April of each year and two o'clock Central
+# Standard Time in the morning of the last Sunday of October next
+# following, one hour in advance of Central Standard Time."...
+# I believe that the English legislation [of the old time act] had =
+# been assented to (March 22, 1967)....
+# Also, as far as I can tell, there was no order-in-council varying
+# the time of Daylight Saving Time for 2005 and so the provisions of
+# the 1987 version would apply - the changeover was at 2:00 Central
+# Standard Time (i.e. not until 3:00 Central Daylight Time).
+
+# From Paul Eggert (2006-04-10):
+# Shanks & Pottenger say Manitoba switched at 02:00 (not 02:00s)
+# starting 1966.  Since 02:00s is clearly correct for 1967 on, assume
+# it was also 02:00s in 1966.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Winn    1916    only    -       Apr     23      0:00    1:00    D
+Rule   Winn    1916    only    -       Sep     17      0:00    0       S
+Rule   Winn    1918    only    -       Apr     14      2:00    1:00    D
+Rule   Winn    1918    only    -       Oct     31      2:00    0       S
+Rule   Winn    1937    only    -       May     16      2:00    1:00    D
+Rule   Winn    1937    only    -       Sep     26      2:00    0       S
+Rule   Winn    1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   Winn    1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   Winn    1945    only    -       Sep     lastSun 2:00    0       S
+Rule   Winn    1946    only    -       May     12      2:00    1:00    D
+Rule   Winn    1946    only    -       Oct     13      2:00    0       S
+Rule   Winn    1947    1949    -       Apr     lastSun 2:00    1:00    D
+Rule   Winn    1947    1949    -       Sep     lastSun 2:00    0       S
+Rule   Winn    1950    only    -       May      1      2:00    1:00    D
+Rule   Winn    1950    only    -       Sep     30      2:00    0       S
+Rule   Winn    1951    1960    -       Apr     lastSun 2:00    1:00    D
+Rule   Winn    1951    1958    -       Sep     lastSun 2:00    0       S
+Rule   Winn    1959    only    -       Oct     lastSun 2:00    0       S
+Rule   Winn    1960    only    -       Sep     lastSun 2:00    0       S
+Rule   Winn    1963    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Winn    1963    only    -       Sep     22      2:00    0       S
+Rule   Winn    1966    1986    -       Apr     lastSun 2:00s   1:00    D
+Rule   Winn    1966    2005    -       Oct     lastSun 2:00s   0       S
+Rule   Winn    1987    2005    -       Apr     Sun>=1  2:00s   1:00    D
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Winnipeg  -6:28:36 -      LMT     1887 Jul 16
+                       -6:00   Winn    C%sT    2006
+                       -6:00   Canada  C%sT
+
+
+# Saskatchewan
+
+# From Mark Brader (2003-07-26):
+# The first actual adoption of DST in Canada was at the municipal
+# level.  As the [Toronto] Star put it (1912-06-07), "While people
+# elsewhere have long been talking of legislation to save daylight,
+# the city of Moose Jaw [Saskatchewan] has acted on its own hook."
+# DST in Moose Jaw began on Saturday, 1912-06-01 (no time mentioned:
+# presumably late evening, as below), and would run until "the end of
+# the summer".  The discrepancy between municipal time and railroad
+# time was noted.
+
+# From Paul Eggert (2003-07-27):
+# Willett (1914-03) notes that DST "has been in operation ... in the
+# City of Moose Jaw, Saskatchewan, for one year."
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that since 1970 this region has mostly been as Regina.
+# Some western towns (e.g. Swift Current) switched from MST/MDT to CST in 1972.
+# Other western towns (e.g. Lloydminster) are like Edmonton.
+# Matthews and Vincent (1998) write that Denare Beach and Creighton
+# are like Winnipeg, in violation of Saskatchewan law.
+
+# From W. Jones (1992-11-06):
+# The. . .below is based on information I got from our law library, the
+# provincial archives, and the provincial Community Services department.
+# A precise history would require digging through newspaper archives, and
+# since you didn't say what you wanted, I didn't bother.
+#
+# Saskatchewan is split by a time zone meridian (105W) and over the years
+# the boundary became pretty ragged as communities near it reevaluated
+# their affiliations in one direction or the other.  In 1965 a provincial
+# referendum favoured legislating common time practices.
+#
+# On 15 April 1966 the Time Act (c. T-14, Revised Statutes of
+# Saskatchewan 1978) was proclaimed, and established that the eastern
+# part of Saskatchewan would use CST year round, that districts in
+# northwest Saskatchewan would by default follow CST but could opt to
+# follow Mountain Time rules (thus 1 hour difference in the winter and
+# zero in the summer), and that districts in southwest Saskatchewan would
+# by default follow MT but could opt to follow CST.
+#
+# It took a few years for the dust to settle (I know one story of a town
+# on one time zone having its school in another, such that a mom had to
+# serve her family lunch in two shifts), but presently it seems that only
+# a few towns on the border with Alberta (e.g. Lloydminster) follow MT
+# rules any more; all other districts appear to have used CST year round
+# since sometime in the 1960s.
+
+# From Chris Walton (2006-06-26):
+# The Saskatchewan time act which was last updated in 1996 is about 30 pages
+# long and rather painful to read.
+# http://www.qp.gov.sk.ca/documents/English/Statutes/Statutes/T14.pdf
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Regina  1918    only    -       Apr     14      2:00    1:00    D
+Rule   Regina  1918    only    -       Oct     31      2:00    0       S
+Rule   Regina  1930    1934    -       May     Sun>=1  0:00    1:00    D
+Rule   Regina  1930    1934    -       Oct     Sun>=1  0:00    0       S
+Rule   Regina  1937    1941    -       Apr     Sun>=8  0:00    1:00    D
+Rule   Regina  1937    only    -       Oct     Sun>=8  0:00    0       S
+Rule   Regina  1938    only    -       Oct     Sun>=1  0:00    0       S
+Rule   Regina  1939    1941    -       Oct     Sun>=8  0:00    0       S
+Rule   Regina  1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   Regina  1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   Regina  1945    only    -       Sep     lastSun 2:00    0       S
+Rule   Regina  1946    only    -       Apr     Sun>=8  2:00    1:00    D
+Rule   Regina  1946    only    -       Oct     Sun>=8  2:00    0       S
+Rule   Regina  1947    1957    -       Apr     lastSun 2:00    1:00    D
+Rule   Regina  1947    1957    -       Sep     lastSun 2:00    0       S
+Rule   Regina  1959    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Regina  1959    only    -       Oct     lastSun 2:00    0       S
+#
+Rule   Swift   1957    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Swift   1957    only    -       Oct     lastSun 2:00    0       S
+Rule   Swift   1959    1961    -       Apr     lastSun 2:00    1:00    D
+Rule   Swift   1959    only    -       Oct     lastSun 2:00    0       S
+Rule   Swift   1960    1961    -       Sep     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Regina    -6:58:36 -      LMT     1905 Sep
+                       -7:00   Regina  M%sT    1960 Apr lastSun 2:00
+                       -6:00   -       CST
+Zone America/Swift_Current -7:11:20 -  LMT     1905 Sep
+                       -7:00   Canada  M%sT    1946 Apr lastSun 2:00
+                       -7:00   Regina  M%sT    1950
+                       -7:00   Swift   M%sT    1972 Apr lastSun 2:00
+                       -6:00   -       CST
+
+
+# Alberta
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Edm     1918    1919    -       Apr     Sun>=8  2:00    1:00    D
+Rule   Edm     1918    only    -       Oct     31      2:00    0       S
+Rule   Edm     1919    only    -       May     27      2:00    0       S
+Rule   Edm     1920    1923    -       Apr     lastSun 2:00    1:00    D
+Rule   Edm     1920    only    -       Oct     lastSun 2:00    0       S
+Rule   Edm     1921    1923    -       Sep     lastSun 2:00    0       S
+Rule   Edm     1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   Edm     1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   Edm     1945    only    -       Sep     lastSun 2:00    0       S
+Rule   Edm     1947    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Edm     1947    only    -       Sep     lastSun 2:00    0       S
+Rule   Edm     1967    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Edm     1967    only    -       Oct     lastSun 2:00    0       S
+Rule   Edm     1969    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Edm     1969    only    -       Oct     lastSun 2:00    0       S
+Rule   Edm     1972    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   Edm     1972    2006    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Edmonton  -7:33:52 -      LMT     1906 Sep
+                       -7:00   Edm     M%sT    1987
+                       -7:00   Canada  M%sT
+
+
+# British Columbia
+
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger write that since 1970 most of this region has
+# been like Vancouver.
+# Dawson Creek uses MST.  Much of east BC is like Edmonton.
+# Matthews and Vincent (1998) write that Creston is like Dawson Creek.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Vanc    1918    only    -       Apr     14      2:00    1:00    D
+Rule   Vanc    1918    only    -       Oct     31      2:00    0       S
+Rule   Vanc    1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   Vanc    1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   Vanc    1945    only    -       Sep     30      2:00    0       S
+Rule   Vanc    1946    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   Vanc    1946    only    -       Oct     13      2:00    0       S
+Rule   Vanc    1947    1961    -       Sep     lastSun 2:00    0       S
+Rule   Vanc    1962    2006    -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Vancouver -8:12:28 -      LMT     1884
+                       -8:00   Vanc    P%sT    1987
+                       -8:00   Canada  P%sT
+Zone America/Dawson_Creek -8:00:56 -   LMT     1884
+                       -8:00   Canada  P%sT    1947
+                       -8:00   Vanc    P%sT    1972 Aug 30 2:00
+                       -7:00   -       MST
+
+
+# Northwest Territories, Nunavut, Yukon
+
+# From Paul Eggert (2006-03-22):
+# Dawson switched to PST in 1973.  Inuvik switched to MST in 1979.
+# Mathew Englander (1996-10-07) gives the following refs:
+#      * 1967. Paragraph 28(34)(g) of the Interpretation Act, S.C. 1967-68,
+#      c. 7 defines Yukon standard time as UTC-9.  This is still valid;
+#      see Interpretation Act, R.S.C. 1985, c. I-21, s. 35(1).
+#      * C.O. 1973/214 switched Yukon to PST on 1973-10-28 00:00.
+#      * O.I.C. 1980/02 established DST.
+#      * O.I.C. 1987/056 changed DST to Apr firstSun 2:00 to Oct lastSun 2:00.
+# Shanks & Pottenger say Yukon's 1973-10-28 switch was at 2:00; go
+# with Englander.
+# From Chris Walton (2006-06-26):
+# Here is a link to the old daylight saving portion of the interpretation
+# act which was last updated in 1987:
+# http://www.gov.yk.ca/legislation/regs/oic1987_056.pdf
+
+# From Rives McDow (1999-09-04):
+# Nunavut ... moved ... to incorporate the whole territory into one time zone.
+# <a href="http://www.nunatsiaq.com/nunavut/nvt90903_13.html">
+# Nunavut moves to single time zone Oct. 31
+# </a>
+#
+# From Antoine Leca (1999-09-06):
+# We then need to create a new timezone for the Kitikmeot region of Nunavut
+# to differentiate it from the Yellowknife region.
+
+# From Paul Eggert (1999-09-20):
+# <a href="http://www.nunavut.com/basicfacts/english/basicfacts_1territory.html">
+# Basic Facts: The New Territory
+# </a> (1999) reports that Pangnirtung operates on eastern time,
+# and that Coral Harbour does not observe DST.  We don't know when
+# Pangnirtung switched to eastern time; we'll guess 1995.
+
+# From Rives McDow (1999-11-08):
+# On October 31, when the rest of Nunavut went to Central time,
+# Pangnirtung wobbled.  Here is the result of their wobble:
+#
+# The following businesses and organizations in Pangnirtung use Central Time:
+#
+#      First Air, Power Corp, Nunavut Construction, Health Center, RCMP,
+#      Eastern Arctic National Parks, A & D Specialist
+#
+# The following businesses and organizations in Pangnirtung use Eastern Time:
+#
+#      Hamlet office, All other businesses, Both schools, Airport operator
+#
+# This has made for an interesting situation there, which warranted the news.
+# No one there that I spoke with seems concerned, or has plans to
+# change the local methods of keeping time, as it evidently does not
+# really interfere with any activities or make things difficult locally.
+# They plan to celebrate New Year's turn-over twice, one hour apart,
+# so it appears that the situation will last at least that long.
+# The Nunavut Intergovernmental Affairs hopes that they will "come to
+# their senses", but the locals evidently don't see any problem with
+# the current state of affairs.
+
+# From Michaela Rodrigue, writing in the
+# <a href="http://www.nunatsiaq.com/archives/nunavut991130/nvt91119_17.html">
+# Nunatsiaq News (1999-11-19)</a>:
+# Clyde River, Pangnirtung and Sanikiluaq now operate with two time zones,
+# central - or Nunavut time - for government offices, and eastern time
+# for municipal offices and schools....  Igloolik [was similar but then]
+# made the switch to central time on Saturday, Nov. 6.
+
+# From Paul Eggert (2000-10-02):
+# Matthews and Vincent (1998) say the following, but we lack histories
+# for these potential new Zones.
+#
+# The Canadian Forces station at Alert uses Eastern Time while the
+# handful of residents at the Eureka weather station [in the Central
+# zone] skip daylight savings.  Baffin Island, which is crossed by the
+# Central, Eastern and Atlantic Time zones only uses Eastern Time.
+# Gjoa Haven, Taloyoak and Pelly Bay all use Mountain instead of
+# Central Time and Southampton Island [in the Central zone] is not
+# required to use daylight savings.
+
+# From
+# <a href="http://www.nunatsiaq.com/archives/nunavut001130/nvt21110_02.html">
+# Nunavut now has two time zones
+# </a> (2000-11-10):
+# The Nunavut government would allow its employees in Kugluktuk and
+# Cambridge Bay to operate on central time year-round, putting them
+# one hour behind the rest of Nunavut for six months during the winter.
+# At the end of October the two communities had rebelled against
+# Nunavut's unified time zone, refusing to shift to eastern time with
+# the rest of the territory for the winter.  Cambridge Bay remained on
+# central time, while Kugluktuk, even farther west, reverted to
+# mountain time, which they had used before the advent of Nunavut's
+# unified time zone in 1999.
+#
+# From Rives McDow (2001-01-20), quoting the Nunavut government:
+# The preceding decision came into effect at midnight, Saturday Nov 4, 2000.
+
+# From Paul Eggert (2000-12-04):
+# Let's just keep track of the official times for now.
+
+# From Rives McDow (2001-03-07):
+# The premier of Nunavut has issued a ministerial statement advising
+# that effective 2001-04-01, the territory of Nunavut will revert
+# back to three time zones (mountain, central, and eastern).  Of the
+# cities in Nunavut, Coral Harbor is the only one that I know of that
+# has said it will not observe dst, staying on EST year round.  I'm
+# checking for more info, and will get back to you if I come up with
+# more.
+# [Also see <http://www.nunatsiaq.com/nunavut/nvt10309_06.html> (2001-03-09).]
+
+# From Gwillim Law (2005-05-21):
+# According to maps at
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SWE.jpg
+# http://inms-ienm.nrc-cnrc.gc.ca/images/time_services/TZ01SSE.jpg
+# (both dated 2003), and
+# http://www.canadiangeographic.ca/Magazine/SO98/geomap.asp
+# (from a 1998 Canadian Geographic article), the de facto and de jure time
+# for Southampton Island (at the north end of Hudson Bay) is UTC-5 all year
+# round.  Using Google, it's easy to find other websites that confirm this.
+# I wasn't able to find how far back this time regimen goes, but since it
+# predates the creation of Nunavut, it probably goes back many years....
+# The Inuktitut name of Coral Harbour is Sallit, but it's rarely used.
+#
+# From Paul Eggert (2005-07-26):
+# For lack of better information, assume that Southampton Island observed
+# daylight saving only during wartime.
+
+# From Chris Walton (2007-03-01):
+# ... the community of Resolute (located on Cornwallis Island in
+# Nunavut) moved from Central Time to Eastern Time last November.
+# Basically the community did not change its clocks at the end of
+# daylight saving....
+# http://www.nnsl.com/frames/newspapers/2006-11/nov13_06none.html
+
+# From Chris Walton (2007-03-14):
+# Today I phoned the "hamlet office" to find out what Resolute was doing with
+# its clocks.
+#
+# The individual that answered the phone confirmed that the clocks did not
+# move at the end of daylight saving on October 29/2006.  He also told me that
+# the clocks did not move this past weekend (March 11/2007)....
+#
+# America/Resolute should use the "Canada" Rule up to October 29/2006.
+# After that it should be fixed on Eastern Standard Time until further notice.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   NT_YK   1918    only    -       Apr     14      2:00    1:00    D
+Rule   NT_YK   1918    only    -       Oct     27      2:00    0       S
+Rule   NT_YK   1919    only    -       May     25      2:00    1:00    D
+Rule   NT_YK   1919    only    -       Nov      1      0:00    0       S
+Rule   NT_YK   1942    only    -       Feb      9      2:00    1:00    W # War
+Rule   NT_YK   1945    only    -       Aug     14      23:00u  1:00    P # Peace
+Rule   NT_YK   1945    only    -       Sep     30      2:00    0       S
+Rule   NT_YK   1965    only    -       Apr     lastSun 0:00    2:00    DD
+Rule   NT_YK   1965    only    -       Oct     lastSun 2:00    0       S
+Rule   NT_YK   1980    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   NT_YK   1980    2006    -       Oct     lastSun 2:00    0       S
+Rule   NT_YK   1987    2006    -       Apr     Sun>=1  2:00    1:00    D
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# aka Panniqtuuq
+Zone America/Pangnirtung 0     -       zzz     1921 # trading post est.
+                       -4:00   NT_YK   A%sT    1995 Apr Sun>=1 2:00
+                       -5:00   Canada  E%sT    1999 Oct 31 2:00
+                       -6:00   Canada  C%sT    2000 Oct 29 2:00
+                       -5:00   Canada  E%sT
+# formerly Frobisher Bay
+Zone America/Iqaluit   0       -       zzz     1942 Aug # Frobisher Bay est.
+                       -5:00   NT_YK   E%sT    1999 Oct 31 2:00
+                       -6:00   Canada  C%sT    2000 Oct 29 2:00
+                       -5:00   Canada  E%sT
+# aka Qausuittuq
+Zone America/Resolute  0       -       zzz     1947 Aug 31 # Resolute founded
+                       -6:00   NT_YK   C%sT    2000 Oct 29 2:00
+                       -5:00   -       EST     2001 Apr  1 3:00
+                       -6:00   Canada  C%sT    2006 Oct 29 2:00
+                       -5:00   -       EST
+# aka Kangiqiniq
+Zone America/Rankin_Inlet 0    -       zzz     1957 # Rankin Inlet founded
+                       -6:00   NT_YK   C%sT    2000 Oct 29 2:00
+                       -5:00   -       EST     2001 Apr  1 3:00
+                       -6:00   Canada  C%sT
+# aka Iqaluktuuttiaq
+Zone America/Cambridge_Bay 0   -       zzz     1920 # trading post est.?
+                       -7:00   NT_YK   M%sT    1999 Oct 31 2:00
+                       -6:00   Canada  C%sT    2000 Oct 29 2:00
+                       -5:00   -       EST     2000 Nov  5 0:00
+                       -6:00   -       CST     2001 Apr  1 3:00
+                       -7:00   Canada  M%sT
+Zone America/Yellowknife 0     -       zzz     1935 # Yellowknife founded?
+                       -7:00   NT_YK   M%sT    1980
+                       -7:00   Canada  M%sT
+Zone America/Inuvik    0       -       zzz     1953 # Inuvik founded
+                       -8:00   NT_YK   P%sT    1979 Apr lastSun 2:00
+                       -7:00   NT_YK   M%sT    1980
+                       -7:00   Canada  M%sT
+Zone America/Whitehorse        -9:00:12 -      LMT     1900 Aug 20
+                       -9:00   NT_YK   Y%sT    1966 Jul 1 2:00
+                       -8:00   NT_YK   P%sT    1980
+                       -8:00   Canada  P%sT
+Zone America/Dawson    -9:17:40 -      LMT     1900 Aug 20
+                       -9:00   NT_YK   Y%sT    1973 Oct 28 0:00
+                       -8:00   NT_YK   P%sT    1980
+                       -8:00   Canada  P%sT
+
+
+###############################################################################
+
+# Mexico
+
+# From Paul Eggert (2001-03-05):
+# The Investigation and Analysis Service of the
+# Mexican Library of Congress (MLoC) has published a
+# <a href="http://www.cddhcu.gob.mx/bibliot/publica/inveyana/polisoc/horver/">
+# history of Mexican local time (in Spanish)
+# </a>.
+#
+# Here are the discrepancies between Shanks & Pottenger (S&P) and the MLoC.
+# (In all cases we go with the MLoC.)
+# S&P report that Baja was at -8:00 in 1922/1923.
+# S&P say the 1930 transition in Baja was 1930-11-16.
+# S&P report no DST during summer 1931.
+# S&P report a transition at 1932-03-30 23:00, not 1932-04-01.
+
+# From Gwillim Law (2001-02-20):
+# There are some other discrepancies between the Decrees page and the
+# tz database.  I think they can best be explained by supposing that
+# the researchers who prepared the Decrees page failed to find some of
+# the relevant documents.
+
+# From Alan Perry (1996-02-15):
+# A guy from our Mexico subsidiary finally found the Presidential Decree
+# outlining the timezone changes in Mexico.
+#
+# ------------- Begin Forwarded Message -------------
+#
+# I finally got my hands on the Official Presidential Decree that sets up the
+# rules for the DST changes. The rules are:
+#
+# 1. The country is divided in 3 timezones:
+#    - Baja California Norte (the Mexico/BajaNorte TZ)
+#    - Baja California Sur, Nayarit, Sinaloa and Sonora (the Mexico/BajaSur TZ)
+#    - The rest of the country (the Mexico/General TZ)
+#
+# 2. From the first Sunday in April at 2:00 AM to the last Sunday in October
+#    at 2:00 AM, the times in each zone are as follows:
+#    BajaNorte: GMT+7
+#    BajaSur:   GMT+6
+#    General:   GMT+5
+#
+# 3. The rest of the year, the times are as follows:
+#    BajaNorte: GMT+8
+#    BajaSur:   GMT+7
+#    General:   GMT+6
+#
+# The Decree was published in Mexico's Official Newspaper on January 4th.
+#
+# -------------- End Forwarded Message --------------
+# From Paul Eggert (1996-06-12):
+# For an English translation of the decree, see
+# <a href="http://mexico-travel.com/extra/timezone_eng.html">
+# ``Diario Oficial: Time Zone Changeover'' (1996-01-04).
+# </a>
+
+# From Rives McDow (1998-10-08):
+# The State of Quintana Roo has reverted back to central STD and DST times
+# (i.e. UTC -0600 and -0500 as of 1998-08-02).
+
+# From Rives McDow (2000-01-10):
+# Effective April 4, 1999 at 2:00 AM local time, Sonora changed to the time
+# zone 5 hours from the International Date Line, and will not observe daylight
+# savings time so as to stay on the same time zone as the southern part of
+# Arizona year round.
+
+# From Jesper Norgaard, translating
+# <http://www.reforma.com/nacional/articulo/064327/> (2001-01-17):
+# In Oaxaca, the 55.000 teachers from the Section 22 of the National
+# Syndicate of Education Workers, refuse to apply daylight saving each
+# year, so that the more than 10,000 schools work at normal hour the
+# whole year.
+
+# From Gwillim Law (2001-01-19):
+# <http://www.reforma.com/negocios_y_dinero/articulo/064481/> ... says
+# (translated):...
+# January 17, 2000 - The Energy Secretary, Ernesto Martens, announced
+# that Summer Time will be reduced from seven to five months, starting
+# this year....
+# <http://www.publico.com.mx/scripts/texto3.asp?action=pagina&pag=21&pos=p&secc=naci&date=01/17/2001>
+# [translated], says "summer time will ... take effect on the first Sunday
+# in May, and end on the last Sunday of September.
+
+# From Arthur David Olson (2001-01-25):
+# The 2001-01-24 traditional Washington Post contained the page one
+# story "Timely Issue Divides Mexicans."...
+# http://www.washingtonpost.com/wp-dyn/articles/A37383-2001Jan23.html
+# ... Mexico City Mayor Lopez Obrador "...is threatening to keep
+# Mexico City and its 20 million residents on a different time than
+# the rest of the country..." In particular, Lopez Obrador would abolish
+# observation of Daylight Saving Time.
+
+# <a href="http://www.conae.gob.mx/ahorro/decretohorver2001.html#decre">
+# Official statute published by the Energy Department
+# </a> (2001-02-01) shows Baja and Chihauhua as still using US DST rules,
+# and Sonora with no DST.  This was reported by Jesper Norgaard (2001-02-03).
+
+# From Paul Eggert (2001-03-03):
+#
+# <a href="http://www.latimes.com/news/nation/20010303/t000018766.html">
+# James F. Smith writes in today's LA Times
+# </a>
+# * Sonora will continue to observe standard time.
+# * Last week Mexico City's mayor Andres Manuel Lopez Obrador decreed that
+#   the Federal District will not adopt DST.
+# * 4 of 16 district leaders announced they'll ignore the decree.
+# * The decree does not affect federal-controlled facilities including
+#   the airport, banks, hospitals, and schools.
+#
+# For now we'll assume that the Federal District will bow to federal rules.
+
+# From Jesper Norgaard (2001-04-01):
+# I found some references to the Mexican application of daylight
+# saving, which modifies what I had already sent you, stating earlier
+# that a number of northern Mexican states would go on daylight
+# saving. The modification reverts this to only cover Baja California
+# (Norte), while all other states (except Sonora, who has no daylight
+# saving all year) will follow the original decree of president
+# Vicente Fox, starting daylight saving May 6, 2001 and ending
+# September 30, 2001.
+# References: "Diario de Monterrey" <www.diariodemonterrey.com/index.asp>
+# Palabra <http://palabra.infosel.com/010331/primera/ppri3101.pdf> (2001-03-31)
+
+# From Reuters (2001-09-04):
+# Mexico's Supreme Court on Tuesday declared that daylight savings was
+# unconstitutional in Mexico City, creating the possibility the
+# capital will be in a different time zone from the rest of the nation
+# next year....  The Supreme Court's ruling takes effect at 2:00
+# a.m. (0800 GMT) on Sept. 30, when Mexico is scheduled to revert to
+# standard time. "This is so residents of the Federal District are not
+# subject to unexpected time changes," a statement from the court said.
+
+# From Jesper Norgaard Welen (2002-03-12):
+# ... consulting my local grocery store(!) and my coworkers, they all insisted
+# that a new decision had been made to reinstate US style DST in Mexico....
+# http://www.conae.gob.mx/ahorro/horaver2001_m1_2002.html (2002-02-20)
+# confirms this.  Sonora as usual is the only state where DST is not applied.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Mexico  1939    only    -       Feb     5       0:00    1:00    D
+Rule   Mexico  1939    only    -       Jun     25      0:00    0       S
+Rule   Mexico  1940    only    -       Dec     9       0:00    1:00    D
+Rule   Mexico  1941    only    -       Apr     1       0:00    0       S
+Rule   Mexico  1943    only    -       Dec     16      0:00    1:00    W # War
+Rule   Mexico  1944    only    -       May     1       0:00    0       S
+Rule   Mexico  1950    only    -       Feb     12      0:00    1:00    D
+Rule   Mexico  1950    only    -       Jul     30      0:00    0       S
+Rule   Mexico  1996    2000    -       Apr     Sun>=1  2:00    1:00    D
+Rule   Mexico  1996    2000    -       Oct     lastSun 2:00    0       S
+Rule   Mexico  2001    only    -       May     Sun>=1  2:00    1:00    D
+Rule   Mexico  2001    only    -       Sep     lastSun 2:00    0       S
+Rule   Mexico  2002    max     -       Apr     Sun>=1  2:00    1:00    D
+Rule   Mexico  2002    max     -       Oct     lastSun 2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+# Quintana Roo
+Zone America/Cancun    -5:47:04 -      LMT     1922 Jan  1  0:12:56
+                       -6:00   -       CST     1981 Dec 23
+                       -5:00   Mexico  E%sT    1998 Aug  2  2:00
+                       -6:00   Mexico  C%sT
+# Campeche, Yucatan
+Zone America/Merida    -5:58:28 -      LMT     1922 Jan  1  0:01:32
+                       -6:00   -       CST     1981 Dec 23
+                       -5:00   -       EST     1982 Dec  2
+                       -6:00   Mexico  C%sT
+# Coahuila, Durango, Nuevo Leon, Tamaulipas
+Zone America/Monterrey -6:41:16 -      LMT     1921 Dec 31 23:18:44
+                       -6:00   -       CST     1988
+                       -6:00   US      C%sT    1989
+                       -6:00   Mexico  C%sT
+# Central Mexico
+Zone America/Mexico_City -6:36:36 -    LMT     1922 Jan  1  0:23:24
+                       -7:00   -       MST     1927 Jun 10 23:00
+                       -6:00   -       CST     1930 Nov 15
+                       -7:00   -       MST     1931 May  1 23:00
+                       -6:00   -       CST     1931 Oct
+                       -7:00   -       MST     1932 Apr  1
+                       -6:00   Mexico  C%sT    2001 Sep 30 02:00
+                       -6:00   -       CST     2002 Feb 20
+                       -6:00   Mexico  C%sT
+# Chihuahua
+Zone America/Chihuahua -7:04:20 -      LMT     1921 Dec 31 23:55:40
+                       -7:00   -       MST     1927 Jun 10 23:00
+                       -6:00   -       CST     1930 Nov 15
+                       -7:00   -       MST     1931 May  1 23:00
+                       -6:00   -       CST     1931 Oct
+                       -7:00   -       MST     1932 Apr  1
+                       -6:00   -       CST     1996
+                       -6:00   Mexico  C%sT    1998
+                       -6:00   -       CST     1998 Apr Sun>=1 3:00
+                       -7:00   Mexico  M%sT
+# Sonora
+Zone America/Hermosillo        -7:23:52 -      LMT     1921 Dec 31 23:36:08
+                       -7:00   -       MST     1927 Jun 10 23:00
+                       -6:00   -       CST     1930 Nov 15
+                       -7:00   -       MST     1931 May  1 23:00
+                       -6:00   -       CST     1931 Oct
+                       -7:00   -       MST     1932 Apr  1
+                       -6:00   -       CST     1942 Apr 24
+                       -7:00   -       MST     1949 Jan 14
+                       -8:00   -       PST     1970
+                       -7:00   Mexico  M%sT    1999
+                       -7:00   -       MST
+# Baja California Sur, Nayarit, Sinaloa
+Zone America/Mazatlan  -7:05:40 -      LMT     1921 Dec 31 23:54:20
+                       -7:00   -       MST     1927 Jun 10 23:00
+                       -6:00   -       CST     1930 Nov 15
+                       -7:00   -       MST     1931 May  1 23:00
+                       -6:00   -       CST     1931 Oct
+                       -7:00   -       MST     1932 Apr  1
+                       -6:00   -       CST     1942 Apr 24
+                       -7:00   -       MST     1949 Jan 14
+                       -8:00   -       PST     1970
+                       -7:00   Mexico  M%sT
+# Baja California
+Zone America/Tijuana   -7:48:04 -      LMT     1922 Jan  1  0:11:56
+                       -7:00   -       MST     1924
+                       -8:00   -       PST     1927 Jun 10 23:00
+                       -7:00   -       MST     1930 Nov 15
+                       -8:00   -       PST     1931 Apr  1
+                       -8:00   1:00    PDT     1931 Sep 30
+                       -8:00   -       PST     1942 Apr 24
+                       -8:00   1:00    PWT     1945 Aug 14 23:00u
+                       -8:00   1:00    PPT     1945 Nov 12 # Peace
+                       -8:00   -       PST     1948 Apr  5
+                       -8:00   1:00    PDT     1949 Jan 14
+                       -8:00   -       PST     1954
+                       -8:00   CA      P%sT    1961
+                       -8:00   -       PST     1976
+                       -8:00   US      P%sT    1996
+                       -8:00   Mexico  P%sT    2001
+                       -8:00   US      P%sT    2002 Feb 20
+                       -8:00   Mexico  P%sT
+# From Paul Eggert (2006-03-22):
+# Formerly there was an America/Ensenada zone, which differed from
+# America/Tijuana only in that it did not observe DST from 1976
+# through 1995.  This was as per Shanks (1999).  But Shanks & Pottenger say
+# Ensenada did not observe DST from 1948 through 1975.  Guy Harris reports
+# that the 1987 OAG says "Only Ensenada, Mexicale, San Felipe and
+# Tijuana observe DST," which agrees with Shanks & Pottenger but implies that
+# DST-observance was a town-by-town matter back then.  This concerns
+# data after 1970 so most likely there should be at least one Zone
+# other than America/Tijuana for Baja, but it's not clear yet what its
+# name or contents should be.
+#
+# Revillagigedo Is
+# no information
+
+###############################################################################
+
+# Anguilla
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Anguilla  -4:12:16 -      LMT     1912 Mar 2
+                       -4:00   -       AST
+
+# Antigua and Barbuda
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Antigua -4:07:12 -      LMT     1912 Mar 2
+                       -5:00   -       EST     1951
+                       -4:00   -       AST
+
+# Bahamas
+#
+# From Sue Williams (2006-12-07):
+# The Bahamas announced about a month ago that they plan to change their DST
+# rules to sync with the U.S. starting in 2007....
+# http://www.jonesbahamas.com/?c=45&a=10412
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Bahamas 1964    2006    -       Oct     lastSun 2:00    0       S
+Rule   Bahamas 1964    1986    -       Apr     lastSun 2:00    1:00    D
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Nassau  -5:09:24 -      LMT     1912 Mar 2
+                       -5:00   Bahamas E%sT    1976
+                       -5:00   US      E%sT
+
+# Barbados
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Barb    1977    only    -       Jun     12      2:00    1:00    D
+Rule   Barb    1977    1978    -       Oct     Sun>=1  2:00    0       S
+Rule   Barb    1978    1980    -       Apr     Sun>=15 2:00    1:00    D
+Rule   Barb    1979    only    -       Sep     30      2:00    0       S
+Rule   Barb    1980    only    -       Sep     25      2:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Barbados  -3:58:28 -      LMT     1924            # Bridgetown
+                       -3:58:28 -      BMT     1932      # Bridgetown Mean Time
+                       -4:00   Barb    A%sT
+
+# Belize
+# Whitman entirely disagrees with Shanks; go with Shanks & Pottenger.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Belize  1918    1942    -       Oct     Sun>=2  0:00    0:30    HD
+Rule   Belize  1919    1943    -       Feb     Sun>=9  0:00    0       S
+Rule   Belize  1973    only    -       Dec      5      0:00    1:00    D
+Rule   Belize  1974    only    -       Feb      9      0:00    0       S
+Rule   Belize  1982    only    -       Dec     18      0:00    1:00    D
+Rule   Belize  1983    only    -       Feb     12      0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Belize  -5:52:48 -      LMT     1912 Apr
+                       -6:00   Belize  C%sT
+
+# Bermuda
+
+# From Dan Jones, reporting in The Royal Gazette (2006-06-26):
+
+# Next year, however, clocks in the US will go forward on the second Sunday
+# in March, until the first Sunday in November.  And, after the Time Zone
+# (Seasonal Variation) Bill 2006 was passed in the House of Assembly on
+# Friday, the same thing will happen in Bermuda.
+# http://www.theroyalgazette.com/apps/pbcs.dll/article?AID=/20060529/NEWS/105290135
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/Bermuda  -4:19:04 -      LMT     1930 Jan  1 2:00    # Hamilton
+                       -4:00   -       AST     1974 Apr 28 2:00
+                       -4:00   Bahamas A%sT    1976
+                       -4:00   US      A%sT
+
+# Cayman Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Cayman  -5:25:32 -      LMT     1890            # Georgetown
+                       -5:07:12 -      KMT     1912 Feb    # Kingston Mean Time
+                       -5:00   -       EST
+
+# Costa Rica
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   CR      1979    1980    -       Feb     lastSun 0:00    1:00    D
+Rule   CR      1979    1980    -       Jun     Sun>=1  0:00    0       S
+Rule   CR      1991    1992    -       Jan     Sat>=15 0:00    1:00    D
+# IATA SSIM (1991-09) says the following was at 1:00;
+# go with Shanks & Pottenger.
+Rule   CR      1991    only    -       Jul      1      0:00    0       S
+Rule   CR      1992    only    -       Mar     15      0:00    0       S
+# There are too many San Joses elsewhere, so we'll use `Costa Rica'.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Costa_Rica        -5:36:20 -      LMT     1890            # San Jose
+                       -5:36:20 -      SJMT    1921 Jan 15 # San Jose Mean Time
+                       -6:00   CR      C%sT
+# Coco
+# no information; probably like America/Costa_Rica
+
+# Cuba
+
+# From Arthur David Olson (1999-03-29):
+# The 1999-03-28 exhibition baseball game held in Havana, Cuba, between
+# the Cuban National Team and the Baltimore Orioles was carried live on
+# the Orioles Radio Network, including affiliate WTOP in Washington, DC.
+# During the game, play-by-play announcer Jim Hunter noted that
+# "We'll be losing two hours of sleep...Cuba switched to Daylight Saving
+# Time today."  (The "two hour" remark referred to losing one hour of
+# sleep on 1999-03-28--when the announcers were in Cuba as it switched
+# to DST--and one more hour on 1999-04-04--when the announcers will have
+# returned to Baltimore, which switches on that date.)
+
+# From Evert van der Veer via Steffen Thorsen (2004-10-28):
+# Cuba is not going back to standard time this year.
+# From Paul Eggert (2006-03-22):
+# http://www.granma.cu/ingles/2004/septiembre/juev30/41medid-i.html
+# says that it's due to a problem at the Antonio Guiteras
+# thermoelectric plant, and says "This October there will be no return
+# to normal hours (after daylight saving time)".
+# For now, let's assume that it's a temporary measure.
+
+# From Carlos A. Carnero Delgado (2005-11-12):
+# This year (just like in 2004-2005) there's no change in time zone
+# adjustment in Cuba.  We will stay in daylight saving time:
+# http://www.granma.cu/espanol/2005/noviembre/mier9/horario.html
+
+# From Jesper Norgaard Welen (2006-10-21):
+# An article in GRANMA INTERNACIONAL claims that Cuba will end
+# the 3 years of permanent DST next weekend, see
+# http://www.granma.cu/ingles/2006/octubre/lun16/43horario.html
+# "On Saturday night, October 28 going into Sunday, October 29, at 01:00,
+# watches should be set back one hour -- going back to 00:00 hours -- returning
+# to the normal schedule....
+
+# From Paul Eggert (2007-03-02):
+# http://www.granma.cubaweb.cu/english/news/art89.html, dated yesterday,
+# says Cuban clocks will advance at midnight on March 10.
+# For lack of better information, assume Cuba will use US rules,
+# except that it switches at midnight standard time as usual.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Cuba    1928    only    -       Jun     10      0:00    1:00    D
+Rule   Cuba    1928    only    -       Oct     10      0:00    0       S
+Rule   Cuba    1940    1942    -       Jun     Sun>=1  0:00    1:00    D
+Rule   Cuba    1940    1942    -       Sep     Sun>=1  0:00    0       S
+Rule   Cuba    1945    1946    -       Jun     Sun>=1  0:00    1:00    D
+Rule   Cuba    1945    1946    -       Sep     Sun>=1  0:00    0       S
+Rule   Cuba    1965    only    -       Jun     1       0:00    1:00    D
+Rule   Cuba    1965    only    -       Sep     30      0:00    0       S
+Rule   Cuba    1966    only    -       May     29      0:00    1:00    D
+Rule   Cuba    1966    only    -       Oct     2       0:00    0       S
+Rule   Cuba    1967    only    -       Apr     8       0:00    1:00    D
+Rule   Cuba    1967    1968    -       Sep     Sun>=8  0:00    0       S
+Rule   Cuba    1968    only    -       Apr     14      0:00    1:00    D
+Rule   Cuba    1969    1977    -       Apr     lastSun 0:00    1:00    D
+Rule   Cuba    1969    1971    -       Oct     lastSun 0:00    0       S
+Rule   Cuba    1972    1974    -       Oct     8       0:00    0       S
+Rule   Cuba    1975    1977    -       Oct     lastSun 0:00    0       S
+Rule   Cuba    1978    only    -       May     7       0:00    1:00    D
+Rule   Cuba    1978    1990    -       Oct     Sun>=8  0:00    0       S
+Rule   Cuba    1979    1980    -       Mar     Sun>=15 0:00    1:00    D
+Rule   Cuba    1981    1985    -       May     Sun>=5  0:00    1:00    D
+Rule   Cuba    1986    1989    -       Mar     Sun>=14 0:00    1:00    D
+Rule   Cuba    1990    1997    -       Apr     Sun>=1  0:00    1:00    D
+Rule   Cuba    1991    1995    -       Oct     Sun>=8  0:00s   0       S
+Rule   Cuba    1996    only    -       Oct      6      0:00s   0       S
+Rule   Cuba    1997    only    -       Oct     12      0:00s   0       S
+Rule   Cuba    1998    1999    -       Mar     lastSun 0:00s   1:00    D
+Rule   Cuba    1998    2003    -       Oct     lastSun 0:00s   0       S
+Rule   Cuba    2000    2006    -       Apr     Sun>=1  0:00s   1:00    D
+Rule   Cuba    2006    only    -       Oct     lastSun 0:00s   0       S
+Rule   Cuba    2007    max     -       Mar     Sun>=8  0:00s   1:00    D
+Rule   Cuba    2007    max     -       Nov     Sun>=1  0:00s   0       S
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Havana  -5:29:28 -      LMT     1890
+                       -5:29:36 -      HMT     1925 Jul 19 12:00 # Havana MT
+                       -5:00   Cuba    C%sT
+
+# Dominica
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Dominica  -4:05:36 -      LMT     1911 Jul 1 0:01         # Roseau
+                       -4:00   -       AST
+
+# Dominican Republic
+
+# From Steffen Thorsen (2000-10-30):
+# Enrique Morales reported to me that the Dominican Republic has changed the
+# time zone to Eastern Standard Time as of Sunday 29 at 2 am....
+# http://www.listin.com.do/antes/261000/republica/princi.html
+
+# From Paul Eggert (2000-12-04):
+# That URL (2000-10-26, in Spanish) says they planned to use US-style DST.
+
+# From Rives McDow (2000-12-01):
+# Dominican Republic changed its mind and presidential decree on Tuesday,
+# November 28, 2000, with a new decree.  On Sunday, December 3 at 1:00 AM the
+# Dominican Republic will be reverting to 8 hours from the International Date
+# Line, and will not be using DST in the foreseeable future.  The reason they
+# decided to use DST was to be in synch with Puerto Rico, who was also going
+# to implement DST.  When Puerto Rico didn't implement DST, the president
+# decided to revert.
+
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   DR      1966    only    -       Oct     30      0:00    1:00    D
+Rule   DR      1967    only    -       Feb     28      0:00    0       S
+Rule   DR      1969    1973    -       Oct     lastSun 0:00    0:30    HD
+Rule   DR      1970    only    -       Feb     21      0:00    0       S
+Rule   DR      1971    only    -       Jan     20      0:00    0       S
+Rule   DR      1972    1974    -       Jan     21      0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Santo_Domingo -4:39:36 -  LMT     1890
+                       -4:40   -       SDMT    1933 Apr  1 12:00 # S. Dom. MT
+                       -5:00   DR      E%sT    1974 Oct 27
+                       -4:00   -       AST     2000 Oct 29 02:00
+                       -5:00   US      E%sT    2000 Dec  3 01:00
+                       -4:00   -       AST
+
+# El Salvador
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Salv    1987    1988    -       May     Sun>=1  0:00    1:00    D
+Rule   Salv    1987    1988    -       Sep     lastSun 0:00    0       S
+# There are too many San Salvadors elsewhere, so use America/El_Salvador
+# instead of America/San_Salvador.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/El_Salvador -5:56:48 -    LMT     1921            # San Salvador
+                       -6:00   Salv    C%sT
+
+# Grenada
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Grenada -4:07:00 -      LMT     1911 Jul        # St George's
+                       -4:00   -       AST
+
+# Guadeloupe
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Guadeloupe        -4:06:08 -      LMT     1911 Jun 8      # Pointe a Pitre
+                       -4:00   -       AST
+
+# Guatemala
+#
+# From Gwillim Law (2006-04-22), after a heads-up from Oscar van Vlijmen:
+# Diario Co Latino, at
+# http://www.diariocolatino.com/internacionales/detalles.asp?NewsID=8079,
+# says in an article dated 2006-04-19 that the Guatemalan government had
+# decided on that date to advance official time by 60 minutes, to lessen the
+# impact of the elevated cost of oil....  Daylight saving time will last from
+# 2006-04-29 24:00 (Guatemalan standard time) to 2006-09-30 (time unspecified).
+# From Paul Eggert (2006-06-22):
+# The Ministry of Energy and Mines, press release CP-15/2006
+# (2006-04-19), says DST ends at 24:00.  See
+# <http://www.sieca.org.gt/Sitio_publico/Energeticos/Doc/Medidas/Cambio_Horario_Nac_190406.pdf>.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Guat    1973    only    -       Nov     25      0:00    1:00    D
+Rule   Guat    1974    only    -       Feb     24      0:00    0       S
+Rule   Guat    1983    only    -       May     21      0:00    1:00    D
+Rule   Guat    1983    only    -       Sep     22      0:00    0       S
+Rule   Guat    1991    only    -       Mar     23      0:00    1:00    D
+Rule   Guat    1991    only    -       Sep      7      0:00    0       S
+Rule   Guat    2006    only    -       Apr     30      0:00    1:00    D
+Rule   Guat    2006    only    -       Oct      1      0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Guatemala -6:02:04 -      LMT     1918 Oct 5
+                       -6:00   Guat    C%sT
+
+# Haiti
+# From Gwillim Law (2005-04-15):
+# Risto O. Nykanen wrote me that Haiti is now on DST.
+# I searched for confirmation, and I found a
+# <a href="http://www.haitianconsulate.org/time.doc"> press release
+# on the Web page of the Haitian Consulate in Chicago (2005-03-31),
+# </a>.  Translated from French, it says:
+#
+#  "The Prime Minister's Communication Office notifies the public in general
+#   and the press in particular that, following a decision of the Interior
+#   Ministry and the Territorial Collectivities [I suppose that means the
+#   provinces], Haiti will move to Eastern Daylight Time in the night from next
+#   Saturday the 2nd to Sunday the 3rd.
+#
+#  "Consequently, the Prime Minister's Communication Office wishes to inform
+#   the population that the country's clocks will be set forward one hour
+#   starting at midnight.  This provision will hold until the last Saturday in
+#   October 2005.
+#
+#  "Port-au-Prince, March 31, 2005"
+#
+# From Steffen Thorsen (2006-04-04):
+# I have been informed by users that Haiti observes DST this year like
+# last year, so the current "only" rule for 2005 might be changed to a
+# "max" rule or to last until 2006. (Who knows if they will observe DST
+# next year or if they will extend their DST like US/Canada next year).
+#
+# I have found this article about it (in French):
+# http://www.haitipressnetwork.com/news.cfm?articleID=7612
+#
+# The reason seems to be an energy crisis.
+
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Haiti   1983    only    -       May     8       0:00    1:00    D
+Rule   Haiti   1984    1987    -       Apr     lastSun 0:00    1:00    D
+Rule   Haiti   1983    1987    -       Oct     lastSun 0:00    0       S
+# Shanks & Pottenger say AT is 2:00, but IATA SSIM (1991/1997) says 1:00s.
+# Go with IATA.
+Rule   Haiti   1988    1997    -       Apr     Sun>=1  1:00s   1:00    D
+Rule   Haiti   1988    1997    -       Oct     lastSun 1:00s   0       S
+Rule   Haiti   2005    max     -       Apr     Sun>=1  0:00    1:00    D
+Rule   Haiti   2005    max     -       Oct     lastSun 0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Port-au-Prince -4:49:20 - LMT     1890
+                       -4:49   -       PPMT    1917 Jan 24 12:00 # P-a-P MT
+                       -5:00   Haiti   E%sT
+
+# Honduras
+# Shanks & Pottenger say 1921 Jan 1; go with Whitman's more precise Apr 1.
+
+# From Paul Eggert (2006-05-05):
+# worldtimezone.com reports a 2006-05-02 Spanish-language AP article
+# saying Honduras will start using DST midnight Saturday, effective 4
+# months until September.  La Tribuna reported today
+# <http://www.latribuna.hn/99299.html> that Manuel Zelaya, the president
+# of Honduras, refused to back down on this.
+
+# From Jesper Norgaard Welen (2006-08-08):
+# It seems that Honduras has returned from DST to standard time this Monday at
+# 00:00 hours (prolonging Sunday to 25 hours duration).
+# http://www.worldtimezone.com/dst_news/dst_news_honduras04.html
+
+# From Paul Eggert (2006-08-08):
+# Also see Diario El Heraldo, The country returns to standard time (2006-08-08)
+# <http://www.elheraldo.hn/nota.php?nid=54941&sec=12>.
+# It mentions executive decree 18-2006.
+
+# From Steffen Thorsen (2006-08-17):
+# Honduras will observe DST from 2007 to 2009, exact dates are not
+# published, I have located this authoritative source:
+# http://www.presidencia.gob.hn/noticia.aspx?nId=47
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Hond    1987    1988    -       May     Sun>=1  0:00    1:00    D
+Rule   Hond    1987    1988    -       Sep     lastSun 0:00    0       S
+Rule   Hond    2006    2009    -       May     Sun>=1  0:00    1:00    D
+Rule   Hond    2006    2009    -       Aug     Mon>=1  0:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Tegucigalpa -5:48:52 -    LMT     1921 Apr
+                       -6:00   Hond    C%sT
+#
+# Great Swan I ceded by US to Honduras in 1972
+
+# Jamaica
+
+# From Bob Devine (1988-01-28):
+# Follows US rules.
+
+# From U. S. Naval Observatory (1989-01-19):
+# JAMAICA             5 H  BEHIND UTC
+
+# From Shanks & Pottenger:
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Jamaica -5:07:12 -      LMT     1890            # Kingston
+                       -5:07:12 -      KMT     1912 Feb    # Kingston Mean Time
+                       -5:00   -       EST     1974 Apr 28 2:00
+                       -5:00   US      E%sT    1984
+                       -5:00   -       EST
+
+# Martinique
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Martinique        -4:04:20 -      LMT     1890            # Fort-de-France
+                       -4:04:20 -      FFMT    1911 May     # Fort-de-France MT
+                       -4:00   -       AST     1980 Apr  6
+                       -4:00   1:00    ADT     1980 Sep 28
+                       -4:00   -       AST
+
+# Montserrat
+# From Paul Eggert (2006-03-22):
+# In 1995 volcanic eruptions forced evacuation of Plymouth, the capital.
+# world.gazetteer.com says Cork Hill is the most populous location now.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Montserrat        -4:08:52 -      LMT     1911 Jul 1 0:01   # Cork Hill
+                       -4:00   -       AST
+
+# Nicaragua
+#
+# This uses Shanks & Pottenger for times before 2005.
+#
+# From Steffen Thorsen (2005-04-12):
+# I've got reports from 8 different people that Nicaragua just started
+# DST on Sunday 2005-04-10, in order to save energy because of
+# expensive petroleum.  The exact end date for DST is not yet
+# announced, only "September" but some sites also say "mid-September".
+# Some background information is available on the President's official site:
+# http://www.presidencia.gob.ni/Presidencia/Files_index/Secretaria/Notas%20de%20Prensa/Presidente/2005/ABRIL/Gobierno-de-nicaragua-adelanta-hora-oficial-06abril.htm
+# The Decree, no 23-2005 is available here:
+# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2005/Decreto%2023-2005%20Se%20adelanta%20en%20una%20hora%20en%20todo%20el%20territorio%20nacional%20apartir%20de%20las%2024horas%20del%2009%20de%20Abril.pdf
+#
+# From Paul Eggert (2005-05-01):
+# The decree doesn't say anything about daylight saving, but for now let's
+# assume that it is daylight saving....
+#
+# From Gwillim Law (2005-04-21):
+# The Associated Press story on the time change, which can be found at
+# http://www.lapalmainteractivo.com/guias/content/gen/ap/America_Latina/AMC_GEN_NICARAGUA_HORA.html
+# and elsewhere, says (fifth paragraph, translated from Spanish):  "The last
+# time that a change of clocks was applied to save energy was in the year 2000
+# during the Arnoldo Aleman administration."...
+# The northamerica file says that Nicaragua has been on UTC-6 continuously
+# since December 1998.  I wasn't able to find any details of Nicaraguan time
+# changes in 2000.  Perhaps a note could be added to the northamerica file, to
+# the effect that we have indirect evidence that DST was observed in 2000.
+#
+# From Jesper Norgaard Welen (2005-11-02):
+# Nicaragua left DST the 2005-10-02 at 00:00 (local time).
+# http://www.presidencia.gob.ni/presidencia/files_index/secretaria/comunicados/2005/septiembre/26septiembre-cambio-hora.htm
+# (2005-09-26)
+#
+# From Jesper Norgaard Welen (2006-05-05):
+# http://www.elnuevodiario.com.ni/2006/05/01/nacionales/18410
+# (my informal translation)
+# By order of the president of the republic, Enrique Bolanos, Nicaragua
+# advanced by sixty minutes their official time, yesterday at 2 in the
+# morning, and will stay that way until 30.th. of september.
+#
+# From Jesper Norgaard Welen (2006-09-30):
+# http://www.presidencia.gob.ni/buscador_gaceta/BD/DECRETOS/2006/D-063-2006P-PRN-Cambio-Hora.pdf
+# My informal translation runs:
+# The natural sun time is restored in all the national territory, in that the
+# time is returned one hour at 01:00 am of October 1 of 2006.
+#
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Nic     1979    1980    -       Mar     Sun>=16 0:00    1:00    D
+Rule   Nic     1979    1980    -       Jun     Mon>=23 0:00    0       S
+Rule   Nic     2005    only    -       Apr     10      0:00    1:00    D
+Rule   Nic     2005    only    -       Oct     Sun>=1  0:00    0       S
+Rule   Nic     2006    only    -       Apr     30      2:00    1:00    D
+Rule   Nic     2006    only    -       Oct     Sun>=1  1:00    0       S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Managua -5:45:08 -      LMT     1890
+                       -5:45:12 -      MMT     1934 Jun 23 # Managua Mean Time?
+                       -6:00   -       CST     1973 May
+                       -5:00   -       EST     1975 Feb 16
+                       -6:00   Nic     C%sT    1992 Jan  1 4:00
+                       -5:00   -       EST     1992 Sep 24
+                       -6:00   -       CST     1993
+                       -5:00   -       EST     1997
+                       -6:00   Nic     C%sT
+
+# Panama
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Panama  -5:18:08 -      LMT     1890
+                       -5:19:36 -      CMT     1908 Apr 22   # Colon Mean Time
+                       -5:00   -       EST
+
+# Puerto Rico
+# There are too many San Juans elsewhere, so we'll use `Puerto_Rico'.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Puerto_Rico -4:24:25 -    LMT     1899 Mar 28 12:00    # San Juan
+                       -4:00   -       AST     1942 May  3
+                       -4:00   US      A%sT    1946
+                       -4:00   -       AST
+
+# St Kitts-Nevis
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/St_Kitts  -4:10:52 -      LMT     1912 Mar 2      # Basseterre
+                       -4:00   -       AST
+
+# St Lucia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/St_Lucia  -4:04:00 -      LMT     1890            # Castries
+                       -4:04:00 -      CMT     1912        # Castries Mean Time
+                       -4:00   -       AST
+
+# St Pierre and Miquelon
+# There are too many St Pierres elsewhere, so we'll use `Miquelon'.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Miquelon  -3:44:40 -      LMT     1911 May 15     # St Pierre
+                       -4:00   -       AST     1980 May
+                       -3:00   -       PMST    1987 # Pierre & Miquelon Time
+                       -3:00   Canada  PM%sT
+
+# St Vincent and the Grenadines
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/St_Vincent        -4:04:56 -      LMT     1890            # Kingstown
+                       -4:04:56 -      KMT     1912       # Kingstown Mean Time
+                       -4:00   -       AST
+
+# Turks and Caicos
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say they use US DST rules, but IATA SSIM (1991/1998)
+# says they switch at midnight.  Go with IATA SSIM.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   TC      1979    1986    -       Apr     lastSun 0:00    1:00    D
+Rule   TC      1979    max     -       Oct     lastSun 0:00    0       S
+Rule   TC      1987    max     -       Apr     Sun>=1  0:00    1:00    D
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Grand_Turk        -4:44:32 -      LMT     1890
+                       -5:07:12 -      KMT     1912 Feb    # Kingston Mean Time
+                       -5:00   TC      E%sT
+
+# British Virgin Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Tortola   -4:18:28 -      LMT     1911 Jul    # Road Town
+                       -4:00   -       AST
+
+# Virgin Is
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/St_Thomas -4:19:44 -      LMT     1911 Jul    # Charlotte Amalie
+                       -4:00   -       AST
diff --git a/commands/zoneinfo/pacificnew b/commands/zoneinfo/pacificnew
new file mode 100644 (file)
index 0000000..667940b
--- /dev/null
@@ -0,0 +1,26 @@
+# @(#)pacificnew       8.1
+
+# From Arthur David Olson (1989-04-05):
+# On 1989-04-05, the U. S. House of Representatives passed (238-154) a bill
+# establishing "Pacific Presidential Election Time"; it was not acted on
+# by the Senate or signed into law by the President.
+# You might want to change the "PE" (Presidential Election) below to
+# "Q" (Quadrennial) to maintain three-character zone abbreviations.
+# If you're really conservative, you might want to change it to "D".
+# Avoid "L" (Leap Year), which won't be true in 2100.
+
+# If Presidential Election Time is ever established, replace "XXXX" below
+# with the year the law takes effect and uncomment the "##" lines.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+## Rule        Twilite XXXX    max     -       Apr     Sun>=1  2:00    1:00    D
+## Rule        Twilite XXXX    max     uspres  Oct     lastSun 2:00    1:00    PE
+## Rule        Twilite XXXX    max     uspres  Nov     Sun>=7  2:00    0       S
+## Rule        Twilite XXXX    max     nonpres Oct     lastSun 2:00    0       S
+
+# Zone NAME                    GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+## Zone        America/Los_Angeles-PET -8:00   US              P%sT    XXXX
+##                             -8:00   Twilite         P%sT
+
+# For now...
+Link   America/Los_Angeles     US/Pacific-New  ##
diff --git a/commands/zoneinfo/private.h b/commands/zoneinfo/private.h
new file mode 100644 (file)
index 0000000..d42d127
--- /dev/null
@@ -0,0 +1,316 @@
+#ifndef PRIVATE_H
+
+#define PRIVATE_H
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** ID
+*/
+
+#ifndef lint
+#ifndef NOID
+static char    privatehid[] = "@(#)private.h   7.55";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+#define GRANDPARENTED  "Local time zone must be set--see zic manual page"
+
+/*
+** Defaults for preprocessor symbols.
+** You can override these in your C compiler options, e.g. `-DHAVE_ADJTIME=0'.
+*/
+
+#ifndef HAVE_ADJTIME
+#define HAVE_ADJTIME           1
+#endif /* !defined HAVE_ADJTIME */
+
+#ifndef HAVE_GETTEXT
+#define HAVE_GETTEXT           0
+#endif /* !defined HAVE_GETTEXT */
+
+#ifndef HAVE_INCOMPATIBLE_CTIME_R
+#define HAVE_INCOMPATIBLE_CTIME_R      0
+#endif /* !defined INCOMPATIBLE_CTIME_R */
+
+#ifndef HAVE_SETTIMEOFDAY
+#define HAVE_SETTIMEOFDAY      3
+#endif /* !defined HAVE_SETTIMEOFDAY */
+
+#ifndef HAVE_STRERROR
+#define HAVE_STRERROR          1
+#endif /* !defined HAVE_STRERROR */
+
+#ifndef HAVE_SYMLINK
+#define HAVE_SYMLINK           1
+#endif /* !defined HAVE_SYMLINK */
+
+#ifndef HAVE_SYS_STAT_H
+#define HAVE_SYS_STAT_H                1
+#endif /* !defined HAVE_SYS_STAT_H */
+
+#ifndef HAVE_SYS_WAIT_H
+#define HAVE_SYS_WAIT_H                1
+#endif /* !defined HAVE_SYS_WAIT_H */
+
+#ifndef HAVE_UNISTD_H
+#define HAVE_UNISTD_H          1
+#endif /* !defined HAVE_UNISTD_H */
+
+#ifndef HAVE_UTMPX_H
+#define HAVE_UTMPX_H           0
+#endif /* !defined HAVE_UTMPX_H */
+
+#ifndef LOCALE_HOME
+#define LOCALE_HOME            "/usr/lib/locale"
+#endif /* !defined LOCALE_HOME */
+
+#if HAVE_INCOMPATIBLE_CTIME_R
+#define asctime_r _incompatible_asctime_r
+#define ctime_r _incompatible_ctime_r
+#endif /* HAVE_INCOMPATIBLE_CTIME_R */
+
+/*
+** Nested includes
+*/
+
+#include "sys/types.h" /* for time_t */
+#include "stdio.h"
+#include "errno.h"
+#include "string.h"
+#include "limits.h"    /* for CHAR_BIT */
+#include "time.h"
+#include "stdlib.h"
+
+#if HAVE_GETTEXT
+#include "libintl.h"
+#endif /* HAVE_GETTEXT */
+
+#if HAVE_SYS_WAIT_H
+#include <sys/wait.h>  /* for WIFEXITED and WEXITSTATUS */
+#endif /* HAVE_SYS_WAIT_H */
+
+#ifndef WIFEXITED
+#define WIFEXITED(status)      (((status) & 0xff) == 0)
+#endif /* !defined WIFEXITED */
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(status)    (((status) >> 8) & 0xff)
+#endif /* !defined WEXITSTATUS */
+
+#if HAVE_UNISTD_H
+#include "unistd.h"    /* for F_OK and R_OK */
+#endif /* HAVE_UNISTD_H */
+
+#if !HAVE_UNISTD_H
+#ifndef F_OK
+#define F_OK   0
+#endif /* !defined F_OK */
+#ifndef R_OK
+#define R_OK   4
+#endif /* !defined R_OK */
+#endif /* !HAVE_UNISTD_H */
+
+/* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */
+#define is_digit(c) ((unsigned)(c) - '0' <= 9)
+
+/*
+** Workarounds for compilers/systems.
+*/
+
+/*
+** SunOS 4.1.1 cc lacks prototypes.
+*/
+
+#ifndef P
+#if __STDC__
+#define P(x)   x
+#else /* !__STDC__ */
+#define P(x)   ()
+#endif /* !__STDC__ */
+#endif /* !defined P */
+
+/*
+** SunOS 4.1.1 headers lack EXIT_SUCCESS.
+*/
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS   0
+#endif /* !defined EXIT_SUCCESS */
+
+/*
+** SunOS 4.1.1 headers lack EXIT_FAILURE.
+*/
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE   1
+#endif /* !defined EXIT_FAILURE */
+
+/*
+** SunOS 4.1.1 headers lack FILENAME_MAX.
+*/
+
+#ifndef FILENAME_MAX
+
+#ifndef MAXPATHLEN
+#ifdef unix
+#include "sys/param.h"
+#endif /* defined unix */
+#endif /* !defined MAXPATHLEN */
+
+#ifdef MAXPATHLEN
+#define FILENAME_MAX   MAXPATHLEN
+#endif /* defined MAXPATHLEN */
+#ifndef MAXPATHLEN
+#define FILENAME_MAX   1024            /* Pure guesswork */
+#endif /* !defined MAXPATHLEN */
+
+#endif /* !defined FILENAME_MAX */
+
+/*
+** SunOS 4.1.1 libraries lack remove.
+*/
+
+#ifndef remove
+extern int     unlink P((const char * filename));
+#define remove unlink
+#endif /* !defined remove */
+
+/*
+** Some ancient errno.h implementations don't declare errno.
+** But some newer errno.h implementations define it as a macro.
+** Fix the former without affecting the latter.
+*/
+
+#ifndef errno
+extern int errno;
+#endif /* !defined errno */
+
+/*
+** Some time.h implementations don't declare asctime_r.
+** Others might define it as a macro.
+** Fix the former without affecting the latter.
+*/
+
+#ifndef asctime_r
+extern char *  asctime_r();
+#endif
+
+/*
+** Private function declarations.
+*/
+
+char * icalloc P((int nelem, int elsize));
+char * icatalloc P((char * old, const char * new));
+char * icpyalloc P((const char * string));
+char * imalloc P((int n));
+void * irealloc P((void * pointer, int size));
+void   icfree P((char * pointer));
+void   ifree P((char * pointer));
+const char *scheck P((const char *string, const char *format));
+
+/*
+** Finally, some convenience items.
+*/
+
+#ifndef TRUE
+#define TRUE   1
+#endif /* !defined TRUE */
+
+#ifndef FALSE
+#define FALSE  0
+#endif /* !defined FALSE */
+
+#ifndef TYPE_BIT
+#define TYPE_BIT(type) (sizeof (type) * CHAR_BIT)
+#endif /* !defined TYPE_BIT */
+
+#ifndef TYPE_SIGNED
+#define TYPE_SIGNED(type) (((type) -1) < 0)
+#endif /* !defined TYPE_SIGNED */
+
+/*
+** Since the definition of TYPE_INTEGRAL contains floating point numbers,
+** it cannot be used in preprocessor directives.
+*/
+
+#ifndef TYPE_INTEGRAL
+#define TYPE_INTEGRAL(type) (((type) 0.5) != 0.5)
+#endif /* !defined TYPE_INTEGRAL */
+
+#ifndef INT_STRLEN_MAXIMUM
+/*
+** 302 / 1000 is log10(2.0) rounded up.
+** Subtract one for the sign bit if the type is signed;
+** add one for integer division truncation;
+** add one more for a minus sign if the type is signed.
+*/
+#define INT_STRLEN_MAXIMUM(type) \
+       ((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + \
+       1 + TYPE_SIGNED(type))
+#endif /* !defined INT_STRLEN_MAXIMUM */
+
+/*
+** INITIALIZE(x)
+*/
+
+#ifndef GNUC_or_lint
+#ifdef lint
+#define GNUC_or_lint
+#endif /* defined lint */
+#ifndef lint
+#ifdef __GNUC__
+#define GNUC_or_lint
+#endif /* defined __GNUC__ */
+#endif /* !defined lint */
+#endif /* !defined GNUC_or_lint */
+
+#ifndef INITIALIZE
+#ifdef GNUC_or_lint
+#define INITIALIZE(x)  ((x) = 0)
+#endif /* defined GNUC_or_lint */
+#ifndef GNUC_or_lint
+#define INITIALIZE(x)
+#endif /* !defined GNUC_or_lint */
+#endif /* !defined INITIALIZE */
+
+/*
+** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
+*/
+
+#ifndef _
+#if HAVE_GETTEXT
+#define _(msgid) gettext(msgid)
+#else /* !HAVE_GETTEXT */
+#define _(msgid) msgid
+#endif /* !HAVE_GETTEXT */
+#endif /* !defined _ */
+
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
+#if HAVE_INCOMPATIBLE_CTIME_R
+#undef asctime_r
+#undef ctime_r
+char *asctime_r P((struct tm const *, char *));
+char *ctime_r P((time_t const *, char *));
+#endif /* HAVE_INCOMPATIBLE_CTIME_R */
+
+/*
+** UNIX was a registered trademark of The Open Group in 2003.
+*/
+
+#endif /* !defined PRIVATE_H */
diff --git a/commands/zoneinfo/scheck.c b/commands/zoneinfo/scheck.c
new file mode 100644 (file)
index 0000000..dda76b4
--- /dev/null
@@ -0,0 +1,64 @@
+#
+
+/*LINTLIBRARY*/
+
+#include "stdio.h"
+
+#ifndef lint
+#ifndef NOID
+static char    sccsid[] = "@(#)scheck.c        7.15";
+#endif /* !NOID */
+#endif /* !lint */
+
+#include "ctype.h"
+
+extern char *  imalloc();
+
+char *
+scheck(string, format)
+char * string;
+char * format;
+{
+       register char * fbuf;
+       register char * fp;
+       register char * tp;
+       register int    c;
+       register char * result;
+       char            dummy;
+
+       result = "";
+       if (string == NULL || format == NULL)
+               return result;
+       fbuf = imalloc(2 * strlen(format) + 4);
+       if (fbuf == NULL)
+               return result;
+       fp = format;
+       tp = fbuf;
+       while ((*tp++ = c = *fp++) != '\0') {
+               if (c != '%')
+                       continue;
+               if (*fp == '%') {
+                       *tp++ = *fp++;
+                       continue;
+               }
+               *tp++ = '*';
+               if (*fp == '*')
+                       ++fp;
+               while (isascii(*fp) && isdigit(*fp))
+                       *tp++ = *fp++;
+               if (*fp == 'l' || *fp == 'h')
+                       *tp++ = *fp++;
+               else if (*fp == '[')
+                       do *tp++ = *fp++;
+                               while (*fp != '\0' && *fp != ']');
+               if ((*tp++ = *fp++) == '\0')
+                       break;
+       }
+       *(tp - 1) = '%';
+       *tp++ = 'c';
+       *tp = '\0';
+       if (sscanf(string, fbuf, &dummy) != 1)
+               result = format;
+       free(fbuf);
+       return result;
+}
diff --git a/commands/zoneinfo/solar87 b/commands/zoneinfo/solar87
new file mode 100644 (file)
index 0000000..7183932
--- /dev/null
@@ -0,0 +1,388 @@
+# @(#)solar87  8.1
+
+# So much for footnotes about Saudi Arabia.
+# Apparent noon times below are for Riyadh; your mileage will vary.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1987; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   sol87   1987    only    -       Jan     1       12:03:20s -0:03:20 -
+Rule   sol87   1987    only    -       Jan     2       12:03:50s -0:03:50 -
+Rule   sol87   1987    only    -       Jan     3       12:04:15s -0:04:15 -
+Rule   sol87   1987    only    -       Jan     4       12:04:45s -0:04:45 -
+Rule   sol87   1987    only    -       Jan     5       12:05:10s -0:05:10 -
+Rule   sol87   1987    only    -       Jan     6       12:05:40s -0:05:40 -
+Rule   sol87   1987    only    -       Jan     7       12:06:05s -0:06:05 -
+Rule   sol87   1987    only    -       Jan     8       12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Jan     9       12:06:55s -0:06:55 -
+Rule   sol87   1987    only    -       Jan     10      12:07:20s -0:07:20 -
+Rule   sol87   1987    only    -       Jan     11      12:07:45s -0:07:45 -
+Rule   sol87   1987    only    -       Jan     12      12:08:10s -0:08:10 -
+Rule   sol87   1987    only    -       Jan     13      12:08:30s -0:08:30 -
+Rule   sol87   1987    only    -       Jan     14      12:08:55s -0:08:55 -
+Rule   sol87   1987    only    -       Jan     15      12:09:15s -0:09:15 -
+Rule   sol87   1987    only    -       Jan     16      12:09:35s -0:09:35 -
+Rule   sol87   1987    only    -       Jan     17      12:09:55s -0:09:55 -
+Rule   sol87   1987    only    -       Jan     18      12:10:15s -0:10:15 -
+Rule   sol87   1987    only    -       Jan     19      12:10:35s -0:10:35 -
+Rule   sol87   1987    only    -       Jan     20      12:10:55s -0:10:55 -
+Rule   sol87   1987    only    -       Jan     21      12:11:10s -0:11:10 -
+Rule   sol87   1987    only    -       Jan     22      12:11:30s -0:11:30 -
+Rule   sol87   1987    only    -       Jan     23      12:11:45s -0:11:45 -
+Rule   sol87   1987    only    -       Jan     24      12:12:00s -0:12:00 -
+Rule   sol87   1987    only    -       Jan     25      12:12:15s -0:12:15 -
+Rule   sol87   1987    only    -       Jan     26      12:12:30s -0:12:30 -
+Rule   sol87   1987    only    -       Jan     27      12:12:40s -0:12:40 -
+Rule   sol87   1987    only    -       Jan     28      12:12:55s -0:12:55 -
+Rule   sol87   1987    only    -       Jan     29      12:13:05s -0:13:05 -
+Rule   sol87   1987    only    -       Jan     30      12:13:15s -0:13:15 -
+Rule   sol87   1987    only    -       Jan     31      12:13:25s -0:13:25 -
+Rule   sol87   1987    only    -       Feb     1       12:13:35s -0:13:35 -
+Rule   sol87   1987    only    -       Feb     2       12:13:40s -0:13:40 -
+Rule   sol87   1987    only    -       Feb     3       12:13:50s -0:13:50 -
+Rule   sol87   1987    only    -       Feb     4       12:13:55s -0:13:55 -
+Rule   sol87   1987    only    -       Feb     5       12:14:00s -0:14:00 -
+Rule   sol87   1987    only    -       Feb     6       12:14:05s -0:14:05 -
+Rule   sol87   1987    only    -       Feb     7       12:14:10s -0:14:10 -
+Rule   sol87   1987    only    -       Feb     8       12:14:10s -0:14:10 -
+Rule   sol87   1987    only    -       Feb     9       12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     10      12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     11      12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     12      12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     13      12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     14      12:14:15s -0:14:15 -
+Rule   sol87   1987    only    -       Feb     15      12:14:10s -0:14:10 -
+Rule   sol87   1987    only    -       Feb     16      12:14:10s -0:14:10 -
+Rule   sol87   1987    only    -       Feb     17      12:14:05s -0:14:05 -
+Rule   sol87   1987    only    -       Feb     18      12:14:00s -0:14:00 -
+Rule   sol87   1987    only    -       Feb     19      12:13:55s -0:13:55 -
+Rule   sol87   1987    only    -       Feb     20      12:13:50s -0:13:50 -
+Rule   sol87   1987    only    -       Feb     21      12:13:45s -0:13:45 -
+Rule   sol87   1987    only    -       Feb     22      12:13:35s -0:13:35 -
+Rule   sol87   1987    only    -       Feb     23      12:13:30s -0:13:30 -
+Rule   sol87   1987    only    -       Feb     24      12:13:20s -0:13:20 -
+Rule   sol87   1987    only    -       Feb     25      12:13:10s -0:13:10 -
+Rule   sol87   1987    only    -       Feb     26      12:13:00s -0:13:00 -
+Rule   sol87   1987    only    -       Feb     27      12:12:50s -0:12:50 -
+Rule   sol87   1987    only    -       Feb     28      12:12:40s -0:12:40 -
+Rule   sol87   1987    only    -       Mar     1       12:12:30s -0:12:30 -
+Rule   sol87   1987    only    -       Mar     2       12:12:20s -0:12:20 -
+Rule   sol87   1987    only    -       Mar     3       12:12:05s -0:12:05 -
+Rule   sol87   1987    only    -       Mar     4       12:11:55s -0:11:55 -
+Rule   sol87   1987    only    -       Mar     5       12:11:40s -0:11:40 -
+Rule   sol87   1987    only    -       Mar     6       12:11:25s -0:11:25 -
+Rule   sol87   1987    only    -       Mar     7       12:11:15s -0:11:15 -
+Rule   sol87   1987    only    -       Mar     8       12:11:00s -0:11:00 -
+Rule   sol87   1987    only    -       Mar     9       12:10:45s -0:10:45 -
+Rule   sol87   1987    only    -       Mar     10      12:10:30s -0:10:30 -
+Rule   sol87   1987    only    -       Mar     11      12:10:15s -0:10:15 -
+Rule   sol87   1987    only    -       Mar     12      12:09:55s -0:09:55 -
+Rule   sol87   1987    only    -       Mar     13      12:09:40s -0:09:40 -
+Rule   sol87   1987    only    -       Mar     14      12:09:25s -0:09:25 -
+Rule   sol87   1987    only    -       Mar     15      12:09:10s -0:09:10 -
+Rule   sol87   1987    only    -       Mar     16      12:08:50s -0:08:50 -
+Rule   sol87   1987    only    -       Mar     17      12:08:35s -0:08:35 -
+Rule   sol87   1987    only    -       Mar     18      12:08:15s -0:08:15 -
+Rule   sol87   1987    only    -       Mar     19      12:08:00s -0:08:00 -
+Rule   sol87   1987    only    -       Mar     20      12:07:40s -0:07:40 -
+Rule   sol87   1987    only    -       Mar     21      12:07:25s -0:07:25 -
+Rule   sol87   1987    only    -       Mar     22      12:07:05s -0:07:05 -
+Rule   sol87   1987    only    -       Mar     23      12:06:50s -0:06:50 -
+Rule   sol87   1987    only    -       Mar     24      12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Mar     25      12:06:10s -0:06:10 -
+Rule   sol87   1987    only    -       Mar     26      12:05:55s -0:05:55 -
+Rule   sol87   1987    only    -       Mar     27      12:05:35s -0:05:35 -
+Rule   sol87   1987    only    -       Mar     28      12:05:15s -0:05:15 -
+Rule   sol87   1987    only    -       Mar     29      12:05:00s -0:05:00 -
+Rule   sol87   1987    only    -       Mar     30      12:04:40s -0:04:40 -
+Rule   sol87   1987    only    -       Mar     31      12:04:25s -0:04:25 -
+Rule   sol87   1987    only    -       Apr     1       12:04:05s -0:04:05 -
+Rule   sol87   1987    only    -       Apr     2       12:03:45s -0:03:45 -
+Rule   sol87   1987    only    -       Apr     3       12:03:30s -0:03:30 -
+Rule   sol87   1987    only    -       Apr     4       12:03:10s -0:03:10 -
+Rule   sol87   1987    only    -       Apr     5       12:02:55s -0:02:55 -
+Rule   sol87   1987    only    -       Apr     6       12:02:35s -0:02:35 -
+Rule   sol87   1987    only    -       Apr     7       12:02:20s -0:02:20 -
+Rule   sol87   1987    only    -       Apr     8       12:02:05s -0:02:05 -
+Rule   sol87   1987    only    -       Apr     9       12:01:45s -0:01:45 -
+Rule   sol87   1987    only    -       Apr     10      12:01:30s -0:01:30 -
+Rule   sol87   1987    only    -       Apr     11      12:01:15s -0:01:15 -
+Rule   sol87   1987    only    -       Apr     12      12:00:55s -0:00:55 -
+Rule   sol87   1987    only    -       Apr     13      12:00:40s -0:00:40 -
+Rule   sol87   1987    only    -       Apr     14      12:00:25s -0:00:25 -
+Rule   sol87   1987    only    -       Apr     15      12:00:10s -0:00:10 -
+Rule   sol87   1987    only    -       Apr     16      11:59:55s 0:00:05 -
+Rule   sol87   1987    only    -       Apr     17      11:59:45s 0:00:15 -
+Rule   sol87   1987    only    -       Apr     18      11:59:30s 0:00:30 -
+Rule   sol87   1987    only    -       Apr     19      11:59:15s 0:00:45 -
+Rule   sol87   1987    only    -       Apr     20      11:59:05s 0:00:55 -
+Rule   sol87   1987    only    -       Apr     21      11:58:50s 0:01:10 -
+Rule   sol87   1987    only    -       Apr     22      11:58:40s 0:01:20 -
+Rule   sol87   1987    only    -       Apr     23      11:58:25s 0:01:35 -
+Rule   sol87   1987    only    -       Apr     24      11:58:15s 0:01:45 -
+Rule   sol87   1987    only    -       Apr     25      11:58:05s 0:01:55 -
+Rule   sol87   1987    only    -       Apr     26      11:57:55s 0:02:05 -
+Rule   sol87   1987    only    -       Apr     27      11:57:45s 0:02:15 -
+Rule   sol87   1987    only    -       Apr     28      11:57:35s 0:02:25 -
+Rule   sol87   1987    only    -       Apr     29      11:57:25s 0:02:35 -
+Rule   sol87   1987    only    -       Apr     30      11:57:15s 0:02:45 -
+Rule   sol87   1987    only    -       May     1       11:57:10s 0:02:50 -
+Rule   sol87   1987    only    -       May     2       11:57:00s 0:03:00 -
+Rule   sol87   1987    only    -       May     3       11:56:55s 0:03:05 -
+Rule   sol87   1987    only    -       May     4       11:56:50s 0:03:10 -
+Rule   sol87   1987    only    -       May     5       11:56:45s 0:03:15 -
+Rule   sol87   1987    only    -       May     6       11:56:40s 0:03:20 -
+Rule   sol87   1987    only    -       May     7       11:56:35s 0:03:25 -
+Rule   sol87   1987    only    -       May     8       11:56:30s 0:03:30 -
+Rule   sol87   1987    only    -       May     9       11:56:25s 0:03:35 -
+Rule   sol87   1987    only    -       May     10      11:56:25s 0:03:35 -
+Rule   sol87   1987    only    -       May     11      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     12      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     13      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     14      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     15      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     16      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     17      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     18      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       May     19      11:56:25s 0:03:35 -
+Rule   sol87   1987    only    -       May     20      11:56:25s 0:03:35 -
+Rule   sol87   1987    only    -       May     21      11:56:30s 0:03:30 -
+Rule   sol87   1987    only    -       May     22      11:56:35s 0:03:25 -
+Rule   sol87   1987    only    -       May     23      11:56:40s 0:03:20 -
+Rule   sol87   1987    only    -       May     24      11:56:45s 0:03:15 -
+Rule   sol87   1987    only    -       May     25      11:56:50s 0:03:10 -
+Rule   sol87   1987    only    -       May     26      11:56:55s 0:03:05 -
+Rule   sol87   1987    only    -       May     27      11:57:00s 0:03:00 -
+Rule   sol87   1987    only    -       May     28      11:57:10s 0:02:50 -
+Rule   sol87   1987    only    -       May     29      11:57:15s 0:02:45 -
+Rule   sol87   1987    only    -       May     30      11:57:25s 0:02:35 -
+Rule   sol87   1987    only    -       May     31      11:57:30s 0:02:30 -
+Rule   sol87   1987    only    -       Jun     1       11:57:40s 0:02:20 -
+Rule   sol87   1987    only    -       Jun     2       11:57:50s 0:02:10 -
+Rule   sol87   1987    only    -       Jun     3       11:58:00s 0:02:00 -
+Rule   sol87   1987    only    -       Jun     4       11:58:10s 0:01:50 -
+Rule   sol87   1987    only    -       Jun     5       11:58:20s 0:01:40 -
+Rule   sol87   1987    only    -       Jun     6       11:58:30s 0:01:30 -
+Rule   sol87   1987    only    -       Jun     7       11:58:40s 0:01:20 -
+Rule   sol87   1987    only    -       Jun     8       11:58:50s 0:01:10 -
+Rule   sol87   1987    only    -       Jun     9       11:59:05s 0:00:55 -
+Rule   sol87   1987    only    -       Jun     10      11:59:15s 0:00:45 -
+Rule   sol87   1987    only    -       Jun     11      11:59:30s 0:00:30 -
+Rule   sol87   1987    only    -       Jun     12      11:59:40s 0:00:20 -
+Rule   sol87   1987    only    -       Jun     13      11:59:50s 0:00:10 -
+Rule   sol87   1987    only    -       Jun     14      12:00:05s -0:00:05 -
+Rule   sol87   1987    only    -       Jun     15      12:00:15s -0:00:15 -
+Rule   sol87   1987    only    -       Jun     16      12:00:30s -0:00:30 -
+Rule   sol87   1987    only    -       Jun     17      12:00:45s -0:00:45 -
+Rule   sol87   1987    only    -       Jun     18      12:00:55s -0:00:55 -
+Rule   sol87   1987    only    -       Jun     19      12:01:10s -0:01:10 -
+Rule   sol87   1987    only    -       Jun     20      12:01:20s -0:01:20 -
+Rule   sol87   1987    only    -       Jun     21      12:01:35s -0:01:35 -
+Rule   sol87   1987    only    -       Jun     22      12:01:50s -0:01:50 -
+Rule   sol87   1987    only    -       Jun     23      12:02:00s -0:02:00 -
+Rule   sol87   1987    only    -       Jun     24      12:02:15s -0:02:15 -
+Rule   sol87   1987    only    -       Jun     25      12:02:25s -0:02:25 -
+Rule   sol87   1987    only    -       Jun     26      12:02:40s -0:02:40 -
+Rule   sol87   1987    only    -       Jun     27      12:02:50s -0:02:50 -
+Rule   sol87   1987    only    -       Jun     28      12:03:05s -0:03:05 -
+Rule   sol87   1987    only    -       Jun     29      12:03:15s -0:03:15 -
+Rule   sol87   1987    only    -       Jun     30      12:03:30s -0:03:30 -
+Rule   sol87   1987    only    -       Jul     1       12:03:40s -0:03:40 -
+Rule   sol87   1987    only    -       Jul     2       12:03:50s -0:03:50 -
+Rule   sol87   1987    only    -       Jul     3       12:04:05s -0:04:05 -
+Rule   sol87   1987    only    -       Jul     4       12:04:15s -0:04:15 -
+Rule   sol87   1987    only    -       Jul     5       12:04:25s -0:04:25 -
+Rule   sol87   1987    only    -       Jul     6       12:04:35s -0:04:35 -
+Rule   sol87   1987    only    -       Jul     7       12:04:45s -0:04:45 -
+Rule   sol87   1987    only    -       Jul     8       12:04:55s -0:04:55 -
+Rule   sol87   1987    only    -       Jul     9       12:05:05s -0:05:05 -
+Rule   sol87   1987    only    -       Jul     10      12:05:15s -0:05:15 -
+Rule   sol87   1987    only    -       Jul     11      12:05:20s -0:05:20 -
+Rule   sol87   1987    only    -       Jul     12      12:05:30s -0:05:30 -
+Rule   sol87   1987    only    -       Jul     13      12:05:40s -0:05:40 -
+Rule   sol87   1987    only    -       Jul     14      12:05:45s -0:05:45 -
+Rule   sol87   1987    only    -       Jul     15      12:05:50s -0:05:50 -
+Rule   sol87   1987    only    -       Jul     16      12:06:00s -0:06:00 -
+Rule   sol87   1987    only    -       Jul     17      12:06:05s -0:06:05 -
+Rule   sol87   1987    only    -       Jul     18      12:06:10s -0:06:10 -
+Rule   sol87   1987    only    -       Jul     19      12:06:15s -0:06:15 -
+Rule   sol87   1987    only    -       Jul     20      12:06:15s -0:06:15 -
+Rule   sol87   1987    only    -       Jul     21      12:06:20s -0:06:20 -
+Rule   sol87   1987    only    -       Jul     22      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Jul     23      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Jul     24      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Jul     25      12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Jul     26      12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Jul     27      12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Jul     28      12:06:30s -0:06:30 -
+Rule   sol87   1987    only    -       Jul     29      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Jul     30      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Jul     31      12:06:25s -0:06:25 -
+Rule   sol87   1987    only    -       Aug     1       12:06:20s -0:06:20 -
+Rule   sol87   1987    only    -       Aug     2       12:06:15s -0:06:15 -
+Rule   sol87   1987    only    -       Aug     3       12:06:10s -0:06:10 -
+Rule   sol87   1987    only    -       Aug     4       12:06:05s -0:06:05 -
+Rule   sol87   1987    only    -       Aug     5       12:06:00s -0:06:00 -
+Rule   sol87   1987    only    -       Aug     6       12:05:55s -0:05:55 -
+Rule   sol87   1987    only    -       Aug     7       12:05:50s -0:05:50 -
+Rule   sol87   1987    only    -       Aug     8       12:05:40s -0:05:40 -
+Rule   sol87   1987    only    -       Aug     9       12:05:35s -0:05:35 -
+Rule   sol87   1987    only    -       Aug     10      12:05:25s -0:05:25 -
+Rule   sol87   1987    only    -       Aug     11      12:05:15s -0:05:15 -
+Rule   sol87   1987    only    -       Aug     12      12:05:05s -0:05:05 -
+Rule   sol87   1987    only    -       Aug     13      12:04:55s -0:04:55 -
+Rule   sol87   1987    only    -       Aug     14      12:04:45s -0:04:45 -
+Rule   sol87   1987    only    -       Aug     15      12:04:35s -0:04:35 -
+Rule   sol87   1987    only    -       Aug     16      12:04:25s -0:04:25 -
+Rule   sol87   1987    only    -       Aug     17      12:04:10s -0:04:10 -
+Rule   sol87   1987    only    -       Aug     18      12:04:00s -0:04:00 -
+Rule   sol87   1987    only    -       Aug     19      12:03:45s -0:03:45 -
+Rule   sol87   1987    only    -       Aug     20      12:03:30s -0:03:30 -
+Rule   sol87   1987    only    -       Aug     21      12:03:15s -0:03:15 -
+Rule   sol87   1987    only    -       Aug     22      12:03:00s -0:03:00 -
+Rule   sol87   1987    only    -       Aug     23      12:02:45s -0:02:45 -
+Rule   sol87   1987    only    -       Aug     24      12:02:30s -0:02:30 -
+Rule   sol87   1987    only    -       Aug     25      12:02:15s -0:02:15 -
+Rule   sol87   1987    only    -       Aug     26      12:02:00s -0:02:00 -
+Rule   sol87   1987    only    -       Aug     27      12:01:40s -0:01:40 -
+Rule   sol87   1987    only    -       Aug     28      12:01:25s -0:01:25 -
+Rule   sol87   1987    only    -       Aug     29      12:01:05s -0:01:05 -
+Rule   sol87   1987    only    -       Aug     30      12:00:50s -0:00:50 -
+Rule   sol87   1987    only    -       Aug     31      12:00:30s -0:00:30 -
+Rule   sol87   1987    only    -       Sep     1       12:00:10s -0:00:10 -
+Rule   sol87   1987    only    -       Sep     2       11:59:50s 0:00:10 -
+Rule   sol87   1987    only    -       Sep     3       11:59:35s 0:00:25 -
+Rule   sol87   1987    only    -       Sep     4       11:59:15s 0:00:45 -
+Rule   sol87   1987    only    -       Sep     5       11:58:55s 0:01:05 -
+Rule   sol87   1987    only    -       Sep     6       11:58:35s 0:01:25 -
+Rule   sol87   1987    only    -       Sep     7       11:58:15s 0:01:45 -
+Rule   sol87   1987    only    -       Sep     8       11:57:55s 0:02:05 -
+Rule   sol87   1987    only    -       Sep     9       11:57:30s 0:02:30 -
+Rule   sol87   1987    only    -       Sep     10      11:57:10s 0:02:50 -
+Rule   sol87   1987    only    -       Sep     11      11:56:50s 0:03:10 -
+Rule   sol87   1987    only    -       Sep     12      11:56:30s 0:03:30 -
+Rule   sol87   1987    only    -       Sep     13      11:56:10s 0:03:50 -
+Rule   sol87   1987    only    -       Sep     14      11:55:45s 0:04:15 -
+Rule   sol87   1987    only    -       Sep     15      11:55:25s 0:04:35 -
+Rule   sol87   1987    only    -       Sep     16      11:55:05s 0:04:55 -
+Rule   sol87   1987    only    -       Sep     17      11:54:45s 0:05:15 -
+Rule   sol87   1987    only    -       Sep     18      11:54:20s 0:05:40 -
+Rule   sol87   1987    only    -       Sep     19      11:54:00s 0:06:00 -
+Rule   sol87   1987    only    -       Sep     20      11:53:40s 0:06:20 -
+Rule   sol87   1987    only    -       Sep     21      11:53:15s 0:06:45 -
+Rule   sol87   1987    only    -       Sep     22      11:52:55s 0:07:05 -
+Rule   sol87   1987    only    -       Sep     23      11:52:35s 0:07:25 -
+Rule   sol87   1987    only    -       Sep     24      11:52:15s 0:07:45 -
+Rule   sol87   1987    only    -       Sep     25      11:51:55s 0:08:05 -
+Rule   sol87   1987    only    -       Sep     26      11:51:35s 0:08:25 -
+Rule   sol87   1987    only    -       Sep     27      11:51:10s 0:08:50 -
+Rule   sol87   1987    only    -       Sep     28      11:50:50s 0:09:10 -
+Rule   sol87   1987    only    -       Sep     29      11:50:30s 0:09:30 -
+Rule   sol87   1987    only    -       Sep     30      11:50:10s 0:09:50 -
+Rule   sol87   1987    only    -       Oct     1       11:49:50s 0:10:10 -
+Rule   sol87   1987    only    -       Oct     2       11:49:35s 0:10:25 -
+Rule   sol87   1987    only    -       Oct     3       11:49:15s 0:10:45 -
+Rule   sol87   1987    only    -       Oct     4       11:48:55s 0:11:05 -
+Rule   sol87   1987    only    -       Oct     5       11:48:35s 0:11:25 -
+Rule   sol87   1987    only    -       Oct     6       11:48:20s 0:11:40 -
+Rule   sol87   1987    only    -       Oct     7       11:48:00s 0:12:00 -
+Rule   sol87   1987    only    -       Oct     8       11:47:45s 0:12:15 -
+Rule   sol87   1987    only    -       Oct     9       11:47:25s 0:12:35 -
+Rule   sol87   1987    only    -       Oct     10      11:47:10s 0:12:50 -
+Rule   sol87   1987    only    -       Oct     11      11:46:55s 0:13:05 -
+Rule   sol87   1987    only    -       Oct     12      11:46:40s 0:13:20 -
+Rule   sol87   1987    only    -       Oct     13      11:46:25s 0:13:35 -
+Rule   sol87   1987    only    -       Oct     14      11:46:10s 0:13:50 -
+Rule   sol87   1987    only    -       Oct     15      11:45:55s 0:14:05 -
+Rule   sol87   1987    only    -       Oct     16      11:45:45s 0:14:15 -
+Rule   sol87   1987    only    -       Oct     17      11:45:30s 0:14:30 -
+Rule   sol87   1987    only    -       Oct     18      11:45:20s 0:14:40 -
+Rule   sol87   1987    only    -       Oct     19      11:45:05s 0:14:55 -
+Rule   sol87   1987    only    -       Oct     20      11:44:55s 0:15:05 -
+Rule   sol87   1987    only    -       Oct     21      11:44:45s 0:15:15 -
+Rule   sol87   1987    only    -       Oct     22      11:44:35s 0:15:25 -
+Rule   sol87   1987    only    -       Oct     23      11:44:25s 0:15:35 -
+Rule   sol87   1987    only    -       Oct     24      11:44:20s 0:15:40 -
+Rule   sol87   1987    only    -       Oct     25      11:44:10s 0:15:50 -
+Rule   sol87   1987    only    -       Oct     26      11:44:05s 0:15:55 -
+Rule   sol87   1987    only    -       Oct     27      11:43:55s 0:16:05 -
+Rule   sol87   1987    only    -       Oct     28      11:43:50s 0:16:10 -
+Rule   sol87   1987    only    -       Oct     29      11:43:45s 0:16:15 -
+Rule   sol87   1987    only    -       Oct     30      11:43:45s 0:16:15 -
+Rule   sol87   1987    only    -       Oct     31      11:43:40s 0:16:20 -
+Rule   sol87   1987    only    -       Nov     1       11:43:40s 0:16:20 -
+Rule   sol87   1987    only    -       Nov     2       11:43:35s 0:16:25 -
+Rule   sol87   1987    only    -       Nov     3       11:43:35s 0:16:25 -
+Rule   sol87   1987    only    -       Nov     4       11:43:35s 0:16:25 -
+Rule   sol87   1987    only    -       Nov     5       11:43:35s 0:16:25 -
+Rule   sol87   1987    only    -       Nov     6       11:43:40s 0:16:20 -
+Rule   sol87   1987    only    -       Nov     7       11:43:40s 0:16:20 -
+Rule   sol87   1987    only    -       Nov     8       11:43:45s 0:16:15 -
+Rule   sol87   1987    only    -       Nov     9       11:43:50s 0:16:10 -
+Rule   sol87   1987    only    -       Nov     10      11:43:55s 0:16:05 -
+Rule   sol87   1987    only    -       Nov     11      11:44:00s 0:16:00 -
+Rule   sol87   1987    only    -       Nov     12      11:44:05s 0:15:55 -
+Rule   sol87   1987    only    -       Nov     13      11:44:15s 0:15:45 -
+Rule   sol87   1987    only    -       Nov     14      11:44:20s 0:15:40 -
+Rule   sol87   1987    only    -       Nov     15      11:44:30s 0:15:30 -
+Rule   sol87   1987    only    -       Nov     16      11:44:40s 0:15:20 -
+Rule   sol87   1987    only    -       Nov     17      11:44:50s 0:15:10 -
+Rule   sol87   1987    only    -       Nov     18      11:45:05s 0:14:55 -
+Rule   sol87   1987    only    -       Nov     19      11:45:15s 0:14:45 -
+Rule   sol87   1987    only    -       Nov     20      11:45:30s 0:14:30 -
+Rule   sol87   1987    only    -       Nov     21      11:45:45s 0:14:15 -
+Rule   sol87   1987    only    -       Nov     22      11:46:00s 0:14:00 -
+Rule   sol87   1987    only    -       Nov     23      11:46:15s 0:13:45 -
+Rule   sol87   1987    only    -       Nov     24      11:46:30s 0:13:30 -
+Rule   sol87   1987    only    -       Nov     25      11:46:50s 0:13:10 -
+Rule   sol87   1987    only    -       Nov     26      11:47:10s 0:12:50 -
+Rule   sol87   1987    only    -       Nov     27      11:47:25s 0:12:35 -
+Rule   sol87   1987    only    -       Nov     28      11:47:45s 0:12:15 -
+Rule   sol87   1987    only    -       Nov     29      11:48:05s 0:11:55 -
+Rule   sol87   1987    only    -       Nov     30      11:48:30s 0:11:30 -
+Rule   sol87   1987    only    -       Dec     1       11:48:50s 0:11:10 -
+Rule   sol87   1987    only    -       Dec     2       11:49:10s 0:10:50 -
+Rule   sol87   1987    only    -       Dec     3       11:49:35s 0:10:25 -
+Rule   sol87   1987    only    -       Dec     4       11:50:00s 0:10:00 -
+Rule   sol87   1987    only    -       Dec     5       11:50:25s 0:09:35 -
+Rule   sol87   1987    only    -       Dec     6       11:50:50s 0:09:10 -
+Rule   sol87   1987    only    -       Dec     7       11:51:15s 0:08:45 -
+Rule   sol87   1987    only    -       Dec     8       11:51:40s 0:08:20 -
+Rule   sol87   1987    only    -       Dec     9       11:52:05s 0:07:55 -
+Rule   sol87   1987    only    -       Dec     10      11:52:30s 0:07:30 -
+Rule   sol87   1987    only    -       Dec     11      11:53:00s 0:07:00 -
+Rule   sol87   1987    only    -       Dec     12      11:53:25s 0:06:35 -
+Rule   sol87   1987    only    -       Dec     13      11:53:55s 0:06:05 -
+Rule   sol87   1987    only    -       Dec     14      11:54:25s 0:05:35 -
+Rule   sol87   1987    only    -       Dec     15      11:54:50s 0:05:10 -
+Rule   sol87   1987    only    -       Dec     16      11:55:20s 0:04:40 -
+Rule   sol87   1987    only    -       Dec     17      11:55:50s 0:04:10 -
+Rule   sol87   1987    only    -       Dec     18      11:56:20s 0:03:40 -
+Rule   sol87   1987    only    -       Dec     19      11:56:50s 0:03:10 -
+Rule   sol87   1987    only    -       Dec     20      11:57:20s 0:02:40 -
+Rule   sol87   1987    only    -       Dec     21      11:57:50s 0:02:10 -
+Rule   sol87   1987    only    -       Dec     22      11:58:20s 0:01:40 -
+Rule   sol87   1987    only    -       Dec     23      11:58:50s 0:01:10 -
+Rule   sol87   1987    only    -       Dec     24      11:59:20s 0:00:40 -
+Rule   sol87   1987    only    -       Dec     25      11:59:50s 0:00:10 -
+Rule   sol87   1987    only    -       Dec     26      12:00:20s -0:00:20 -
+Rule   sol87   1987    only    -       Dec     27      12:00:45s -0:00:45 -
+Rule   sol87   1987    only    -       Dec     28      12:01:15s -0:01:15 -
+Rule   sol87   1987    only    -       Dec     29      12:01:45s -0:01:45 -
+Rule   sol87   1987    only    -       Dec     30      12:02:15s -0:02:15 -
+Rule   sol87   1987    only    -       Dec     31      12:02:45s -0:02:45 -
+
+# Riyadh is at about 46 degrees 46 minutes East:  3 hrs, 7 mins, 4 secs
+# Before and after 1987, we'll operate on local mean solar time.
+
+# Zone NAME            GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+Zone   Asia/Riyadh87   3:07:04 -               zzz     1987
+                       3:07:04 sol87           zzz     1988
+                       3:07:04 -               zzz
+# For backward compatibility...
+Link   Asia/Riyadh87   Mideast/Riyadh87
diff --git a/commands/zoneinfo/solar88 b/commands/zoneinfo/solar88
new file mode 100644 (file)
index 0000000..b4cfe8e
--- /dev/null
@@ -0,0 +1,388 @@
+# @(#)solar88  8.1
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using formulas in the U.S. Naval Observatory's
+# Almanac for Computers 1988; the formulas "will give EqT to an accuracy of
+# [plus or minus two] seconds during the current year."
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   sol88   1988    only    -       Jan     1       12:03:15s -0:03:15 -
+Rule   sol88   1988    only    -       Jan     2       12:03:40s -0:03:40 -
+Rule   sol88   1988    only    -       Jan     3       12:04:10s -0:04:10 -
+Rule   sol88   1988    only    -       Jan     4       12:04:40s -0:04:40 -
+Rule   sol88   1988    only    -       Jan     5       12:05:05s -0:05:05 -
+Rule   sol88   1988    only    -       Jan     6       12:05:30s -0:05:30 -
+Rule   sol88   1988    only    -       Jan     7       12:06:00s -0:06:00 -
+Rule   sol88   1988    only    -       Jan     8       12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jan     9       12:06:50s -0:06:50 -
+Rule   sol88   1988    only    -       Jan     10      12:07:15s -0:07:15 -
+Rule   sol88   1988    only    -       Jan     11      12:07:40s -0:07:40 -
+Rule   sol88   1988    only    -       Jan     12      12:08:05s -0:08:05 -
+Rule   sol88   1988    only    -       Jan     13      12:08:25s -0:08:25 -
+Rule   sol88   1988    only    -       Jan     14      12:08:50s -0:08:50 -
+Rule   sol88   1988    only    -       Jan     15      12:09:10s -0:09:10 -
+Rule   sol88   1988    only    -       Jan     16      12:09:30s -0:09:30 -
+Rule   sol88   1988    only    -       Jan     17      12:09:50s -0:09:50 -
+Rule   sol88   1988    only    -       Jan     18      12:10:10s -0:10:10 -
+Rule   sol88   1988    only    -       Jan     19      12:10:30s -0:10:30 -
+Rule   sol88   1988    only    -       Jan     20      12:10:50s -0:10:50 -
+Rule   sol88   1988    only    -       Jan     21      12:11:05s -0:11:05 -
+Rule   sol88   1988    only    -       Jan     22      12:11:25s -0:11:25 -
+Rule   sol88   1988    only    -       Jan     23      12:11:40s -0:11:40 -
+Rule   sol88   1988    only    -       Jan     24      12:11:55s -0:11:55 -
+Rule   sol88   1988    only    -       Jan     25      12:12:10s -0:12:10 -
+Rule   sol88   1988    only    -       Jan     26      12:12:25s -0:12:25 -
+Rule   sol88   1988    only    -       Jan     27      12:12:40s -0:12:40 -
+Rule   sol88   1988    only    -       Jan     28      12:12:50s -0:12:50 -
+Rule   sol88   1988    only    -       Jan     29      12:13:00s -0:13:00 -
+Rule   sol88   1988    only    -       Jan     30      12:13:10s -0:13:10 -
+Rule   sol88   1988    only    -       Jan     31      12:13:20s -0:13:20 -
+Rule   sol88   1988    only    -       Feb     1       12:13:30s -0:13:30 -
+Rule   sol88   1988    only    -       Feb     2       12:13:40s -0:13:40 -
+Rule   sol88   1988    only    -       Feb     3       12:13:45s -0:13:45 -
+Rule   sol88   1988    only    -       Feb     4       12:13:55s -0:13:55 -
+Rule   sol88   1988    only    -       Feb     5       12:14:00s -0:14:00 -
+Rule   sol88   1988    only    -       Feb     6       12:14:05s -0:14:05 -
+Rule   sol88   1988    only    -       Feb     7       12:14:10s -0:14:10 -
+Rule   sol88   1988    only    -       Feb     8       12:14:10s -0:14:10 -
+Rule   sol88   1988    only    -       Feb     9       12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     10      12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     11      12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     12      12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     13      12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     14      12:14:15s -0:14:15 -
+Rule   sol88   1988    only    -       Feb     15      12:14:10s -0:14:10 -
+Rule   sol88   1988    only    -       Feb     16      12:14:10s -0:14:10 -
+Rule   sol88   1988    only    -       Feb     17      12:14:05s -0:14:05 -
+Rule   sol88   1988    only    -       Feb     18      12:14:00s -0:14:00 -
+Rule   sol88   1988    only    -       Feb     19      12:13:55s -0:13:55 -
+Rule   sol88   1988    only    -       Feb     20      12:13:50s -0:13:50 -
+Rule   sol88   1988    only    -       Feb     21      12:13:45s -0:13:45 -
+Rule   sol88   1988    only    -       Feb     22      12:13:40s -0:13:40 -
+Rule   sol88   1988    only    -       Feb     23      12:13:30s -0:13:30 -
+Rule   sol88   1988    only    -       Feb     24      12:13:20s -0:13:20 -
+Rule   sol88   1988    only    -       Feb     25      12:13:15s -0:13:15 -
+Rule   sol88   1988    only    -       Feb     26      12:13:05s -0:13:05 -
+Rule   sol88   1988    only    -       Feb     27      12:12:55s -0:12:55 -
+Rule   sol88   1988    only    -       Feb     28      12:12:45s -0:12:45 -
+Rule   sol88   1988    only    -       Feb     29      12:12:30s -0:12:30 -
+Rule   sol88   1988    only    -       Mar     1       12:12:20s -0:12:20 -
+Rule   sol88   1988    only    -       Mar     2       12:12:10s -0:12:10 -
+Rule   sol88   1988    only    -       Mar     3       12:11:55s -0:11:55 -
+Rule   sol88   1988    only    -       Mar     4       12:11:45s -0:11:45 -
+Rule   sol88   1988    only    -       Mar     5       12:11:30s -0:11:30 -
+Rule   sol88   1988    only    -       Mar     6       12:11:15s -0:11:15 -
+Rule   sol88   1988    only    -       Mar     7       12:11:00s -0:11:00 -
+Rule   sol88   1988    only    -       Mar     8       12:10:45s -0:10:45 -
+Rule   sol88   1988    only    -       Mar     9       12:10:30s -0:10:30 -
+Rule   sol88   1988    only    -       Mar     10      12:10:15s -0:10:15 -
+Rule   sol88   1988    only    -       Mar     11      12:10:00s -0:10:00 -
+Rule   sol88   1988    only    -       Mar     12      12:09:45s -0:09:45 -
+Rule   sol88   1988    only    -       Mar     13      12:09:30s -0:09:30 -
+Rule   sol88   1988    only    -       Mar     14      12:09:10s -0:09:10 -
+Rule   sol88   1988    only    -       Mar     15      12:08:55s -0:08:55 -
+Rule   sol88   1988    only    -       Mar     16      12:08:40s -0:08:40 -
+Rule   sol88   1988    only    -       Mar     17      12:08:20s -0:08:20 -
+Rule   sol88   1988    only    -       Mar     18      12:08:05s -0:08:05 -
+Rule   sol88   1988    only    -       Mar     19      12:07:45s -0:07:45 -
+Rule   sol88   1988    only    -       Mar     20      12:07:30s -0:07:30 -
+Rule   sol88   1988    only    -       Mar     21      12:07:10s -0:07:10 -
+Rule   sol88   1988    only    -       Mar     22      12:06:50s -0:06:50 -
+Rule   sol88   1988    only    -       Mar     23      12:06:35s -0:06:35 -
+Rule   sol88   1988    only    -       Mar     24      12:06:15s -0:06:15 -
+Rule   sol88   1988    only    -       Mar     25      12:06:00s -0:06:00 -
+Rule   sol88   1988    only    -       Mar     26      12:05:40s -0:05:40 -
+Rule   sol88   1988    only    -       Mar     27      12:05:20s -0:05:20 -
+Rule   sol88   1988    only    -       Mar     28      12:05:05s -0:05:05 -
+Rule   sol88   1988    only    -       Mar     29      12:04:45s -0:04:45 -
+Rule   sol88   1988    only    -       Mar     30      12:04:25s -0:04:25 -
+Rule   sol88   1988    only    -       Mar     31      12:04:10s -0:04:10 -
+Rule   sol88   1988    only    -       Apr     1       12:03:50s -0:03:50 -
+Rule   sol88   1988    only    -       Apr     2       12:03:35s -0:03:35 -
+Rule   sol88   1988    only    -       Apr     3       12:03:15s -0:03:15 -
+Rule   sol88   1988    only    -       Apr     4       12:03:00s -0:03:00 -
+Rule   sol88   1988    only    -       Apr     5       12:02:40s -0:02:40 -
+Rule   sol88   1988    only    -       Apr     6       12:02:25s -0:02:25 -
+Rule   sol88   1988    only    -       Apr     7       12:02:05s -0:02:05 -
+Rule   sol88   1988    only    -       Apr     8       12:01:50s -0:01:50 -
+Rule   sol88   1988    only    -       Apr     9       12:01:35s -0:01:35 -
+Rule   sol88   1988    only    -       Apr     10      12:01:15s -0:01:15 -
+Rule   sol88   1988    only    -       Apr     11      12:01:00s -0:01:00 -
+Rule   sol88   1988    only    -       Apr     12      12:00:45s -0:00:45 -
+Rule   sol88   1988    only    -       Apr     13      12:00:30s -0:00:30 -
+Rule   sol88   1988    only    -       Apr     14      12:00:15s -0:00:15 -
+Rule   sol88   1988    only    -       Apr     15      12:00:00s 0:00:00 -
+Rule   sol88   1988    only    -       Apr     16      11:59:45s 0:00:15 -
+Rule   sol88   1988    only    -       Apr     17      11:59:30s 0:00:30 -
+Rule   sol88   1988    only    -       Apr     18      11:59:20s 0:00:40 -
+Rule   sol88   1988    only    -       Apr     19      11:59:05s 0:00:55 -
+Rule   sol88   1988    only    -       Apr     20      11:58:55s 0:01:05 -
+Rule   sol88   1988    only    -       Apr     21      11:58:40s 0:01:20 -
+Rule   sol88   1988    only    -       Apr     22      11:58:30s 0:01:30 -
+Rule   sol88   1988    only    -       Apr     23      11:58:15s 0:01:45 -
+Rule   sol88   1988    only    -       Apr     24      11:58:05s 0:01:55 -
+Rule   sol88   1988    only    -       Apr     25      11:57:55s 0:02:05 -
+Rule   sol88   1988    only    -       Apr     26      11:57:45s 0:02:15 -
+Rule   sol88   1988    only    -       Apr     27      11:57:35s 0:02:25 -
+Rule   sol88   1988    only    -       Apr     28      11:57:30s 0:02:30 -
+Rule   sol88   1988    only    -       Apr     29      11:57:20s 0:02:40 -
+Rule   sol88   1988    only    -       Apr     30      11:57:10s 0:02:50 -
+Rule   sol88   1988    only    -       May     1       11:57:05s 0:02:55 -
+Rule   sol88   1988    only    -       May     2       11:56:55s 0:03:05 -
+Rule   sol88   1988    only    -       May     3       11:56:50s 0:03:10 -
+Rule   sol88   1988    only    -       May     4       11:56:45s 0:03:15 -
+Rule   sol88   1988    only    -       May     5       11:56:40s 0:03:20 -
+Rule   sol88   1988    only    -       May     6       11:56:35s 0:03:25 -
+Rule   sol88   1988    only    -       May     7       11:56:30s 0:03:30 -
+Rule   sol88   1988    only    -       May     8       11:56:25s 0:03:35 -
+Rule   sol88   1988    only    -       May     9       11:56:25s 0:03:35 -
+Rule   sol88   1988    only    -       May     10      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     11      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     12      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     13      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     14      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     15      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     16      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     17      11:56:20s 0:03:40 -
+Rule   sol88   1988    only    -       May     18      11:56:25s 0:03:35 -
+Rule   sol88   1988    only    -       May     19      11:56:25s 0:03:35 -
+Rule   sol88   1988    only    -       May     20      11:56:30s 0:03:30 -
+Rule   sol88   1988    only    -       May     21      11:56:35s 0:03:25 -
+Rule   sol88   1988    only    -       May     22      11:56:40s 0:03:20 -
+Rule   sol88   1988    only    -       May     23      11:56:45s 0:03:15 -
+Rule   sol88   1988    only    -       May     24      11:56:50s 0:03:10 -
+Rule   sol88   1988    only    -       May     25      11:56:55s 0:03:05 -
+Rule   sol88   1988    only    -       May     26      11:57:00s 0:03:00 -
+Rule   sol88   1988    only    -       May     27      11:57:05s 0:02:55 -
+Rule   sol88   1988    only    -       May     28      11:57:15s 0:02:45 -
+Rule   sol88   1988    only    -       May     29      11:57:20s 0:02:40 -
+Rule   sol88   1988    only    -       May     30      11:57:30s 0:02:30 -
+Rule   sol88   1988    only    -       May     31      11:57:40s 0:02:20 -
+Rule   sol88   1988    only    -       Jun     1       11:57:50s 0:02:10 -
+Rule   sol88   1988    only    -       Jun     2       11:57:55s 0:02:05 -
+Rule   sol88   1988    only    -       Jun     3       11:58:05s 0:01:55 -
+Rule   sol88   1988    only    -       Jun     4       11:58:15s 0:01:45 -
+Rule   sol88   1988    only    -       Jun     5       11:58:30s 0:01:30 -
+Rule   sol88   1988    only    -       Jun     6       11:58:40s 0:01:20 -
+Rule   sol88   1988    only    -       Jun     7       11:58:50s 0:01:10 -
+Rule   sol88   1988    only    -       Jun     8       11:59:00s 0:01:00 -
+Rule   sol88   1988    only    -       Jun     9       11:59:15s 0:00:45 -
+Rule   sol88   1988    only    -       Jun     10      11:59:25s 0:00:35 -
+Rule   sol88   1988    only    -       Jun     11      11:59:35s 0:00:25 -
+Rule   sol88   1988    only    -       Jun     12      11:59:50s 0:00:10 -
+Rule   sol88   1988    only    -       Jun     13      12:00:00s 0:00:00 -
+Rule   sol88   1988    only    -       Jun     14      12:00:15s -0:00:15 -
+Rule   sol88   1988    only    -       Jun     15      12:00:25s -0:00:25 -
+Rule   sol88   1988    only    -       Jun     16      12:00:40s -0:00:40 -
+Rule   sol88   1988    only    -       Jun     17      12:00:55s -0:00:55 -
+Rule   sol88   1988    only    -       Jun     18      12:01:05s -0:01:05 -
+Rule   sol88   1988    only    -       Jun     19      12:01:20s -0:01:20 -
+Rule   sol88   1988    only    -       Jun     20      12:01:30s -0:01:30 -
+Rule   sol88   1988    only    -       Jun     21      12:01:45s -0:01:45 -
+Rule   sol88   1988    only    -       Jun     22      12:02:00s -0:02:00 -
+Rule   sol88   1988    only    -       Jun     23      12:02:10s -0:02:10 -
+Rule   sol88   1988    only    -       Jun     24      12:02:25s -0:02:25 -
+Rule   sol88   1988    only    -       Jun     25      12:02:35s -0:02:35 -
+Rule   sol88   1988    only    -       Jun     26      12:02:50s -0:02:50 -
+Rule   sol88   1988    only    -       Jun     27      12:03:00s -0:03:00 -
+Rule   sol88   1988    only    -       Jun     28      12:03:15s -0:03:15 -
+Rule   sol88   1988    only    -       Jun     29      12:03:25s -0:03:25 -
+Rule   sol88   1988    only    -       Jun     30      12:03:40s -0:03:40 -
+Rule   sol88   1988    only    -       Jul     1       12:03:50s -0:03:50 -
+Rule   sol88   1988    only    -       Jul     2       12:04:00s -0:04:00 -
+Rule   sol88   1988    only    -       Jul     3       12:04:10s -0:04:10 -
+Rule   sol88   1988    only    -       Jul     4       12:04:25s -0:04:25 -
+Rule   sol88   1988    only    -       Jul     5       12:04:35s -0:04:35 -
+Rule   sol88   1988    only    -       Jul     6       12:04:45s -0:04:45 -
+Rule   sol88   1988    only    -       Jul     7       12:04:55s -0:04:55 -
+Rule   sol88   1988    only    -       Jul     8       12:05:05s -0:05:05 -
+Rule   sol88   1988    only    -       Jul     9       12:05:10s -0:05:10 -
+Rule   sol88   1988    only    -       Jul     10      12:05:20s -0:05:20 -
+Rule   sol88   1988    only    -       Jul     11      12:05:30s -0:05:30 -
+Rule   sol88   1988    only    -       Jul     12      12:05:35s -0:05:35 -
+Rule   sol88   1988    only    -       Jul     13      12:05:45s -0:05:45 -
+Rule   sol88   1988    only    -       Jul     14      12:05:50s -0:05:50 -
+Rule   sol88   1988    only    -       Jul     15      12:05:55s -0:05:55 -
+Rule   sol88   1988    only    -       Jul     16      12:06:00s -0:06:00 -
+Rule   sol88   1988    only    -       Jul     17      12:06:05s -0:06:05 -
+Rule   sol88   1988    only    -       Jul     18      12:06:10s -0:06:10 -
+Rule   sol88   1988    only    -       Jul     19      12:06:15s -0:06:15 -
+Rule   sol88   1988    only    -       Jul     20      12:06:20s -0:06:20 -
+Rule   sol88   1988    only    -       Jul     21      12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jul     22      12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jul     23      12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jul     24      12:06:30s -0:06:30 -
+Rule   sol88   1988    only    -       Jul     25      12:06:30s -0:06:30 -
+Rule   sol88   1988    only    -       Jul     26      12:06:30s -0:06:30 -
+Rule   sol88   1988    only    -       Jul     27      12:06:30s -0:06:30 -
+Rule   sol88   1988    only    -       Jul     28      12:06:30s -0:06:30 -
+Rule   sol88   1988    only    -       Jul     29      12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jul     30      12:06:25s -0:06:25 -
+Rule   sol88   1988    only    -       Jul     31      12:06:20s -0:06:20 -
+Rule   sol88   1988    only    -       Aug     1       12:06:15s -0:06:15 -
+Rule   sol88   1988    only    -       Aug     2       12:06:15s -0:06:15 -
+Rule   sol88   1988    only    -       Aug     3       12:06:10s -0:06:10 -
+Rule   sol88   1988    only    -       Aug     4       12:06:05s -0:06:05 -
+Rule   sol88   1988    only    -       Aug     5       12:05:55s -0:05:55 -
+Rule   sol88   1988    only    -       Aug     6       12:05:50s -0:05:50 -
+Rule   sol88   1988    only    -       Aug     7       12:05:45s -0:05:45 -
+Rule   sol88   1988    only    -       Aug     8       12:05:35s -0:05:35 -
+Rule   sol88   1988    only    -       Aug     9       12:05:25s -0:05:25 -
+Rule   sol88   1988    only    -       Aug     10      12:05:20s -0:05:20 -
+Rule   sol88   1988    only    -       Aug     11      12:05:10s -0:05:10 -
+Rule   sol88   1988    only    -       Aug     12      12:05:00s -0:05:00 -
+Rule   sol88   1988    only    -       Aug     13      12:04:50s -0:04:50 -
+Rule   sol88   1988    only    -       Aug     14      12:04:35s -0:04:35 -
+Rule   sol88   1988    only    -       Aug     15      12:04:25s -0:04:25 -
+Rule   sol88   1988    only    -       Aug     16      12:04:15s -0:04:15 -
+Rule   sol88   1988    only    -       Aug     17      12:04:00s -0:04:00 -
+Rule   sol88   1988    only    -       Aug     18      12:03:50s -0:03:50 -
+Rule   sol88   1988    only    -       Aug     19      12:03:35s -0:03:35 -
+Rule   sol88   1988    only    -       Aug     20      12:03:20s -0:03:20 -
+Rule   sol88   1988    only    -       Aug     21      12:03:05s -0:03:05 -
+Rule   sol88   1988    only    -       Aug     22      12:02:50s -0:02:50 -
+Rule   sol88   1988    only    -       Aug     23      12:02:35s -0:02:35 -
+Rule   sol88   1988    only    -       Aug     24      12:02:20s -0:02:20 -
+Rule   sol88   1988    only    -       Aug     25      12:02:00s -0:02:00 -
+Rule   sol88   1988    only    -       Aug     26      12:01:45s -0:01:45 -
+Rule   sol88   1988    only    -       Aug     27      12:01:30s -0:01:30 -
+Rule   sol88   1988    only    -       Aug     28      12:01:10s -0:01:10 -
+Rule   sol88   1988    only    -       Aug     29      12:00:50s -0:00:50 -
+Rule   sol88   1988    only    -       Aug     30      12:00:35s -0:00:35 -
+Rule   sol88   1988    only    -       Aug     31      12:00:15s -0:00:15 -
+Rule   sol88   1988    only    -       Sep     1       11:59:55s 0:00:05 -
+Rule   sol88   1988    only    -       Sep     2       11:59:35s 0:00:25 -
+Rule   sol88   1988    only    -       Sep     3       11:59:20s 0:00:40 -
+Rule   sol88   1988    only    -       Sep     4       11:59:00s 0:01:00 -
+Rule   sol88   1988    only    -       Sep     5       11:58:40s 0:01:20 -
+Rule   sol88   1988    only    -       Sep     6       11:58:20s 0:01:40 -
+Rule   sol88   1988    only    -       Sep     7       11:58:00s 0:02:00 -
+Rule   sol88   1988    only    -       Sep     8       11:57:35s 0:02:25 -
+Rule   sol88   1988    only    -       Sep     9       11:57:15s 0:02:45 -
+Rule   sol88   1988    only    -       Sep     10      11:56:55s 0:03:05 -
+Rule   sol88   1988    only    -       Sep     11      11:56:35s 0:03:25 -
+Rule   sol88   1988    only    -       Sep     12      11:56:15s 0:03:45 -
+Rule   sol88   1988    only    -       Sep     13      11:55:50s 0:04:10 -
+Rule   sol88   1988    only    -       Sep     14      11:55:30s 0:04:30 -
+Rule   sol88   1988    only    -       Sep     15      11:55:10s 0:04:50 -
+Rule   sol88   1988    only    -       Sep     16      11:54:50s 0:05:10 -
+Rule   sol88   1988    only    -       Sep     17      11:54:25s 0:05:35 -
+Rule   sol88   1988    only    -       Sep     18      11:54:05s 0:05:55 -
+Rule   sol88   1988    only    -       Sep     19      11:53:45s 0:06:15 -
+Rule   sol88   1988    only    -       Sep     20      11:53:25s 0:06:35 -
+Rule   sol88   1988    only    -       Sep     21      11:53:00s 0:07:00 -
+Rule   sol88   1988    only    -       Sep     22      11:52:40s 0:07:20 -
+Rule   sol88   1988    only    -       Sep     23      11:52:20s 0:07:40 -
+Rule   sol88   1988    only    -       Sep     24      11:52:00s 0:08:00 -
+Rule   sol88   1988    only    -       Sep     25      11:51:40s 0:08:20 -
+Rule   sol88   1988    only    -       Sep     26      11:51:15s 0:08:45 -
+Rule   sol88   1988    only    -       Sep     27      11:50:55s 0:09:05 -
+Rule   sol88   1988    only    -       Sep     28      11:50:35s 0:09:25 -
+Rule   sol88   1988    only    -       Sep     29      11:50:15s 0:09:45 -
+Rule   sol88   1988    only    -       Sep     30      11:49:55s 0:10:05 -
+Rule   sol88   1988    only    -       Oct     1       11:49:35s 0:10:25 -
+Rule   sol88   1988    only    -       Oct     2       11:49:20s 0:10:40 -
+Rule   sol88   1988    only    -       Oct     3       11:49:00s 0:11:00 -
+Rule   sol88   1988    only    -       Oct     4       11:48:40s 0:11:20 -
+Rule   sol88   1988    only    -       Oct     5       11:48:25s 0:11:35 -
+Rule   sol88   1988    only    -       Oct     6       11:48:05s 0:11:55 -
+Rule   sol88   1988    only    -       Oct     7       11:47:50s 0:12:10 -
+Rule   sol88   1988    only    -       Oct     8       11:47:30s 0:12:30 -
+Rule   sol88   1988    only    -       Oct     9       11:47:15s 0:12:45 -
+Rule   sol88   1988    only    -       Oct     10      11:47:00s 0:13:00 -
+Rule   sol88   1988    only    -       Oct     11      11:46:45s 0:13:15 -
+Rule   sol88   1988    only    -       Oct     12      11:46:30s 0:13:30 -
+Rule   sol88   1988    only    -       Oct     13      11:46:15s 0:13:45 -
+Rule   sol88   1988    only    -       Oct     14      11:46:00s 0:14:00 -
+Rule   sol88   1988    only    -       Oct     15      11:45:45s 0:14:15 -
+Rule   sol88   1988    only    -       Oct     16      11:45:35s 0:14:25 -
+Rule   sol88   1988    only    -       Oct     17      11:45:20s 0:14:40 -
+Rule   sol88   1988    only    -       Oct     18      11:45:10s 0:14:50 -
+Rule   sol88   1988    only    -       Oct     19      11:45:00s 0:15:00 -
+Rule   sol88   1988    only    -       Oct     20      11:44:45s 0:15:15 -
+Rule   sol88   1988    only    -       Oct     21      11:44:40s 0:15:20 -
+Rule   sol88   1988    only    -       Oct     22      11:44:30s 0:15:30 -
+Rule   sol88   1988    only    -       Oct     23      11:44:20s 0:15:40 -
+Rule   sol88   1988    only    -       Oct     24      11:44:10s 0:15:50 -
+Rule   sol88   1988    only    -       Oct     25      11:44:05s 0:15:55 -
+Rule   sol88   1988    only    -       Oct     26      11:44:00s 0:16:00 -
+Rule   sol88   1988    only    -       Oct     27      11:43:55s 0:16:05 -
+Rule   sol88   1988    only    -       Oct     28      11:43:50s 0:16:10 -
+Rule   sol88   1988    only    -       Oct     29      11:43:45s 0:16:15 -
+Rule   sol88   1988    only    -       Oct     30      11:43:40s 0:16:20 -
+Rule   sol88   1988    only    -       Oct     31      11:43:40s 0:16:20 -
+Rule   sol88   1988    only    -       Nov     1       11:43:35s 0:16:25 -
+Rule   sol88   1988    only    -       Nov     2       11:43:35s 0:16:25 -
+Rule   sol88   1988    only    -       Nov     3       11:43:35s 0:16:25 -
+Rule   sol88   1988    only    -       Nov     4       11:43:35s 0:16:25 -
+Rule   sol88   1988    only    -       Nov     5       11:43:40s 0:16:20 -
+Rule   sol88   1988    only    -       Nov     6       11:43:40s 0:16:20 -
+Rule   sol88   1988    only    -       Nov     7       11:43:45s 0:16:15 -
+Rule   sol88   1988    only    -       Nov     8       11:43:45s 0:16:15 -
+Rule   sol88   1988    only    -       Nov     9       11:43:50s 0:16:10 -
+Rule   sol88   1988    only    -       Nov     10      11:44:00s 0:16:00 -
+Rule   sol88   1988    only    -       Nov     11      11:44:05s 0:15:55 -
+Rule   sol88   1988    only    -       Nov     12      11:44:10s 0:15:50 -
+Rule   sol88   1988    only    -       Nov     13      11:44:20s 0:15:40 -
+Rule   sol88   1988    only    -       Nov     14      11:44:30s 0:15:30 -
+Rule   sol88   1988    only    -       Nov     15      11:44:40s 0:15:20 -
+Rule   sol88   1988    only    -       Nov     16      11:44:50s 0:15:10 -
+Rule   sol88   1988    only    -       Nov     17      11:45:00s 0:15:00 -
+Rule   sol88   1988    only    -       Nov     18      11:45:15s 0:14:45 -
+Rule   sol88   1988    only    -       Nov     19      11:45:25s 0:14:35 -
+Rule   sol88   1988    only    -       Nov     20      11:45:40s 0:14:20 -
+Rule   sol88   1988    only    -       Nov     21      11:45:55s 0:14:05 -
+Rule   sol88   1988    only    -       Nov     22      11:46:10s 0:13:50 -
+Rule   sol88   1988    only    -       Nov     23      11:46:30s 0:13:30 -
+Rule   sol88   1988    only    -       Nov     24      11:46:45s 0:13:15 -
+Rule   sol88   1988    only    -       Nov     25      11:47:05s 0:12:55 -
+Rule   sol88   1988    only    -       Nov     26      11:47:20s 0:12:40 -
+Rule   sol88   1988    only    -       Nov     27      11:47:40s 0:12:20 -
+Rule   sol88   1988    only    -       Nov     28      11:48:00s 0:12:00 -
+Rule   sol88   1988    only    -       Nov     29      11:48:25s 0:11:35 -
+Rule   sol88   1988    only    -       Nov     30      11:48:45s 0:11:15 -
+Rule   sol88   1988    only    -       Dec     1       11:49:05s 0:10:55 -
+Rule   sol88   1988    only    -       Dec     2       11:49:30s 0:10:30 -
+Rule   sol88   1988    only    -       Dec     3       11:49:55s 0:10:05 -
+Rule   sol88   1988    only    -       Dec     4       11:50:15s 0:09:45 -
+Rule   sol88   1988    only    -       Dec     5       11:50:40s 0:09:20 -
+Rule   sol88   1988    only    -       Dec     6       11:51:05s 0:08:55 -
+Rule   sol88   1988    only    -       Dec     7       11:51:35s 0:08:25 -
+Rule   sol88   1988    only    -       Dec     8       11:52:00s 0:08:00 -
+Rule   sol88   1988    only    -       Dec     9       11:52:25s 0:07:35 -
+Rule   sol88   1988    only    -       Dec     10      11:52:55s 0:07:05 -
+Rule   sol88   1988    only    -       Dec     11      11:53:20s 0:06:40 -
+Rule   sol88   1988    only    -       Dec     12      11:53:50s 0:06:10 -
+Rule   sol88   1988    only    -       Dec     13      11:54:15s 0:05:45 -
+Rule   sol88   1988    only    -       Dec     14      11:54:45s 0:05:15 -
+Rule   sol88   1988    only    -       Dec     15      11:55:15s 0:04:45 -
+Rule   sol88   1988    only    -       Dec     16      11:55:45s 0:04:15 -
+Rule   sol88   1988    only    -       Dec     17      11:56:15s 0:03:45 -
+Rule   sol88   1988    only    -       Dec     18      11:56:40s 0:03:20 -
+Rule   sol88   1988    only    -       Dec     19      11:57:10s 0:02:50 -
+Rule   sol88   1988    only    -       Dec     20      11:57:40s 0:02:20 -
+Rule   sol88   1988    only    -       Dec     21      11:58:10s 0:01:50 -
+Rule   sol88   1988    only    -       Dec     22      11:58:40s 0:01:20 -
+Rule   sol88   1988    only    -       Dec     23      11:59:10s 0:00:50 -
+Rule   sol88   1988    only    -       Dec     24      11:59:40s 0:00:20 -
+Rule   sol88   1988    only    -       Dec     25      12:00:10s -0:00:10 -
+Rule   sol88   1988    only    -       Dec     26      12:00:40s -0:00:40 -
+Rule   sol88   1988    only    -       Dec     27      12:01:10s -0:01:10 -
+Rule   sol88   1988    only    -       Dec     28      12:01:40s -0:01:40 -
+Rule   sol88   1988    only    -       Dec     29      12:02:10s -0:02:10 -
+Rule   sol88   1988    only    -       Dec     30      12:02:35s -0:02:35 -
+Rule   sol88   1988    only    -       Dec     31      12:03:05s -0:03:05 -
+
+# Riyadh is at about 46 degrees 46 minutes East:  3 hrs, 7 mins, 4 secs
+# Before and after 1988, we'll operate on local mean solar time.
+
+# Zone NAME            GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+Zone   Asia/Riyadh88   3:07:04 -               zzz     1988
+                       3:07:04 sol88           zzz     1989
+                       3:07:04 -               zzz
+# For backward compatibility...
+Link   Asia/Riyadh88   Mideast/Riyadh88
diff --git a/commands/zoneinfo/solar89 b/commands/zoneinfo/solar89
new file mode 100644 (file)
index 0000000..8c48531
--- /dev/null
@@ -0,0 +1,393 @@
+# @(#)solar89  8.1
+
+# Apparent noon times below are for Riyadh; they're a bit off for other places.
+# Times were computed using a formula provided by the U. S. Naval Observatory:
+#      eqt = -105.8 * sin(l) + 596.2 * sin(2 * l) + 4.4 * sin(3 * l)
+#              -12.7 * sin(4 * l) - 429.0 * cos(l) - 2.1 * cos (2 * l)
+#              + 19.3 * cos(3 * l);
+# where l is the "mean longitude of the Sun" given by
+#      l = 279.642 degrees + 0.985647 * d
+# and d is the interval in days from January 0, 0 hours Universal Time
+# (equaling the day of the year plus the fraction of a day from zero hours).
+# The accuracy of the formula is plus or minus three seconds.
+#
+# Rounding to the nearest five seconds results in fewer than
+# 256 different "time types"--a limit that's faced because time types are
+# stored on disk as unsigned chars.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   sol89   1989    only    -       Jan     1       12:03:35s -0:03:35 -
+Rule   sol89   1989    only    -       Jan     2       12:04:05s -0:04:05 -
+Rule   sol89   1989    only    -       Jan     3       12:04:30s -0:04:30 -
+Rule   sol89   1989    only    -       Jan     4       12:05:00s -0:05:00 -
+Rule   sol89   1989    only    -       Jan     5       12:05:25s -0:05:25 -
+Rule   sol89   1989    only    -       Jan     6       12:05:50s -0:05:50 -
+Rule   sol89   1989    only    -       Jan     7       12:06:15s -0:06:15 -
+Rule   sol89   1989    only    -       Jan     8       12:06:45s -0:06:45 -
+Rule   sol89   1989    only    -       Jan     9       12:07:10s -0:07:10 -
+Rule   sol89   1989    only    -       Jan     10      12:07:35s -0:07:35 -
+Rule   sol89   1989    only    -       Jan     11      12:07:55s -0:07:55 -
+Rule   sol89   1989    only    -       Jan     12      12:08:20s -0:08:20 -
+Rule   sol89   1989    only    -       Jan     13      12:08:45s -0:08:45 -
+Rule   sol89   1989    only    -       Jan     14      12:09:05s -0:09:05 -
+Rule   sol89   1989    only    -       Jan     15      12:09:25s -0:09:25 -
+Rule   sol89   1989    only    -       Jan     16      12:09:45s -0:09:45 -
+Rule   sol89   1989    only    -       Jan     17      12:10:05s -0:10:05 -
+Rule   sol89   1989    only    -       Jan     18      12:10:25s -0:10:25 -
+Rule   sol89   1989    only    -       Jan     19      12:10:45s -0:10:45 -
+Rule   sol89   1989    only    -       Jan     20      12:11:05s -0:11:05 -
+Rule   sol89   1989    only    -       Jan     21      12:11:20s -0:11:20 -
+Rule   sol89   1989    only    -       Jan     22      12:11:35s -0:11:35 -
+Rule   sol89   1989    only    -       Jan     23      12:11:55s -0:11:55 -
+Rule   sol89   1989    only    -       Jan     24      12:12:10s -0:12:10 -
+Rule   sol89   1989    only    -       Jan     25      12:12:20s -0:12:20 -
+Rule   sol89   1989    only    -       Jan     26      12:12:35s -0:12:35 -
+Rule   sol89   1989    only    -       Jan     27      12:12:50s -0:12:50 -
+Rule   sol89   1989    only    -       Jan     28      12:13:00s -0:13:00 -
+Rule   sol89   1989    only    -       Jan     29      12:13:10s -0:13:10 -
+Rule   sol89   1989    only    -       Jan     30      12:13:20s -0:13:20 -
+Rule   sol89   1989    only    -       Jan     31      12:13:30s -0:13:30 -
+Rule   sol89   1989    only    -       Feb     1       12:13:40s -0:13:40 -
+Rule   sol89   1989    only    -       Feb     2       12:13:45s -0:13:45 -
+Rule   sol89   1989    only    -       Feb     3       12:13:55s -0:13:55 -
+Rule   sol89   1989    only    -       Feb     4       12:14:00s -0:14:00 -
+Rule   sol89   1989    only    -       Feb     5       12:14:05s -0:14:05 -
+Rule   sol89   1989    only    -       Feb     6       12:14:10s -0:14:10 -
+Rule   sol89   1989    only    -       Feb     7       12:14:10s -0:14:10 -
+Rule   sol89   1989    only    -       Feb     8       12:14:15s -0:14:15 -
+Rule   sol89   1989    only    -       Feb     9       12:14:15s -0:14:15 -
+Rule   sol89   1989    only    -       Feb     10      12:14:20s -0:14:20 -
+Rule   sol89   1989    only    -       Feb     11      12:14:20s -0:14:20 -
+Rule   sol89   1989    only    -       Feb     12      12:14:20s -0:14:20 -
+Rule   sol89   1989    only    -       Feb     13      12:14:15s -0:14:15 -
+Rule   sol89   1989    only    -       Feb     14      12:14:15s -0:14:15 -
+Rule   sol89   1989    only    -       Feb     15      12:14:10s -0:14:10 -
+Rule   sol89   1989    only    -       Feb     16      12:14:10s -0:14:10 -
+Rule   sol89   1989    only    -       Feb     17      12:14:05s -0:14:05 -
+Rule   sol89   1989    only    -       Feb     18      12:14:00s -0:14:00 -
+Rule   sol89   1989    only    -       Feb     19      12:13:55s -0:13:55 -
+Rule   sol89   1989    only    -       Feb     20      12:13:50s -0:13:50 -
+Rule   sol89   1989    only    -       Feb     21      12:13:40s -0:13:40 -
+Rule   sol89   1989    only    -       Feb     22      12:13:35s -0:13:35 -
+Rule   sol89   1989    only    -       Feb     23      12:13:25s -0:13:25 -
+Rule   sol89   1989    only    -       Feb     24      12:13:15s -0:13:15 -
+Rule   sol89   1989    only    -       Feb     25      12:13:05s -0:13:05 -
+Rule   sol89   1989    only    -       Feb     26      12:12:55s -0:12:55 -
+Rule   sol89   1989    only    -       Feb     27      12:12:45s -0:12:45 -
+Rule   sol89   1989    only    -       Feb     28      12:12:35s -0:12:35 -
+Rule   sol89   1989    only    -       Mar     1       12:12:25s -0:12:25 -
+Rule   sol89   1989    only    -       Mar     2       12:12:10s -0:12:10 -
+Rule   sol89   1989    only    -       Mar     3       12:12:00s -0:12:00 -
+Rule   sol89   1989    only    -       Mar     4       12:11:45s -0:11:45 -
+Rule   sol89   1989    only    -       Mar     5       12:11:35s -0:11:35 -
+Rule   sol89   1989    only    -       Mar     6       12:11:20s -0:11:20 -
+Rule   sol89   1989    only    -       Mar     7       12:11:05s -0:11:05 -
+Rule   sol89   1989    only    -       Mar     8       12:10:50s -0:10:50 -
+Rule   sol89   1989    only    -       Mar     9       12:10:35s -0:10:35 -
+Rule   sol89   1989    only    -       Mar     10      12:10:20s -0:10:20 -
+Rule   sol89   1989    only    -       Mar     11      12:10:05s -0:10:05 -
+Rule   sol89   1989    only    -       Mar     12      12:09:50s -0:09:50 -
+Rule   sol89   1989    only    -       Mar     13      12:09:30s -0:09:30 -
+Rule   sol89   1989    only    -       Mar     14      12:09:15s -0:09:15 -
+Rule   sol89   1989    only    -       Mar     15      12:09:00s -0:09:00 -
+Rule   sol89   1989    only    -       Mar     16      12:08:40s -0:08:40 -
+Rule   sol89   1989    only    -       Mar     17      12:08:25s -0:08:25 -
+Rule   sol89   1989    only    -       Mar     18      12:08:05s -0:08:05 -
+Rule   sol89   1989    only    -       Mar     19      12:07:50s -0:07:50 -
+Rule   sol89   1989    only    -       Mar     20      12:07:30s -0:07:30 -
+Rule   sol89   1989    only    -       Mar     21      12:07:15s -0:07:15 -
+Rule   sol89   1989    only    -       Mar     22      12:06:55s -0:06:55 -
+Rule   sol89   1989    only    -       Mar     23      12:06:35s -0:06:35 -
+Rule   sol89   1989    only    -       Mar     24      12:06:20s -0:06:20 -
+Rule   sol89   1989    only    -       Mar     25      12:06:00s -0:06:00 -
+Rule   sol89   1989    only    -       Mar     26      12:05:40s -0:05:40 -
+Rule   sol89   1989    only    -       Mar     27      12:05:25s -0:05:25 -
+Rule   sol89   1989    only    -       Mar     28      12:05:05s -0:05:05 -
+Rule   sol89   1989    only    -       Mar     29      12:04:50s -0:04:50 -
+Rule   sol89   1989    only    -       Mar     30      12:04:30s -0:04:30 -
+Rule   sol89   1989    only    -       Mar     31      12:04:10s -0:04:10 -
+Rule   sol89   1989    only    -       Apr     1       12:03:55s -0:03:55 -
+Rule   sol89   1989    only    -       Apr     2       12:03:35s -0:03:35 -
+Rule   sol89   1989    only    -       Apr     3       12:03:20s -0:03:20 -
+Rule   sol89   1989    only    -       Apr     4       12:03:00s -0:03:00 -
+Rule   sol89   1989    only    -       Apr     5       12:02:45s -0:02:45 -
+Rule   sol89   1989    only    -       Apr     6       12:02:25s -0:02:25 -
+Rule   sol89   1989    only    -       Apr     7       12:02:10s -0:02:10 -
+Rule   sol89   1989    only    -       Apr     8       12:01:50s -0:01:50 -
+Rule   sol89   1989    only    -       Apr     9       12:01:35s -0:01:35 -
+Rule   sol89   1989    only    -       Apr     10      12:01:20s -0:01:20 -
+Rule   sol89   1989    only    -       Apr     11      12:01:05s -0:01:05 -
+Rule   sol89   1989    only    -       Apr     12      12:00:50s -0:00:50 -
+Rule   sol89   1989    only    -       Apr     13      12:00:35s -0:00:35 -
+Rule   sol89   1989    only    -       Apr     14      12:00:20s -0:00:20 -
+Rule   sol89   1989    only    -       Apr     15      12:00:05s -0:00:05 -
+Rule   sol89   1989    only    -       Apr     16      11:59:50s 0:00:10 -
+Rule   sol89   1989    only    -       Apr     17      11:59:35s 0:00:25 -
+Rule   sol89   1989    only    -       Apr     18      11:59:20s 0:00:40 -
+Rule   sol89   1989    only    -       Apr     19      11:59:10s 0:00:50 -
+Rule   sol89   1989    only    -       Apr     20      11:58:55s 0:01:05 -
+Rule   sol89   1989    only    -       Apr     21      11:58:45s 0:01:15 -
+Rule   sol89   1989    only    -       Apr     22      11:58:30s 0:01:30 -
+Rule   sol89   1989    only    -       Apr     23      11:58:20s 0:01:40 -
+Rule   sol89   1989    only    -       Apr     24      11:58:10s 0:01:50 -
+Rule   sol89   1989    only    -       Apr     25      11:58:00s 0:02:00 -
+Rule   sol89   1989    only    -       Apr     26      11:57:50s 0:02:10 -
+Rule   sol89   1989    only    -       Apr     27      11:57:40s 0:02:20 -
+Rule   sol89   1989    only    -       Apr     28      11:57:30s 0:02:30 -
+Rule   sol89   1989    only    -       Apr     29      11:57:20s 0:02:40 -
+Rule   sol89   1989    only    -       Apr     30      11:57:15s 0:02:45 -
+Rule   sol89   1989    only    -       May     1       11:57:05s 0:02:55 -
+Rule   sol89   1989    only    -       May     2       11:57:00s 0:03:00 -
+Rule   sol89   1989    only    -       May     3       11:56:50s 0:03:10 -
+Rule   sol89   1989    only    -       May     4       11:56:45s 0:03:15 -
+Rule   sol89   1989    only    -       May     5       11:56:40s 0:03:20 -
+Rule   sol89   1989    only    -       May     6       11:56:35s 0:03:25 -
+Rule   sol89   1989    only    -       May     7       11:56:30s 0:03:30 -
+Rule   sol89   1989    only    -       May     8       11:56:30s 0:03:30 -
+Rule   sol89   1989    only    -       May     9       11:56:25s 0:03:35 -
+Rule   sol89   1989    only    -       May     10      11:56:25s 0:03:35 -
+Rule   sol89   1989    only    -       May     11      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     12      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     13      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     14      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     15      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     16      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     17      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       May     18      11:56:25s 0:03:35 -
+Rule   sol89   1989    only    -       May     19      11:56:25s 0:03:35 -
+Rule   sol89   1989    only    -       May     20      11:56:30s 0:03:30 -
+Rule   sol89   1989    only    -       May     21      11:56:35s 0:03:25 -
+Rule   sol89   1989    only    -       May     22      11:56:35s 0:03:25 -
+Rule   sol89   1989    only    -       May     23      11:56:40s 0:03:20 -
+Rule   sol89   1989    only    -       May     24      11:56:45s 0:03:15 -
+Rule   sol89   1989    only    -       May     25      11:56:55s 0:03:05 -
+Rule   sol89   1989    only    -       May     26      11:57:00s 0:03:00 -
+Rule   sol89   1989    only    -       May     27      11:57:05s 0:02:55 -
+Rule   sol89   1989    only    -       May     28      11:57:15s 0:02:45 -
+Rule   sol89   1989    only    -       May     29      11:57:20s 0:02:40 -
+Rule   sol89   1989    only    -       May     30      11:57:30s 0:02:30 -
+Rule   sol89   1989    only    -       May     31      11:57:35s 0:02:25 -
+Rule   sol89   1989    only    -       Jun     1       11:57:45s 0:02:15 -
+Rule   sol89   1989    only    -       Jun     2       11:57:55s 0:02:05 -
+Rule   sol89   1989    only    -       Jun     3       11:58:05s 0:01:55 -
+Rule   sol89   1989    only    -       Jun     4       11:58:15s 0:01:45 -
+Rule   sol89   1989    only    -       Jun     5       11:58:25s 0:01:35 -
+Rule   sol89   1989    only    -       Jun     6       11:58:35s 0:01:25 -
+Rule   sol89   1989    only    -       Jun     7       11:58:45s 0:01:15 -
+Rule   sol89   1989    only    -       Jun     8       11:59:00s 0:01:00 -
+Rule   sol89   1989    only    -       Jun     9       11:59:10s 0:00:50 -
+Rule   sol89   1989    only    -       Jun     10      11:59:20s 0:00:40 -
+Rule   sol89   1989    only    -       Jun     11      11:59:35s 0:00:25 -
+Rule   sol89   1989    only    -       Jun     12      11:59:45s 0:00:15 -
+Rule   sol89   1989    only    -       Jun     13      12:00:00s 0:00:00 -
+Rule   sol89   1989    only    -       Jun     14      12:00:10s -0:00:10 -
+Rule   sol89   1989    only    -       Jun     15      12:00:25s -0:00:25 -
+Rule   sol89   1989    only    -       Jun     16      12:00:35s -0:00:35 -
+Rule   sol89   1989    only    -       Jun     17      12:00:50s -0:00:50 -
+Rule   sol89   1989    only    -       Jun     18      12:01:05s -0:01:05 -
+Rule   sol89   1989    only    -       Jun     19      12:01:15s -0:01:15 -
+Rule   sol89   1989    only    -       Jun     20      12:01:30s -0:01:30 -
+Rule   sol89   1989    only    -       Jun     21      12:01:40s -0:01:40 -
+Rule   sol89   1989    only    -       Jun     22      12:01:55s -0:01:55 -
+Rule   sol89   1989    only    -       Jun     23      12:02:10s -0:02:10 -
+Rule   sol89   1989    only    -       Jun     24      12:02:20s -0:02:20 -
+Rule   sol89   1989    only    -       Jun     25      12:02:35s -0:02:35 -
+Rule   sol89   1989    only    -       Jun     26      12:02:45s -0:02:45 -
+Rule   sol89   1989    only    -       Jun     27      12:03:00s -0:03:00 -
+Rule   sol89   1989    only    -       Jun     28      12:03:10s -0:03:10 -
+Rule   sol89   1989    only    -       Jun     29      12:03:25s -0:03:25 -
+Rule   sol89   1989    only    -       Jun     30      12:03:35s -0:03:35 -
+Rule   sol89   1989    only    -       Jul     1       12:03:45s -0:03:45 -
+Rule   sol89   1989    only    -       Jul     2       12:04:00s -0:04:00 -
+Rule   sol89   1989    only    -       Jul     3       12:04:10s -0:04:10 -
+Rule   sol89   1989    only    -       Jul     4       12:04:20s -0:04:20 -
+Rule   sol89   1989    only    -       Jul     5       12:04:30s -0:04:30 -
+Rule   sol89   1989    only    -       Jul     6       12:04:40s -0:04:40 -
+Rule   sol89   1989    only    -       Jul     7       12:04:50s -0:04:50 -
+Rule   sol89   1989    only    -       Jul     8       12:05:00s -0:05:00 -
+Rule   sol89   1989    only    -       Jul     9       12:05:10s -0:05:10 -
+Rule   sol89   1989    only    -       Jul     10      12:05:20s -0:05:20 -
+Rule   sol89   1989    only    -       Jul     11      12:05:25s -0:05:25 -
+Rule   sol89   1989    only    -       Jul     12      12:05:35s -0:05:35 -
+Rule   sol89   1989    only    -       Jul     13      12:05:40s -0:05:40 -
+Rule   sol89   1989    only    -       Jul     14      12:05:50s -0:05:50 -
+Rule   sol89   1989    only    -       Jul     15      12:05:55s -0:05:55 -
+Rule   sol89   1989    only    -       Jul     16      12:06:00s -0:06:00 -
+Rule   sol89   1989    only    -       Jul     17      12:06:05s -0:06:05 -
+Rule   sol89   1989    only    -       Jul     18      12:06:10s -0:06:10 -
+Rule   sol89   1989    only    -       Jul     19      12:06:15s -0:06:15 -
+Rule   sol89   1989    only    -       Jul     20      12:06:20s -0:06:20 -
+Rule   sol89   1989    only    -       Jul     21      12:06:20s -0:06:20 -
+Rule   sol89   1989    only    -       Jul     22      12:06:25s -0:06:25 -
+Rule   sol89   1989    only    -       Jul     23      12:06:25s -0:06:25 -
+Rule   sol89   1989    only    -       Jul     24      12:06:30s -0:06:30 -
+Rule   sol89   1989    only    -       Jul     25      12:06:30s -0:06:30 -
+Rule   sol89   1989    only    -       Jul     26      12:06:30s -0:06:30 -
+Rule   sol89   1989    only    -       Jul     27      12:06:30s -0:06:30 -
+Rule   sol89   1989    only    -       Jul     28      12:06:30s -0:06:30 -
+Rule   sol89   1989    only    -       Jul     29      12:06:25s -0:06:25 -
+Rule   sol89   1989    only    -       Jul     30      12:06:25s -0:06:25 -
+Rule   sol89   1989    only    -       Jul     31      12:06:20s -0:06:20 -
+Rule   sol89   1989    only    -       Aug     1       12:06:20s -0:06:20 -
+Rule   sol89   1989    only    -       Aug     2       12:06:15s -0:06:15 -
+Rule   sol89   1989    only    -       Aug     3       12:06:10s -0:06:10 -
+Rule   sol89   1989    only    -       Aug     4       12:06:05s -0:06:05 -
+Rule   sol89   1989    only    -       Aug     5       12:06:00s -0:06:00 -
+Rule   sol89   1989    only    -       Aug     6       12:05:50s -0:05:50 -
+Rule   sol89   1989    only    -       Aug     7       12:05:45s -0:05:45 -
+Rule   sol89   1989    only    -       Aug     8       12:05:35s -0:05:35 -
+Rule   sol89   1989    only    -       Aug     9       12:05:30s -0:05:30 -
+Rule   sol89   1989    only    -       Aug     10      12:05:20s -0:05:20 -
+Rule   sol89   1989    only    -       Aug     11      12:05:10s -0:05:10 -
+Rule   sol89   1989    only    -       Aug     12      12:05:00s -0:05:00 -
+Rule   sol89   1989    only    -       Aug     13      12:04:50s -0:04:50 -
+Rule   sol89   1989    only    -       Aug     14      12:04:40s -0:04:40 -
+Rule   sol89   1989    only    -       Aug     15      12:04:30s -0:04:30 -
+Rule   sol89   1989    only    -       Aug     16      12:04:15s -0:04:15 -
+Rule   sol89   1989    only    -       Aug     17      12:04:05s -0:04:05 -
+Rule   sol89   1989    only    -       Aug     18      12:03:50s -0:03:50 -
+Rule   sol89   1989    only    -       Aug     19      12:03:35s -0:03:35 -
+Rule   sol89   1989    only    -       Aug     20      12:03:25s -0:03:25 -
+Rule   sol89   1989    only    -       Aug     21      12:03:10s -0:03:10 -
+Rule   sol89   1989    only    -       Aug     22      12:02:55s -0:02:55 -
+Rule   sol89   1989    only    -       Aug     23      12:02:40s -0:02:40 -
+Rule   sol89   1989    only    -       Aug     24      12:02:20s -0:02:20 -
+Rule   sol89   1989    only    -       Aug     25      12:02:05s -0:02:05 -
+Rule   sol89   1989    only    -       Aug     26      12:01:50s -0:01:50 -
+Rule   sol89   1989    only    -       Aug     27      12:01:30s -0:01:30 -
+Rule   sol89   1989    only    -       Aug     28      12:01:15s -0:01:15 -
+Rule   sol89   1989    only    -       Aug     29      12:00:55s -0:00:55 -
+Rule   sol89   1989    only    -       Aug     30      12:00:40s -0:00:40 -
+Rule   sol89   1989    only    -       Aug     31      12:00:20s -0:00:20 -
+Rule   sol89   1989    only    -       Sep     1       12:00:00s 0:00:00 -
+Rule   sol89   1989    only    -       Sep     2       11:59:45s 0:00:15 -
+Rule   sol89   1989    only    -       Sep     3       11:59:25s 0:00:35 -
+Rule   sol89   1989    only    -       Sep     4       11:59:05s 0:00:55 -
+Rule   sol89   1989    only    -       Sep     5       11:58:45s 0:01:15 -
+Rule   sol89   1989    only    -       Sep     6       11:58:25s 0:01:35 -
+Rule   sol89   1989    only    -       Sep     7       11:58:05s 0:01:55 -
+Rule   sol89   1989    only    -       Sep     8       11:57:45s 0:02:15 -
+Rule   sol89   1989    only    -       Sep     9       11:57:20s 0:02:40 -
+Rule   sol89   1989    only    -       Sep     10      11:57:00s 0:03:00 -
+Rule   sol89   1989    only    -       Sep     11      11:56:40s 0:03:20 -
+Rule   sol89   1989    only    -       Sep     12      11:56:20s 0:03:40 -
+Rule   sol89   1989    only    -       Sep     13      11:56:00s 0:04:00 -
+Rule   sol89   1989    only    -       Sep     14      11:55:35s 0:04:25 -
+Rule   sol89   1989    only    -       Sep     15      11:55:15s 0:04:45 -
+Rule   sol89   1989    only    -       Sep     16      11:54:55s 0:05:05 -
+Rule   sol89   1989    only    -       Sep     17      11:54:35s 0:05:25 -
+Rule   sol89   1989    only    -       Sep     18      11:54:10s 0:05:50 -
+Rule   sol89   1989    only    -       Sep     19      11:53:50s 0:06:10 -
+Rule   sol89   1989    only    -       Sep     20      11:53:30s 0:06:30 -
+Rule   sol89   1989    only    -       Sep     21      11:53:10s 0:06:50 -
+Rule   sol89   1989    only    -       Sep     22      11:52:45s 0:07:15 -
+Rule   sol89   1989    only    -       Sep     23      11:52:25s 0:07:35 -
+Rule   sol89   1989    only    -       Sep     24      11:52:05s 0:07:55 -
+Rule   sol89   1989    only    -       Sep     25      11:51:45s 0:08:15 -
+Rule   sol89   1989    only    -       Sep     26      11:51:25s 0:08:35 -
+Rule   sol89   1989    only    -       Sep     27      11:51:05s 0:08:55 -
+Rule   sol89   1989    only    -       Sep     28      11:50:40s 0:09:20 -
+Rule   sol89   1989    only    -       Sep     29      11:50:20s 0:09:40 -
+Rule   sol89   1989    only    -       Sep     30      11:50:00s 0:10:00 -
+Rule   sol89   1989    only    -       Oct     1       11:49:45s 0:10:15 -
+Rule   sol89   1989    only    -       Oct     2       11:49:25s 0:10:35 -
+Rule   sol89   1989    only    -       Oct     3       11:49:05s 0:10:55 -
+Rule   sol89   1989    only    -       Oct     4       11:48:45s 0:11:15 -
+Rule   sol89   1989    only    -       Oct     5       11:48:30s 0:11:30 -
+Rule   sol89   1989    only    -       Oct     6       11:48:10s 0:11:50 -
+Rule   sol89   1989    only    -       Oct     7       11:47:50s 0:12:10 -
+Rule   sol89   1989    only    -       Oct     8       11:47:35s 0:12:25 -
+Rule   sol89   1989    only    -       Oct     9       11:47:20s 0:12:40 -
+Rule   sol89   1989    only    -       Oct     10      11:47:00s 0:13:00 -
+Rule   sol89   1989    only    -       Oct     11      11:46:45s 0:13:15 -
+Rule   sol89   1989    only    -       Oct     12      11:46:30s 0:13:30 -
+Rule   sol89   1989    only    -       Oct     13      11:46:15s 0:13:45 -
+Rule   sol89   1989    only    -       Oct     14      11:46:00s 0:14:00 -
+Rule   sol89   1989    only    -       Oct     15      11:45:50s 0:14:10 -
+Rule   sol89   1989    only    -       Oct     16      11:45:35s 0:14:25 -
+Rule   sol89   1989    only    -       Oct     17      11:45:20s 0:14:40 -
+Rule   sol89   1989    only    -       Oct     18      11:45:10s 0:14:50 -
+Rule   sol89   1989    only    -       Oct     19      11:45:00s 0:15:00 -
+Rule   sol89   1989    only    -       Oct     20      11:44:50s 0:15:10 -
+Rule   sol89   1989    only    -       Oct     21      11:44:40s 0:15:20 -
+Rule   sol89   1989    only    -       Oct     22      11:44:30s 0:15:30 -
+Rule   sol89   1989    only    -       Oct     23      11:44:20s 0:15:40 -
+Rule   sol89   1989    only    -       Oct     24      11:44:10s 0:15:50 -
+Rule   sol89   1989    only    -       Oct     25      11:44:05s 0:15:55 -
+Rule   sol89   1989    only    -       Oct     26      11:44:00s 0:16:00 -
+Rule   sol89   1989    only    -       Oct     27      11:43:50s 0:16:10 -
+Rule   sol89   1989    only    -       Oct     28      11:43:45s 0:16:15 -
+Rule   sol89   1989    only    -       Oct     29      11:43:40s 0:16:20 -
+Rule   sol89   1989    only    -       Oct     30      11:43:40s 0:16:20 -
+Rule   sol89   1989    only    -       Oct     31      11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     1       11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     2       11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     3       11:43:30s 0:16:30 -
+Rule   sol89   1989    only    -       Nov     4       11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     5       11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     6       11:43:35s 0:16:25 -
+Rule   sol89   1989    only    -       Nov     7       11:43:40s 0:16:20 -
+Rule   sol89   1989    only    -       Nov     8       11:43:45s 0:16:15 -
+Rule   sol89   1989    only    -       Nov     9       11:43:50s 0:16:10 -
+Rule   sol89   1989    only    -       Nov     10      11:43:55s 0:16:05 -
+Rule   sol89   1989    only    -       Nov     11      11:44:00s 0:16:00 -
+Rule   sol89   1989    only    -       Nov     12      11:44:05s 0:15:55 -
+Rule   sol89   1989    only    -       Nov     13      11:44:15s 0:15:45 -
+Rule   sol89   1989    only    -       Nov     14      11:44:25s 0:15:35 -
+Rule   sol89   1989    only    -       Nov     15      11:44:35s 0:15:25 -
+Rule   sol89   1989    only    -       Nov     16      11:44:45s 0:15:15 -
+Rule   sol89   1989    only    -       Nov     17      11:44:55s 0:15:05 -
+Rule   sol89   1989    only    -       Nov     18      11:45:10s 0:14:50 -
+Rule   sol89   1989    only    -       Nov     19      11:45:20s 0:14:40 -
+Rule   sol89   1989    only    -       Nov     20      11:45:35s 0:14:25 -
+Rule   sol89   1989    only    -       Nov     21      11:45:50s 0:14:10 -
+Rule   sol89   1989    only    -       Nov     22      11:46:05s 0:13:55 -
+Rule   sol89   1989    only    -       Nov     23      11:46:25s 0:13:35 -
+Rule   sol89   1989    only    -       Nov     24      11:46:40s 0:13:20 -
+Rule   sol89   1989    only    -       Nov     25      11:47:00s 0:13:00 -
+Rule   sol89   1989    only    -       Nov     26      11:47:20s 0:12:40 -
+Rule   sol89   1989    only    -       Nov     27      11:47:35s 0:12:25 -
+Rule   sol89   1989    only    -       Nov     28      11:47:55s 0:12:05 -
+Rule   sol89   1989    only    -       Nov     29      11:48:20s 0:11:40 -
+Rule   sol89   1989    only    -       Nov     30      11:48:40s 0:11:20 -
+Rule   sol89   1989    only    -       Dec     1       11:49:00s 0:11:00 -
+Rule   sol89   1989    only    -       Dec     2       11:49:25s 0:10:35 -
+Rule   sol89   1989    only    -       Dec     3       11:49:50s 0:10:10 -
+Rule   sol89   1989    only    -       Dec     4       11:50:15s 0:09:45 -
+Rule   sol89   1989    only    -       Dec     5       11:50:35s 0:09:25 -
+Rule   sol89   1989    only    -       Dec     6       11:51:00s 0:09:00 -
+Rule   sol89   1989    only    -       Dec     7       11:51:30s 0:08:30 -
+Rule   sol89   1989    only    -       Dec     8       11:51:55s 0:08:05 -
+Rule   sol89   1989    only    -       Dec     9       11:52:20s 0:07:40 -
+Rule   sol89   1989    only    -       Dec     10      11:52:50s 0:07:10 -
+Rule   sol89   1989    only    -       Dec     11      11:53:15s 0:06:45 -
+Rule   sol89   1989    only    -       Dec     12      11:53:45s 0:06:15 -
+Rule   sol89   1989    only    -       Dec     13      11:54:10s 0:05:50 -
+Rule   sol89   1989    only    -       Dec     14      11:54:40s 0:05:20 -
+Rule   sol89   1989    only    -       Dec     15      11:55:10s 0:04:50 -
+Rule   sol89   1989    only    -       Dec     16      11:55:40s 0:04:20 -
+Rule   sol89   1989    only    -       Dec     17      11:56:05s 0:03:55 -
+Rule   sol89   1989    only    -       Dec     18      11:56:35s 0:03:25 -
+Rule   sol89   1989    only    -       Dec     19      11:57:05s 0:02:55 -
+Rule   sol89   1989    only    -       Dec     20      11:57:35s 0:02:25 -
+Rule   sol89   1989    only    -       Dec     21      11:58:05s 0:01:55 -
+Rule   sol89   1989    only    -       Dec     22      11:58:35s 0:01:25 -
+Rule   sol89   1989    only    -       Dec     23      11:59:05s 0:00:55 -
+Rule   sol89   1989    only    -       Dec     24      11:59:35s 0:00:25 -
+Rule   sol89   1989    only    -       Dec     25      12:00:05s -0:00:05 -
+Rule   sol89   1989    only    -       Dec     26      12:00:35s -0:00:35 -
+Rule   sol89   1989    only    -       Dec     27      12:01:05s -0:01:05 -
+Rule   sol89   1989    only    -       Dec     28      12:01:35s -0:01:35 -
+Rule   sol89   1989    only    -       Dec     29      12:02:00s -0:02:00 -
+Rule   sol89   1989    only    -       Dec     30      12:02:30s -0:02:30 -
+Rule   sol89   1989    only    -       Dec     31      12:03:00s -0:03:00 -
+
+# Riyadh is at about 46 degrees 46 minutes East:  3 hrs, 7 mins, 4 secs
+# Before and after 1989, we'll operate on local mean solar time.
+
+# Zone NAME            GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+Zone   Asia/Riyadh89   3:07:04 -               zzz     1989
+                       3:07:04 sol89           zzz     1990
+                       3:07:04 -               zzz
+# For backward compatibility...
+Link   Asia/Riyadh89   Mideast/Riyadh89
diff --git a/commands/zoneinfo/southamerica b/commands/zoneinfo/southamerica
new file mode 100644 (file)
index 0000000..7aec8b6
--- /dev/null
@@ -0,0 +1,1104 @@
+# @(#)southamerica     8.11
+# <pre>
+
+# This data is by no means authoritative; if you think you know better,
+# go ahead and edit the file (and please send any changes to
+# tz@elsie.nci.nih.gov for general use in the future).
+
+# From Paul Eggert (2006-03-22):
+# A good source for time zone historical data outside the U.S. is
+# Thomas G. Shanks and Rique Pottenger, The International Atlas (6th edition),
+# San Diego: ACS Publications, Inc. (2003).
+#
+# Gwillim Law writes that a good source
+# for recent time zone data is the International Air Transport
+# Association's Standard Schedules Information Manual (IATA SSIM),
+# published semiannually.  Law sent in several helpful summaries
+# of the IATA's data after 1990.
+#
+# Except where otherwise noted, Shanks & Pottenger is the source for
+# entries through 1990, and IATA SSIM is the source for entries afterwards.
+#
+# Earlier editions of these tables used the North American style (e.g. ARST and
+# ARDT for Argentine Standard and Daylight Time), but the following quote
+# suggests that it's better to use European style (e.g. ART and ARST).
+#      I suggest the use of _Summer time_ instead of the more cumbersome
+#      _daylight-saving time_.  _Summer time_ seems to be in general use
+#      in Europe and South America.
+#      -- E O Cutler, _New York Times_ (1937-02-14), quoted in
+#      H L Mencken, _The American Language: Supplement I_ (1960), p 466
+#
+# Earlier editions of these tables also used the North American style
+# for time zones in Brazil, but this was incorrect, as Brazilians say
+# "summer time".  Reinaldo Goulart, a Sao Paulo businessman active in
+# the railroad sector, writes (1999-07-06):
+#      The subject of time zones is currently a matter of discussion/debate in
+#      Brazil.  Let's say that "the Brasilia time" is considered the
+#      "official time" because Brasilia is the capital city.
+#      The other three time zones are called "Brasilia time "minus one" or
+#      "plus one" or "plus two".  As far as I know there is no such
+#      name/designation as "Eastern Time" or "Central Time".
+# So I invented the following (English-language) abbreviations for now.
+# Corrections are welcome!
+#              std     dst
+#      -2:00   FNT     FNST    Fernando de Noronha
+#      -3:00   BRT     BRST    Brasilia
+#      -4:00   AMT     AMST    Amazon
+#      -5:00   ACT     ACST    Acre
+
+###############################################################################
+
+###############################################################################
+
+# Argentina
+
+# From Bob Devine (1988-01-28):
+# Argentina: first Sunday in October to first Sunday in April since 1976.
+# Double Summer time from 1969 to 1974.  Switches at midnight.
+
+# From U. S. Naval Observatory (1988-01-199):
+# ARGENTINA           3 H BEHIND   UTC
+
+# From Hernan G. Otero (1995-06-26):
+# I am sending modifications to the Argentine time zone table...
+# AR was chosen because they are the ISO letters that represent Argentina.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Arg     1930    only    -       Dec      1      0:00    1:00    S
+Rule   Arg     1931    only    -       Apr      1      0:00    0       -
+Rule   Arg     1931    only    -       Oct     15      0:00    1:00    S
+Rule   Arg     1932    1940    -       Mar      1      0:00    0       -
+Rule   Arg     1932    1939    -       Nov      1      0:00    1:00    S
+Rule   Arg     1940    only    -       Jul      1      0:00    1:00    S
+Rule   Arg     1941    only    -       Jun     15      0:00    0       -
+Rule   Arg     1941    only    -       Oct     15      0:00    1:00    S
+Rule   Arg     1943    only    -       Aug      1      0:00    0       -
+Rule   Arg     1943    only    -       Oct     15      0:00    1:00    S
+Rule   Arg     1946    only    -       Mar      1      0:00    0       -
+Rule   Arg     1946    only    -       Oct      1      0:00    1:00    S
+Rule   Arg     1963    only    -       Oct      1      0:00    0       -
+Rule   Arg     1963    only    -       Dec     15      0:00    1:00    S
+Rule   Arg     1964    1966    -       Mar      1      0:00    0       -
+Rule   Arg     1964    1966    -       Oct     15      0:00    1:00    S
+Rule   Arg     1967    only    -       Apr      2      0:00    0       -
+Rule   Arg     1967    1968    -       Oct     Sun>=1  0:00    1:00    S
+Rule   Arg     1968    1969    -       Apr     Sun>=1  0:00    0       -
+Rule   Arg     1974    only    -       Jan     23      0:00    1:00    S
+Rule   Arg     1974    only    -       May      1      0:00    0       -
+Rule   Arg     1988    only    -       Dec      1      0:00    1:00    S
+#
+# From Hernan G. Otero (1995-06-26):
+# These corrections were contributed by InterSoft Argentina S.A.,
+# obtaining the data from the:
+# Talleres de Hidrografia Naval Argentina
+# (Argentine Naval Hydrography Institute)
+Rule   Arg     1989    1993    -       Mar     Sun>=1  0:00    0       -
+Rule   Arg     1989    1992    -       Oct     Sun>=15 0:00    1:00    S
+#
+# From Hernan G. Otero (1995-06-26):
+# From this moment on, the law that mandated the daylight saving
+# time corrections was derogated and no more modifications
+# to the time zones (for daylight saving) are now made.
+#
+# From Rives McDow (2000-01-10):
+# On October 3, 1999, 0:00 local, Argentina implemented daylight savings time,
+# which did not result in the switch of a time zone, as they stayed 9 hours
+# from the International Date Line.
+Rule   Arg     1999    only    -       Oct     Sun>=1  0:00    1:00    S
+Rule   Arg     2000    only    -       Mar     Sun>=1  0:00    0       -
+#
+# From Peter Gradelski via Steffen Thorsen (2000-03-01):
+# We just checked with our Sao Paulo office and they say the government of
+# Argentina decided not to become one of the countries that go on or off DST.
+# So Buenos Aires should be -3 hours from GMT at all times.
+#
+# From Fabian L. Arce Jofre (2000-04-04):
+# The law that claimed DST for Argentina was derogated by President Fernando
+# de la Rua on March 2, 2000, because it would make people spend more energy
+# in the winter time, rather than less.  The change took effect on March 3.
+#
+# From Mariano Absatz (2001-06-06):
+# one of the major newspapers here in Argentina said that the 1999
+# Timezone Law (which never was effectively applied) will (would?) be
+# in effect.... The article is at
+# http://ar.clarin.com/diario/2001-06-06/e-01701.htm
+# ... The Law itself is "Ley No 25155", sanctioned on 1999-08-25, enacted
+# 1999-09-17, and published 1999-09-21.  The official publication is at:
+# http://www.boletin.jus.gov.ar/BON/Primera/1999/09-Septiembre/21/PDF/BO21-09-99LEG.PDF
+# Regretfully, you have to subscribe (and pay) for the on-line version....
+#
+# (2001-06-12):
+# the timezone for Argentina will not change next Sunday.
+# Apparently it will do so on Sunday 24th....
+# http://ar.clarin.com/diario/2001-06-12/s-03501.htm
+#
+# (2001-06-25):
+# Last Friday (yes, the last working day before the date of the change), the
+# Senate annulled the 1999 law that introduced the changes later postponed.
+# http://www.clarin.com.ar/diario/2001-06-22/s-03601.htm
+# It remains the vote of the Deputies..., but it will be the same....
+# This kind of things had always been done this way in Argentina.
+# We are still -03:00 all year round in all of the country.
+#
+# From Mariano Absatz (2004-05-21):
+# Today it was officially published that the Province of Mendoza is changing
+# its timezone this winter... starting tomorrow night....
+# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040521-27158-normas.pdf
+# From Paul Eggert (2004-05-24):
+# It's Law No. 7,210.  This change is due to a public power emergency, so for
+# now we'll assume it's for this year only.
+#
+# From Paul Eggert (2006-03-22):
+# <a href="http://www.spicasc.net/horvera.html">
+# Hora de verano para la Republica Argentina (2003-06-08)
+# </a> says that standard time in Argentina from 1894-10-31
+# to 1920-05-01 was -4:16:48.25.  Go with this more-precise value
+# over Shanks & Pottenger.
+#
+# From Mariano Absatz (2004-06-05):
+# These media articles from a major newspaper mostly cover the current state:
+# http://www.lanacion.com.ar/04/05/27/de_604825.asp
+# http://www.lanacion.com.ar/04/05/28/de_605203.asp
+#
+# The following eight (8) provinces pulled clocks back to UTC-04:00 at
+# midnight Monday May 31st. (that is, the night between 05/31 and 06/01).
+# Apparently, all nine provinces would go back to UTC-03:00 at the same
+# time in October 17th.
+#
+# Catamarca, Chubut, La Rioja, San Juan, San Luis, Santa Cruz,
+# Tierra del Fuego, Tucuman.
+#
+# From Mariano Absatz (2004-06-14):
+# ... this weekend, the Province of Tucuman decided it'd go back to UTC-03:00
+# yesterday midnight (that is, at 24:00 Saturday 12th), since the people's
+# annoyance with the change is much higher than the power savings obtained....
+#
+# From Gwillim Law (2004-06-14):
+# http://www.lanacion.com.ar/04/06/10/de_609078.asp ...
+#     "The time change in Tierra del Fuego was a conflicted decision from
+#   the start.  The government had decreed that the measure would take
+#   effect on June 1, but a normative error forced the new time to begin
+#   three days earlier, from a Saturday to a Sunday....
+# Our understanding was that the change was originally scheduled to take place
+# on June 1 at 00:00 in Chubut, Santa Cruz, Tierra del Fuego (and some other
+# provinces).  Sunday was May 30, only two days earlier.  So the article
+# contains a contradiction.  I would give more credence to the Saturday/Sunday
+# date than the "three days earlier" phrase, and conclude that Tierra del
+# Fuego set its clocks back at 2004-05-30 00:00.
+#
+# From Steffen Thorsen (2004-10-05):
+# The previous law 7210 which changed the province of Mendoza's time zone
+# back in May have been modified slightly in a new law 7277, which set the
+# new end date to 2004-09-26 (original date was 2004-10-17).
+# http://www.gobernac.mendoza.gov.ar/boletin/pdf/20040924-27244-normas.pdf
+#
+# From Mariano Absatz (2004-10-05):
+# San Juan changed from UTC-03:00 to UTC-04:00 at midnight between
+# Sunday, May 30th and Monday, May 31st.  It changed back to UTC-03:00
+# at midnight between Saturday, July 24th and Sunday, July 25th....
+# http://www.sanjuan.gov.ar/prensa/archivo/000329.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000426.html
+# http://www.sanjuan.gov.ar/prensa/archivo/000441.html
+
+# Unless otherwise specified, data are from Shanks & Pottenger through 1992,
+# from the IATA otherwise.  As noted below, Shanks & Pottenger say that
+# America/Cordoba split into 6 subregions during 1991/1992, but we
+# haven't verified this yet so for now we'll keep it a single region.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+#
+# Buenos Aires (BA), Capital Federal (CF),
+Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
+                       -4:16:48 -      CMT     1920 May # Cordoba Mean Time
+                       -4:00   -       ART     1930 Dec
+                       -4:00   Arg     AR%sT   1969 Oct  5
+                       -3:00   Arg     AR%sT   1999 Oct  3
+                       -4:00   Arg     AR%sT   2000 Mar  3
+                       -3:00   -       ART
+#
+# Santa Fe (SF), Entre Rios (ER), Corrientes (CN), Misiones (MN), Chaco (CC),
+# Formosa (FM), Salta (SA), Santiago del Estero (SE), Cordoba (CB),
+# San Luis (SL), La Pampa (LP), Neuquen (NQ), Rio Negro (RN)
+#
+# Shanks & Pottenger also make the following claims, which we haven't verified:
+# - Formosa switched to -3:00 on 1991-01-07.
+# - Misiones switched to -3:00 on 1990-12-29.
+# - Chaco switched to -3:00 on 1991-01-04.
+# - San Luis switched to -4:00 on 1990-03-14, then to -3:00 on 1990-10-15,
+#   then to -4:00 on 1991-03-01, then to -3:00 on 1991-06-01.
+# - Santiago del Estero switched to -4:00 on 1991-04-01,
+#   then to -3:00 on 1991-04-26.
+#
+Zone America/Argentina/Cordoba -4:16:48 - 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
+#
+# Tucuman (TM)
+Zone America/Argentina/Tucuman -4:20:52 - 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 13
+                       -3:00   -       ART
+#
+# La Rioja (LR)
+Zone America/Argentina/La_Rioja -4:27:24 - 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  1
+                       -4:00   -       WART    1991 May  7
+                       -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
+#
+# San Juan (SJ)
+Zone America/Argentina/San_Juan -4:34:04 - 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  1
+                       -4:00   -       WART    1991 May  7
+                       -3:00   Arg     AR%sT   1999 Oct  3
+                       -4:00   Arg     AR%sT   2000 Mar  3
+                       -3:00   -       ART     2004 May 31
+                       -4:00   -       WART    2004 Jul 25
+                       -3:00   -       ART
+#
+# Jujuy (JY)
+Zone America/Argentina/Jujuy -4:21:12 -        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   1990 Mar  4
+                       -4:00   -       WART    1990 Oct 28
+                       -4:00   1:00    WARST   1991 Mar 17
+                       -4:00   -       WART    1991 Oct  6
+                       -3:00   1:00    ARST    1992
+                       -3:00   Arg     AR%sT   1999 Oct  3
+                       -4:00   Arg     AR%sT   2000 Mar  3
+                       -3:00   -       ART
+#
+# Catamarca (CT), Chubut (CH)
+Zone America/Argentina/Catamarca -4:23:08 - 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
+#
+# Mendoza (MZ)
+Zone America/Argentina/Mendoza -4:35:16 - 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   1990 Mar  4
+                       -4:00   -       WART    1990 Oct 15
+                       -4:00   1:00    WARST   1991 Mar  1
+                       -4:00   -       WART    1991 Oct 15
+                       -4:00   1:00    WARST   1992 Mar  1
+                       -4:00   -       WART    1992 Oct 18
+                       -3:00   Arg     AR%sT   1999 Oct  3
+                       -4:00   Arg     AR%sT   2000 Mar  3
+                       -3:00   -       ART     2004 May 23
+                       -4:00   -       WART    2004 Sep 26
+                       -3:00   -       ART
+#
+# Santa Cruz (SC)
+Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
+                       -4:16:48 -      CMT     1920 May # Cordoba Mean Time
+                       -4:00   -       ART     1930 Dec
+                       -4:00   Arg     AR%sT   1969 Oct  5
+                       -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
+#
+# Tierra del Fuego, Antartida e Islas del Atlantico Sur (TF)
+Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
+                       -4:16:48 -      CMT     1920 May # Cordoba Mean Time
+                       -4:00   -       ART     1930 Dec
+                       -4:00   Arg     AR%sT   1969 Oct  5
+                       -3:00   Arg     AR%sT   1999 Oct  3
+                       -4:00   Arg     AR%sT   2000 Mar  3
+                       -3:00   -       ART     2004 May 30
+                       -4:00   -       WART    2004 Jun 20
+                       -3:00   -       ART
+
+# Aruba
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Aruba   -4:40:24 -      LMT     1912 Feb 12     # Oranjestad
+                       -4:30   -       ANT     1965 # Netherlands Antilles Time
+                       -4:00   -       AST
+
+# Bolivia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/La_Paz  -4:32:36 -      LMT     1890
+                       -4:32:36 -      CMT     1931 Oct 15 # Calamarca MT
+                       -4:32:36 1:00   BOST    1932 Mar 21 # Bolivia ST
+                       -4:00   -       BOT     # Bolivia Time
+
+# Brazil
+
+# From Paul Eggert (1993-11-18):
+# The mayor of Rio recently attempted to change the time zone rules
+# just in his city, in order to leave more summer time for the tourist trade.
+# The rule change lasted only part of the day;
+# the federal government refused to follow the city's rules, and business
+# was in a chaos, so the mayor backed down that afternoon.
+
+# From IATA SSIM (1996-02):
+# _Only_ the following states in BR1 observe DST: Rio Grande do Sul (RS),
+# Santa Catarina (SC), Parana (PR), Sao Paulo (SP), Rio de Janeiro (RJ),
+# Espirito Santo (ES), Minas Gerais (MG), Bahia (BA), Goias (GO),
+# Distrito Federal (DF), Tocantins (TO), Sergipe [SE] and Alagoas [AL].
+# [The last three states are new to this issue of the IATA SSIM.]
+
+# From Gwillim Law (1996-10-07):
+# Geography, history (Tocantins was part of Goias until 1989), and other
+# sources of time zone information lead me to believe that AL, SE, and TO were
+# always in BR1, and so the only change was whether or not they observed DST....
+# The earliest issue of the SSIM I have is 2/91.  Each issue from then until
+# 9/95 says that DST is observed only in the ten states I quoted from 9/95,
+# along with Mato Grosso (MT) and Mato Grosso do Sul (MS), which are in BR2
+# (UTC-4)....  The other two time zones given for Brazil are BR3, which is
+# UTC-5, no DST, and applies only in the state of Acre (AC); and BR4, which is
+# UTC-2, and applies to Fernando de Noronha (formerly FN, but I believe it's
+# become part of the state of Pernambuco).  The boundary between BR1 and BR2
+# has never been clearly stated.  They've simply been called East and West.
+# However, some conclusions can be drawn from another IATA manual: the Airline
+# Coding Directory, which lists close to 400 airports in Brazil.  For each
+# airport it gives a time zone which is coded to the SSIM.  From that
+# information, I'm led to conclude that the states of Amapa (AP), Ceara (CE),
+# Maranhao (MA), Paraiba (PR), Pernambuco (PE), Piaui (PI), and Rio Grande do
+# Norte (RN), and the eastern part of Para (PA) are all in BR1 without DST.
+
+# From Marcos Tadeu (1998-09-27):
+# <a href="http://pcdsh01.on.br/verao1.html">
+# Brazilian official page
+# </a>
+
+# From Jesper Norgaard (2000-11-03):
+# [For an official list of which regions in Brazil use which time zones, see:]
+# http://pcdsh01.on.br/Fusbr.htm
+# http://pcdsh01.on.br/Fusbrhv.htm
+
+# From Celso Doria via David Madeo (2002-10-09):
+# The reason for the delay this year has to do with elections in Brazil.
+#
+# Unlike in the United States, elections in Brazil are 100% computerized and
+# the results are known almost immediately.  Yesterday, it was the first
+# round of the elections when 115 million Brazilians voted for President,
+# Governor, Senators, Federal Deputies, and State Deputies.  Nobody is
+# counting (or re-counting) votes anymore and we know there will be a second
+# round for the Presidency and also for some Governors.  The 2nd round will
+# take place on October 27th.
+#
+# The reason why the DST will only begin November 3rd is that the thousands
+# of electoral machines used cannot have their time changed, and since the
+# Constitution says the elections must begin at 8:00 AM and end at 5:00 PM,
+# the Government decided to postpone DST, instead of changing the Constitution
+# (maybe, for the next elections, it will be possible to change the clock)...
+
+# From Rodrigo Severo (2004-10-04):
+# It's just the biannual change made necessary by the much hyped, supposedly
+# modern Brazilian eletronic voting machines which, apparently, can't deal
+# with a time change between the first and the second rounds of the elections.
+
+# From Paul Eggert (2002-10-10):
+# The official decrees referenced below are mostly taken from
+# <a href="http://pcdsh01.on.br/DecHV.html">
+# Decretos sobre o Horario de Verao no Brasil
+# </a>.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Decree <a href="http://pcdsh01.on.br/HV20466.htm">20,466</a> (1931-10-01)
+# Decree <a href="http://pcdsh01.on.br/HV21896.htm">21,896</a> (1932-01-10)
+Rule   Brazil  1931    only    -       Oct      3      11:00   1:00    S
+Rule   Brazil  1932    1933    -       Apr      1       0:00   0       -
+Rule   Brazil  1932    only    -       Oct      3       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/HV23195.htm">23,195</a> (1933-10-10)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV27496.htm">27,496</a> (1949-11-24)
+# Decree <a href="http://pcdsh01.on.br/HV27998.htm">27,998</a> (1950-04-13)
+Rule   Brazil  1949    1952    -       Dec      1       0:00   1:00    S
+Rule   Brazil  1950    only    -       Apr     16       1:00   0       -
+Rule   Brazil  1951    1952    -       Apr      1       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV32308.htm">32,308</a> (1953-02-24)
+Rule   Brazil  1953    only    -       Mar      1       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV34724.htm">34,724</a> (1953-11-30)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV52700.htm">52,700</a> (1963-10-18)
+# established DST from 1963-10-23 00:00 to 1964-02-29 00:00
+# in SP, RJ, GB, MG, ES, due to the prolongation of the drought.
+# Decree <a href="http://pcdsh01.on.br/HV53071.htm">53,071</a> (1963-12-03)
+# extended the above decree to all of the national territory on 12-09.
+Rule   Brazil  1963    only    -       Dec      9       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/HV53604.htm">53,604</a> (1964-02-25)
+# extended summer time by one day to 1964-03-01 00:00 (start of school).
+Rule   Brazil  1964    only    -       Mar      1       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV55639.htm">55,639</a> (1965-01-27)
+Rule   Brazil  1965    only    -       Jan     31       0:00   1:00    S
+Rule   Brazil  1965    only    -       Mar     31       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV57303.htm">57,303</a> (1965-11-22)
+Rule   Brazil  1965    only    -       Dec      1       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/HV57843.htm">57,843</a> (1966-02-18)
+Rule   Brazil  1966    1968    -       Mar      1       0:00   0       -
+Rule   Brazil  1966    1967    -       Nov      1       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/HV63429.htm">63,429</a> (1968-10-15)
+# revoked DST.
+# Decree <a href="http://pcdsh01.on.br/HV91698.htm">91,698</a> (1985-09-27)
+Rule   Brazil  1985    only    -       Nov      2       0:00   1:00    S
+# Decree 92,310 (1986-01-21)
+# Decree 92,463 (1986-03-13)
+Rule   Brazil  1986    only    -       Mar     15       0:00   0       -
+# Decree 93,316 (1986-10-01)
+Rule   Brazil  1986    only    -       Oct     25       0:00   1:00    S
+Rule   Brazil  1987    only    -       Feb     14       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV94922.htm">94,922</a> (1987-09-22)
+Rule   Brazil  1987    only    -       Oct     25       0:00   1:00    S
+Rule   Brazil  1988    only    -       Feb      7       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV96676.htm">96,676</a> (1988-09-12)
+# except for the states of AC, AM, PA, RR, RO, and AP (then a territory)
+Rule   Brazil  1988    only    -       Oct     16       0:00   1:00    S
+Rule   Brazil  1989    only    -       Jan     29       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV98077.htm">98,077</a> (1989-08-21)
+# with the same exceptions
+Rule   Brazil  1989    only    -       Oct     15       0:00   1:00    S
+Rule   Brazil  1990    only    -       Feb     11       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV99530.htm">99,530</a> (1990-09-17)
+# adopted by RS, SC, PR, SP, RJ, ES, MG, GO, MS, DF.
+# Decree 99,629 (1990-10-19) adds BA, MT.
+Rule   Brazil  1990    only    -       Oct     21       0:00   1:00    S
+Rule   Brazil  1991    only    -       Feb     17       0:00   0       -
+# <a href="http://pcdsh01.on.br/HV1991.htm">Unnumbered decree</a> (1991-09-25)
+# adopted by RS, SC, PR, SP, RJ, ES, MG, BA, GO, MT, MS, DF.
+Rule   Brazil  1991    only    -       Oct     20       0:00   1:00    S
+Rule   Brazil  1992    only    -       Feb      9       0:00   0       -
+# <a href="http://pcdsh01.on.br/HV1992.htm">Unnumbered decree</a> (1992-10-16)
+# adopted by same states.
+Rule   Brazil  1992    only    -       Oct     25       0:00   1:00    S
+Rule   Brazil  1993    only    -       Jan     31       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV942.htm">942</a> (1993-09-28)
+# adopted by same states, plus AM.
+# Decree <a href="http://pcdsh01.on.br/HV1252.htm">1,252</a> (1994-09-22;
+# web page corrected 2004-01-07) adopted by same states, minus AM.
+# Decree <a href="http://pcdsh01.on.br/HV1636.htm">1,636</a> (1995-09-14)
+# adopted by same states, plus MT and TO.
+# Decree <a href="http://pcdsh01.on.br/HV1674.htm">1,674</a> (1995-10-13)
+# adds AL, SE.
+Rule   Brazil  1993    1995    -       Oct     Sun>=11  0:00   1:00    S
+Rule   Brazil  1994    1995    -       Feb     Sun>=15  0:00   0       -
+Rule   Brazil  1996    only    -       Feb     11       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/HV2000.htm">2,000</a> (1996-09-04)
+# adopted by same states, minus AL, SE.
+Rule   Brazil  1996    only    -       Oct      6       0:00   1:00    S
+Rule   Brazil  1997    only    -       Feb     16       0:00   0       -
+# From Daniel C. Sobral (1998-02-12):
+# In 1997, the DS began on October 6. The stated reason was that
+# because international television networks ignored Brazil's policy on DS,
+# they bought the wrong times on satellite for coverage of Pope's visit.
+# This year, the ending date of DS was postponed to March 1
+# to help dealing with the shortages of electric power.
+#
+# Decree 2,317 (1997-09-04), adopted by same states.
+Rule   Brazil  1997    only    -       Oct      6       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/figuras/HV2495.JPG">2,495</a>
+# (1998-02-10)
+Rule   Brazil  1998    only    -       Mar      1       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/figuras/Hv98.jpg">2,780</a> (1998-09-11)
+# adopted by the same states as before.
+Rule   Brazil  1998    only    -       Oct     11       0:00   1:00    S
+Rule   Brazil  1999    only    -       Feb     21       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/figuras/HV3150.gif">3,150</a>
+# (1999-08-23) adopted by same states.
+# Decree <a href="http://pcdsh01.on.br/DecHV99.gif">3,188</a> (1999-09-30)
+# adds SE, AL, PB, PE, RN, CE, PI, MA and RR.
+Rule   Brazil  1999    only    -       Oct      3       0:00   1:00    S
+Rule   Brazil  2000    only    -       Feb     27       0:00   0       -
+# Decree <a href="http://pcdsh01.on.br/DEC3592.htm">3,592</a> (2000-09-06)
+# adopted by the same states as before.
+# Decree <a href="http://pcdsh01.on.br/Dec3630.jpg">3,630</a> (2000-10-13)
+# repeals DST in PE and RR, effective 2000-10-15 00:00.
+# Decree <a href="http://pcdsh01.on.br/Dec3632.jpg">3,632</a> (2000-10-17)
+# repeals DST in SE, AL, PB, RN, CE, PI and MA, effective 2000-10-22 00:00.
+# Decree <a href="http://pcdsh01.on.br/figuras/HV3916.gif">3,916</a>
+# (2001-09-13) reestablishes DST in AL, CE, MA, PB, PE, PI, RN, SE.
+Rule   Brazil  2000    2001    -       Oct     Sun>=8   0:00   1:00    S
+Rule   Brazil  2001    2006    -       Feb     Sun>=15  0:00   0       -
+# Decree 4,399 (2002-10-01) repeals DST in AL, CE, MA, PB, PE, PI, RN, SE.
+# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2002/D4399.htm"></a>
+Rule   Brazil  2002    only    -       Nov      3       0:00   1:00    S
+# Decree 4,844 (2003-09-24; corrected 2003-09-26) repeals DST in BA, MT, TO.
+# <a href="http://www.presidencia.gov.br/CCIVIL/decreto/2003/D4844.htm"></a>
+Rule   Brazil  2003    only    -       Oct     19       0:00   1:00    S
+# Decree 5,223 (2004-10-01) reestablishes DST in MT.
+# <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2004/Decreto/D5223.htm"></a>
+Rule   Brazil  2004    only    -       Nov      2       0:00   1:00    S
+# Decree <a href="http://pcdsh01.on.br/DecHV5539.gif">5,539</a> (2005-09-19),
+# adopted by the same states as before.
+Rule   Brazil  2005    only    -       Oct     16       0:00   1:00    S
+# Decree <a href="http://www.planalto.gov.br/ccivil_03/_Ato2004-2006/2006/Decreto/D5920.htm">5,920</a>
+# (2006-10-03), adopted by the same states as before.
+Rule   Brazil  2006    max     -       Nov     Sun>=1   0:00   1:00    S
+Rule   Brazil  2007    max     -       Feb     lastSun  0:00   0       -
+# The latest ruleset listed above says that the following states observe DST:
+# DF, ES, GO, MG, MS, MT, PR, RJ, RS, SC, SP.
+# For dates after mid-2007, the above rules with TO="max" are guesses
+# and are quite possibly wrong, but are more likely than no DST at all.
+
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+#
+# Fernando de Noronha (administratively part of PE)
+Zone America/Noronha   -2:09:40 -      LMT     1914
+                       -2:00   Brazil  FN%sT   1990 Sep 17
+                       -2:00   -       FNT     1999 Sep 30
+                       -2:00   Brazil  FN%sT   2000 Oct 15
+                       -2:00   -       FNT     2001 Sep 13
+                       -2:00   Brazil  FN%sT   2002 Oct  1
+                       -2:00   -       FNT
+# Other Atlantic islands have no permanent settlement.
+# These include Trindade and Martin Vaz (administratively part of ES),
+# Atol das Rocas (RN), and Penedos de Sao Pedro e Sao Paulo (PE).
+# Fernando de Noronha was a separate territory from 1942-09-02 to 1989-01-01;
+# it also included the Penedos.
+#
+# Amapa (AP), east Para (PA)
+# East Para includes Belem, Maraba, Serra Norte, and Sao Felix do Xingu.
+# The division between east and west Para is the river Xingu.
+# In the north a very small part from the river Javary (now Jari I guess,
+# the border with Amapa) to the Amazon, then to the Xingu.
+Zone America/Belem     -3:13:56 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1988 Sep 12
+                       -3:00   -       BRT
+#
+# Maranhao (MA), Piaui (PI), Ceara (CE), Rio Grande do Norte (RN),
+# Paraiba (PB)
+Zone America/Fortaleza -2:34:00 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1990 Sep 17
+                       -3:00   -       BRT     1999 Sep 30
+                       -3:00   Brazil  BR%sT   2000 Oct 22
+                       -3:00   -       BRT     2001 Sep 13
+                       -3:00   Brazil  BR%sT   2002 Oct  1
+                       -3:00   -       BRT
+#
+# Pernambuco (PE) (except Atlantic islands)
+Zone America/Recife    -2:19:36 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1990 Sep 17
+                       -3:00   -       BRT     1999 Sep 30
+                       -3:00   Brazil  BR%sT   2000 Oct 15
+                       -3:00   -       BRT     2001 Sep 13
+                       -3:00   Brazil  BR%sT   2002 Oct  1
+                       -3:00   -       BRT
+#
+# Tocantins (TO)
+Zone America/Araguaina -3:12:48 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1990 Sep 17
+                       -3:00   -       BRT     1995 Sep 14
+                       -3:00   Brazil  BR%sT   2003 Sep 24
+                       -3:00   -       BRT
+#
+# Alagoas (AL), Sergipe (SE)
+Zone America/Maceio    -2:22:52 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1990 Sep 17
+                       -3:00   -       BRT     1995 Oct 13
+                       -3:00   Brazil  BR%sT   1996 Sep  4
+                       -3:00   -       BRT     1999 Sep 30
+                       -3:00   Brazil  BR%sT   2000 Oct 22
+                       -3:00   -       BRT     2001 Sep 13
+                       -3:00   Brazil  BR%sT   2002 Oct  1
+                       -3:00   -       BRT
+#
+# Bahia (BA)
+# There are too many Salvadors elsewhere, so use America/Bahia instead
+# of America/Salvador.
+Zone America/Bahia     -2:34:04 -      LMT     1914
+                       -3:00   Brazil  BR%sT   2003 Sep 24
+                       -3:00   -       BRT
+#
+# Goias (GO), Distrito Federal (DF), Minas Gerais (MG),
+# Espirito Santo (ES), Rio de Janeiro (RJ), Sao Paulo (SP), Parana (PR),
+# Santa Catarina (SC), Rio Grande do Sul (RS)
+Zone America/Sao_Paulo -3:06:28 -      LMT     1914
+                       -3:00   Brazil  BR%sT   1963 Oct 23 00:00
+                       -3:00   1:00    BRST    1964
+                       -3:00   Brazil  BR%sT
+#
+# Mato Grosso do Sul (MS)
+Zone America/Campo_Grande -3:38:28 -   LMT     1914
+                       -4:00   Brazil  AM%sT
+#
+# Mato Grosso (MT)
+Zone America/Cuiaba    -3:44:20 -      LMT     1914
+                       -4:00   Brazil  AM%sT   2003 Sep 24
+                       -4:00   -       AMT     2004 Oct  1
+                       -4:00   Brazil  AM%sT
+#
+# west Para (PA), Rondonia (RO)
+# West Para includes Altamira, Oribidos, Prainha, Oriximina, and Santarem.
+Zone America/Porto_Velho -4:15:36 -    LMT     1914
+                       -4:00   Brazil  AM%sT   1988 Sep 12
+                       -4:00   -       AMT
+#
+# Roraima (RR)
+Zone America/Boa_Vista -4:02:40 -      LMT     1914
+                       -4:00   Brazil  AM%sT   1988 Sep 12
+                       -4:00   -       AMT     1999 Sep 30
+                       -4:00   Brazil  AM%sT   2000 Oct 15
+                       -4:00   -       AMT
+#
+# east Amazonas (AM): Boca do Acre, Jutai, Manaus, Floriano Peixoto
+# The great circle line from Tabatinga to Porto Acre divides
+# east from west Amazonas.
+Zone America/Manaus    -4:00:04 -      LMT     1914
+                       -4:00   Brazil  AM%sT   1988 Sep 12
+                       -4:00   -       AMT     1993 Sep 28
+                       -4:00   Brazil  AM%sT   1994 Sep 22
+                       -4:00   -       AMT
+#
+# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
+#      Eirunepe, Envira, Ipixuna
+Zone America/Eirunepe  -4:39:28 -      LMT     1914
+                       -5:00   Brazil  AC%sT   1988 Sep 12
+                       -5:00   -       ACT     1993 Sep 28
+                       -5:00   Brazil  AC%sT   1994 Sep 22
+                       -5:00   -       ACT
+#
+# Acre (AC)
+Zone America/Rio_Branco        -4:31:12 -      LMT     1914
+                       -5:00   Brazil  AC%sT   1988 Sep 12
+                       -5:00   -       ACT
+
+
+# Chile
+
+# From Eduardo Krell (1995-10-19):
+# The law says to switch to DST at midnight [24:00] on the second SATURDAY
+# of October....  The law is the same for March and October.
+# (1998-09-29):
+# Because of the drought this year, the government decided to go into
+# DST earlier (saturday 9/26 at 24:00). This is a one-time change only ...
+# (unless there's another dry season next year, I guess).
+
+# From Julio I. Pacheco Troncoso (1999-03-18):
+# Because of the same drought, the government decided to end DST later,
+# on April 3, (one-time change).
+
+# From Oscar van Vlijmen (2006-10-08):
+# http://www.horaoficial.cl/cambio.htm
+
+# From Jesper Norgaard Welen (2006-10-08):
+# I think that there are some obvious mistakes in the suggested link
+# from Oscar van Vlijmen,... for instance entry 66 says that GMT-4
+# ended 1990-09-12 while entry 67 only begins GMT-3 at 1990-09-15
+# (they should have been 1990-09-15 and 1990-09-16 respectively), but
+# anyhow it clears up some doubts too.
+
+# From Paul Eggert (2006-12-27):
+# The following data for Chile and America/Santiago are from
+# <http://www.horaoficial.cl/horaof.htm> (2006-09-20), transcribed by
+# Jesper Norgaard Welen.  The data for Pacific/Easter are from Shanks
+# & Pottenger, except with DST transitions after 1932 cloned from
+# America/Santiago.  The pre-1980 Pacific/Easter data are dubious,
+# but we have no other source.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Chile   1927    1932    -       Sep      1      0:00    1:00    S
+Rule   Chile   1928    1932    -       Apr      1      0:00    0       -
+Rule   Chile   1942    only    -       Jun      1      4:00u   0       -
+Rule   Chile   1942    only    -       Aug      1      5:00u   1:00    S
+Rule   Chile   1946    only    -       Jul     15      4:00u   1:00    S
+Rule   Chile   1946    only    -       Sep      1      3:00u   0:00    -
+Rule   Chile   1947    only    -       Apr      1      4:00u   0       -
+Rule   Chile   1968    only    -       Nov      3      4:00u   1:00    S
+Rule   Chile   1969    only    -       Mar     30      3:00u   0       -
+Rule   Chile   1969    only    -       Nov     23      4:00u   1:00    S
+Rule   Chile   1970    only    -       Mar     29      3:00u   0       -
+Rule   Chile   1971    only    -       Mar     14      3:00u   0       -
+Rule   Chile   1970    1972    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   Chile   1972    1986    -       Mar     Sun>=9  3:00u   0       -
+Rule   Chile   1973    only    -       Sep     30      4:00u   1:00    S
+Rule   Chile   1974    1987    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   Chile   1987    only    -       Apr     12      3:00u   0       -
+Rule   Chile   1988    1989    -       Mar     Sun>=9  3:00u   0       -
+Rule   Chile   1988    only    -       Oct     Sun>=1  4:00u   1:00    S
+Rule   Chile   1989    only    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   Chile   1990    only    -       Mar     18      3:00u   0       -
+Rule   Chile   1990    only    -       Sep     16      4:00u   1:00    S
+Rule   Chile   1991    1996    -       Mar     Sun>=9  3:00u   0       -
+Rule   Chile   1991    1997    -       Oct     Sun>=9  4:00u   1:00    S
+Rule   Chile   1997    only    -       Mar     30      3:00u   0       -
+Rule   Chile   1998    only    -       Mar     Sun>=9  3:00u   0       -
+Rule   Chile   1998    only    -       Sep     27      4:00u   1:00    S
+Rule   Chile   1999    only    -       Apr      4      3:00u   0       -
+Rule   Chile   1999    max     -       Oct     Sun>=9  4:00u   1:00    S
+Rule   Chile   2000    max     -       Mar     Sun>=9  3:00u   0       -
+# IATA SSIM anomalies: (1992-02) says 1992-03-14;
+# (1996-09) says 1998-03-08.  Ignore these.
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Santiago  -4:42:46 -      LMT     1890
+                       -4:42:46 -      SMT     1910        # Santiago Mean Time
+                       -5:00   -       CLT     1916 Jul  1 # Chile Time
+                       -4:42:46 -      SMT     1918 Sep  1 # Santiago Mean Time
+                       -4:00   -       CLT     1919 Jul  1 # Chile Time
+                       -4:42:46 -      SMT     1927 Sep  1 # Santiago Mean Time
+                       -5:00   Chile   CL%sT   1947 May 22 # Chile Time
+                       -4:00   Chile   CL%sT
+Zone Pacific/Easter    -7:17:44 -      LMT     1890
+                       -7:17:28 -      EMT     1932 Sep    # Easter Mean Time
+                       -7:00   Chile   EAS%sT  1982 Mar 13 21:00 # Easter I Time
+                       -6:00   Chile   EAS%sT
+#
+# Sala y Gomez Island is like Pacific/Easter.
+# Other Chilean locations, including Juan Fernandez Is, San Ambrosio,
+# San Felix, and Antarctic bases, are like America/Santiago.
+
+# Colombia
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   CO      1992    only    -       May      3      0:00    1:00    S
+Rule   CO      1993    only    -       Apr      4      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Bogota  -4:56:20 -      LMT     1884 Mar 13
+                       -4:56:20 -      BMT     1914 Nov 23 # Bogota Mean Time
+                       -5:00   CO      CO%sT   # Colombia Time
+# Malpelo, Providencia, San Andres
+# no information; probably like America/Bogota
+
+# Curacao
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that The Bottom and Philipsburg have been at
+# -4:00 since standard time was introduced on 1912-03-02; and that
+# Kralendijk and Rincon used Kralendijk Mean Time (-4:33:08) from
+# 1912-02-02 to 1965-01-01.  The former is dubious, since S&P also say
+# Saba Island has been like Curacao.
+# This all predates our 1970 cutoff, though.
+#
+# By July 2007 Curacao and St Maarten are planned to become
+# associated states within the Netherlands, much like Aruba;
+# Bonaire, Saba and St Eustatius would become directly part of the
+# Netherlands as Kingdom Islands.  This won't affect their time zones
+# though, as far as we know.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Curacao -4:35:44 -      LMT     1912 Feb 12     # Willemstad
+                       -4:30   -       ANT     1965 # Netherlands Antilles Time
+                       -4:00   -       AST
+
+# Ecuador
+#
+# From Paul Eggert (2007-03-04):
+# Apparently Ecuador had a failed experiment with DST in 1992.
+# <http://midena.gov.ec/content/view/1261/208/> (2007-02-27) and
+# <http://www.hoy.com.ec/NoticiaNue.asp?row_id=249856> (2006-11-06) both
+# talk about "hora Sixto".  Leave this alone for now, as we have no data.
+#
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Guayaquil -5:19:20 -      LMT     1890
+                       -5:14:00 -      QMT     1931 # Quito Mean Time
+                       -5:00   -       ECT          # Ecuador Time
+Zone Pacific/Galapagos -5:58:24 -      LMT     1931 # Puerto Baquerizo Moreno
+                       -5:00   -       ECT     1986
+                       -6:00   -       GALT         # Galapagos Time
+
+# Falklands
+
+# From Paul Eggert (2006-03-22):
+# Between 1990 and 2000 inclusive, Shanks & Pottenger and the IATA agree except
+# the IATA gives 1996-09-08.  Go with Shanks & Pottenger.
+
+# From Falkland Islands Government Office, London (2001-01-22)
+# via Jesper Norgaard:
+# ... the clocks revert back to Local Mean Time at 2 am on Sunday 15
+# April 2001 and advance one hour to summer time at 2 am on Sunday 2
+# September.  It is anticipated that the clocks will revert back at 2
+# am on Sunday 21 April 2002 and advance to summer time at 2 am on
+# Sunday 1 September.
+
+# From Rives McDow (2001-02-13):
+#
+# I have communicated several times with people there, and the last
+# time I had communications that was helpful was in 1998.  Here is
+# what was said then:
+#
+# "The general rule was that Stanley used daylight saving and the Camp
+# did not. However for various reasons many people in the Camp have
+# started to use daylight saving (known locally as 'Stanley Time')
+# There is no rule as to who uses daylight saving - it is a matter of
+# personal choice and so it is impossible to draw a map showing who
+# uses it and who does not. Any list would be out of date as soon as
+# it was produced. This year daylight saving ended on April 18/19th
+# and started again on September 12/13th.  I do not know what the rule
+# is, but can find out if you like.  We do not change at the same time
+# as UK or Chile."
+#
+# I did have in my notes that the rule was "Second Saturday in Sep at
+# 0:00 until third Saturday in Apr at 0:00".  I think that this does
+# not agree in some cases with Shanks; is this true?
+#
+# Also, there is no mention in the list that some areas in the
+# Falklands do not use DST.  I have found in my communications there
+# that these areas are on the western half of East Falkland and all of
+# West Falkland.  Stanley is the only place that consistently observes
+# DST.  Again, as in other places in the world, the farmers don't like
+# it.  West Falkland is almost entirely sheep farmers.
+#
+# I know one lady there that keeps a list of which farm keeps DST and
+# which doesn't each year.  She runs a shop in Stanley, and says that
+# the list changes each year.  She uses it to communicate to her
+# customers, catching them when they are home for lunch or dinner.
+
+# From Paul Eggert (2001-03-05):
+# For now, we'll just record the time in Stanley, since we have no
+# better info.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Falk    1937    1938    -       Sep     lastSun 0:00    1:00    S
+Rule   Falk    1938    1942    -       Mar     Sun>=19 0:00    0       -
+Rule   Falk    1939    only    -       Oct     1       0:00    1:00    S
+Rule   Falk    1940    1942    -       Sep     lastSun 0:00    1:00    S
+Rule   Falk    1943    only    -       Jan     1       0:00    0       -
+Rule   Falk    1983    only    -       Sep     lastSun 0:00    1:00    S
+Rule   Falk    1984    1985    -       Apr     lastSun 0:00    0       -
+Rule   Falk    1984    only    -       Sep     16      0:00    1:00    S
+Rule   Falk    1985    2000    -       Sep     Sun>=9  0:00    1:00    S
+Rule   Falk    1986    2000    -       Apr     Sun>=16 0:00    0       -
+Rule   Falk    2001    max     -       Apr     Sun>=15 2:00    0       -
+Rule   Falk    2001    max     -       Sep     Sun>=1  2:00    1:00    S
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/Stanley  -3:51:24 -      LMT     1890
+                       -3:51:24 -      SMT     1912 Mar 12  # Stanley Mean Time
+                       -4:00   Falk    FK%sT   1983 May     # Falkland Is Time
+                       -3:00   Falk    FK%sT   1985 Sep 15
+                       -4:00   Falk    FK%sT
+
+# French Guiana
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Cayenne   -3:29:20 -      LMT     1911 Jul
+                       -4:00   -       GFT     1967 Oct # French Guiana Time
+                       -3:00   -       GFT
+
+# Guyana
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Guyana  -3:52:40 -      LMT     1915 Mar        # Georgetown
+                       -3:45   -       GBGT    1966 May 26 # Br Guiana Time
+                       -3:45   -       GYT     1975 Jul 31 # Guyana Time
+                       -3:00   -       GYT     1991
+# IATA SSIM (1996-06) says -4:00.  Assume a 1991 switch.
+                       -4:00   -       GYT
+
+# Paraguay
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger say that spring transitions are from 01:00 -> 02:00,
+# and autumn transitions are from 00:00 -> 23:00.  Go with pre-1999
+# editions of Shanks, and with the IATA, who say transitions occur at 00:00.
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Para    1975    1988    -       Oct      1      0:00    1:00    S
+Rule   Para    1975    1978    -       Mar      1      0:00    0       -
+Rule   Para    1979    1991    -       Apr      1      0:00    0       -
+Rule   Para    1989    only    -       Oct     22      0:00    1:00    S
+Rule   Para    1990    only    -       Oct      1      0:00    1:00    S
+Rule   Para    1991    only    -       Oct      6      0:00    1:00    S
+Rule   Para    1992    only    -       Mar      1      0:00    0       -
+Rule   Para    1992    only    -       Oct      5      0:00    1:00    S
+Rule   Para    1993    only    -       Mar     31      0:00    0       -
+Rule   Para    1993    1995    -       Oct      1      0:00    1:00    S
+Rule   Para    1994    1995    -       Feb     lastSun 0:00    0       -
+Rule   Para    1996    only    -       Mar      1      0:00    0       -
+# IATA SSIM (2000-02) says 1999-10-10; ignore this for now.
+# From Steffen Thorsen (2000-10-02):
+# I have three independent reports that Paraguay changed to DST this Sunday
+# (10-01).
+#
+# Translated by Gwillim Law (2001-02-27) from
+# <a href="http://www.diarionoticias.com.py/011000/nacional/naciona1.htm">
+# Noticias, a daily paper in Asuncion, Paraguay (2000-10-01)
+# </a>:
+# Starting at 0:00 today, the clock will be set forward 60 minutes, in
+# fulfillment of Decree No. 7,273 of the Executive Power....  The time change
+# system has been operating for several years.  Formerly there was a separate
+# decree each year; the new law has the same effect, but permanently.  Every
+# year, the time will change on the first Sunday of October; likewise, the
+# clock will be set back on the first Sunday of March.
+#
+Rule   Para    1996    2001    -       Oct     Sun>=1  0:00    1:00    S
+# IATA SSIM (1997-09) says Mar 1; go with Shanks & Pottenger.
+Rule   Para    1997    only    -       Feb     lastSun 0:00    0       -
+# Shanks & Pottenger say 1999-02-28; IATA SSIM (1999-02) says 1999-02-27, but
+# (1999-09) reports no date; go with above sources and Gerd Knops (2001-02-27).
+Rule   Para    1998    2001    -       Mar     Sun>=1  0:00    0       -
+# From Rives McDow (2002-02-28):
+# A decree was issued in Paraguay (no. 16350) on 2002-02-26 that changed the
+# dst method to be from the first Sunday in September to the first Sunday in
+# April.
+Rule   Para    2002    2004    -       Apr     Sun>=1  0:00    0       -
+Rule   Para    2002    2003    -       Sep     Sun>=1  0:00    1:00    S
+#
+# From Jesper Norgaard Welen (2005-01-02):
+# There are several sources that claim that Paraguay made
+# a timezone rule change in autumn 2004.
+# From Steffen Thorsen (2005-01-05):
+# Decree 1,867 (2004-03-05)
+# From Carlos Raul Perasso via Jesper Norgaard Welen (2006-10-13)
+# <http://www.presidencia.gov.py/decretos/D1867.pdf>
+Rule   Para    2004    max     -       Oct     Sun>=15 0:00    1:00    S
+Rule   Para    2005    max     -       Mar     Sun>=8  0:00    0       -
+
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Asuncion  -3:50:40 -      LMT     1890
+                       -3:50:40 -      AMT     1931 Oct 10 # Asuncion Mean Time
+                       -4:00   -       PYT     1972 Oct # Paraguay Time
+                       -3:00   -       PYT     1974 Apr
+                       -4:00   Para    PY%sT
+
+# Peru
+#
+# <a href="news:xrGmb.39935$gA1.13896113@news4.srv.hcvlny.cv.net">
+# From Evelyn C. Leeper via Mark Brader (2003-10-26):</a>
+# When we were in Peru in 1985-1986, they apparently switched over
+# sometime between December 29 and January 3 while we were on the Amazon.
+#
+# From Paul Eggert (2006-03-22):
+# Shanks & Pottenger don't have this transition.  Assume 1986 was like 1987.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Peru    1938    only    -       Jan      1      0:00    1:00    S
+Rule   Peru    1938    only    -       Apr      1      0:00    0       -
+Rule   Peru    1938    1939    -       Sep     lastSun 0:00    1:00    S
+Rule   Peru    1939    1940    -       Mar     Sun>=24 0:00    0       -
+Rule   Peru    1986    1987    -       Jan      1      0:00    1:00    S
+Rule   Peru    1986    1987    -       Apr      1      0:00    0       -
+Rule   Peru    1990    only    -       Jan      1      0:00    1:00    S
+Rule   Peru    1990    only    -       Apr      1      0:00    0       -
+# IATA is ambiguous for 1993/1995; go with Shanks & Pottenger.
+Rule   Peru    1994    only    -       Jan      1      0:00    1:00    S
+Rule   Peru    1994    only    -       Apr      1      0:00    0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Lima    -5:08:12 -      LMT     1890
+                       -5:08:36 -      LMT     1908 Jul 28 # Lima Mean Time?
+                       -5:00   Peru    PE%sT   # Peru Time
+
+# South Georgia
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone Atlantic/South_Georgia -2:26:08 - LMT     1890            # Grytviken
+                       -2:00   -       GST     # South Georgia Time
+
+# South Sandwich Is
+# uninhabited; scientific personnel have wintered
+
+# Suriname
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Paramaribo        -3:40:40 -      LMT     1911
+                       -3:40:52 -      PMT     1935     # Paramaribo Mean Time
+                       -3:40:36 -      PMT     1945 Oct # The capital moved?
+                       -3:30   -       NEGT    1975 Nov 20 # Dutch Guiana Time
+                       -3:30   -       SRT     1984 Oct # Suriname Time
+                       -3:00   -       SRT
+
+# Trinidad and Tobago
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Port_of_Spain -4:06:04 -  LMT     1912 Mar 2
+                       -4:00   -       AST
+
+# Uruguay
+# From Paul Eggert (1993-11-18):
+# Uruguay wins the prize for the strangest peacetime manipulation of the rules.
+# From Shanks & Pottenger:
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+# Whitman gives 1923 Oct 1; go with Shanks & Pottenger.
+Rule   Uruguay 1923    only    -       Oct      2       0:00   0:30    HS
+Rule   Uruguay 1924    1926    -       Apr      1       0:00   0       -
+Rule   Uruguay 1924    1925    -       Oct      1       0:00   0:30    HS
+Rule   Uruguay 1933    1935    -       Oct     lastSun  0:00   0:30    HS
+# Shanks & Pottenger give 1935 Apr 1 0:00 & 1936 Mar 30 0:00; go with Whitman.
+Rule   Uruguay 1934    1936    -       Mar     Sat>=25 23:30s  0       -
+Rule   Uruguay 1936    only    -       Nov      1       0:00   0:30    HS
+Rule   Uruguay 1937    1941    -       Mar     lastSun  0:00   0       -
+# Whitman gives 1937 Oct 3; go with Shanks & Pottenger.
+Rule   Uruguay 1937    1940    -       Oct     lastSun  0:00   0:30    HS
+# Whitman gives 1941 Oct 24 - 1942 Mar 27, 1942 Dec 14 - 1943 Apr 13,
+# and 1943 Apr 13 ``to present time''; go with Shanks & Pottenger.
+Rule   Uruguay 1941    only    -       Aug      1       0:00   0:30    HS
+Rule   Uruguay 1942    only    -       Jan      1       0:00   0       -
+Rule   Uruguay 1942    only    -       Dec     14       0:00   1:00    S
+Rule   Uruguay 1943    only    -       Mar     14       0:00   0       -
+Rule   Uruguay 1959    only    -       May     24       0:00   1:00    S
+Rule   Uruguay 1959    only    -       Nov     15       0:00   0       -
+Rule   Uruguay 1960    only    -       Jan     17       0:00   1:00    S
+Rule   Uruguay 1960    only    -       Mar      6       0:00   0       -
+Rule   Uruguay 1965    1967    -       Apr     Sun>=1   0:00   1:00    S
+Rule   Uruguay 1965    only    -       Sep     26       0:00   0       -
+Rule   Uruguay 1966    1967    -       Oct     31       0:00   0       -
+Rule   Uruguay 1968    1970    -       May     27       0:00   0:30    HS
+Rule   Uruguay 1968    1970    -       Dec      2       0:00   0       -
+Rule   Uruguay 1972    only    -       Apr     24       0:00   1:00    S
+Rule   Uruguay 1972    only    -       Aug     15       0:00   0       -
+Rule   Uruguay 1974    only    -       Mar     10       0:00   0:30    HS
+Rule   Uruguay 1974    only    -       Dec     22       0:00   1:00    S
+Rule   Uruguay 1976    only    -       Oct      1       0:00   0       -
+Rule   Uruguay 1977    only    -       Dec      4       0:00   1:00    S
+Rule   Uruguay 1978    only    -       Apr      1       0:00   0       -
+Rule   Uruguay 1979    only    -       Oct      1       0:00   1:00    S
+Rule   Uruguay 1980    only    -       May      1       0:00   0       -
+Rule   Uruguay 1987    only    -       Dec     14       0:00   1:00    S
+Rule   Uruguay 1988    only    -       Mar     14       0:00   0       -
+Rule   Uruguay 1988    only    -       Dec     11       0:00   1:00    S
+Rule   Uruguay 1989    only    -       Mar     12       0:00   0       -
+Rule   Uruguay 1989    only    -       Oct     29       0:00   1:00    S
+# Shanks & Pottenger say no DST was observed in 1990/1 and 1991/2,
+# and that 1992/3's DST was from 10-25 to 03-01.  Go with IATA.
+Rule   Uruguay 1990    1992    -       Mar     Sun>=1   0:00   0       -
+Rule   Uruguay 1990    1991    -       Oct     Sun>=21  0:00   1:00    S
+Rule   Uruguay 1992    only    -       Oct     18       0:00   1:00    S
+Rule   Uruguay 1993    only    -       Feb     28       0:00   0       -
+# From Eduardo Cota (2004-09-20):
+# The uruguayan government has decreed a change in the local time....
+# http://www.presidencia.gub.uy/decretos/2004091502.htm
+Rule   Uruguay 2004    only    -       Sep     19       0:00   1:00    S
+# From Steffen Thorsen (2005-03-11):
+# Uruguay's DST was scheduled to end on Sunday, 2005-03-13, but in order to
+# save energy ... it was postponed two weeks....
+# http://www.presidencia.gub.uy/_Web/noticias/2005/03/2005031005.htm
+Rule   Uruguay 2005    only    -       Mar     27       2:00   0       -
+# From Eduardo Cota (2005-09-27):
+# http://www.presidencia.gub.uy/_Web/decretos/2005/09/CM%20119_09%2009%202005_00001.PDF
+# This means that from 2005-10-09 at 02:00 local time, until 2006-03-12 at
+# 02:00 local time, official time in Uruguay will be at GMT -2.
+Rule   Uruguay 2005    only    -       Oct      9       2:00   1:00    S
+Rule   Uruguay 2006    only    -       Mar     12       2:00   0       -
+# From Jesper Norgaard Welen (2006-09-06):
+# http://www.presidencia.gub.uy/_web/decretos/2006/09/CM%20210_08%2006%202006_00001.PDF
+Rule   Uruguay 2006    max     -       Oct     Sun>=1   2:00   1:00    S
+Rule   Uruguay 2007    max     -       Mar     Sun>=8   2:00   0       -
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Montevideo        -3:44:44 -      LMT     1898 Jun 28
+                       -3:44:44 -      MMT     1920 May  1     # Montevideo MT
+                       -3:30   Uruguay UY%sT   1942 Dec 14     # Uruguay Time
+                       -3:00   Uruguay UY%sT
+
+# Venezuela
+# Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone   America/Caracas -4:27:44 -      LMT     1890
+                       -4:27:40 -      CMT     1912 Feb 12 # Caracas Mean Time?
+                       -4:30   -       VET     1965         # Venezuela Time
+                       -4:00   -       VET
diff --git a/commands/zoneinfo/strftime.c b/commands/zoneinfo/strftime.c
new file mode 100644 (file)
index 0000000..af328ce
--- /dev/null
@@ -0,0 +1,761 @@
+#ifndef lint
+#ifndef NOID
+static char    elsieid[] = "@(#)strftime.c     7.75";
+/*
+** Based on the UCB version with the ID appearing below.
+** This is ANSIish only when "multibyte character == plain character".
+*/
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+#include "private.h"
+
+/*
+** Copyright (c) 1989 The Regents of the University of California.
+** All rights reserved.
+**
+** Redistribution and use in source and binary forms are permitted
+** provided that the above copyright notice and this paragraph are
+** duplicated in all such forms and that any documentation,
+** advertising materials, and other materials related to such
+** distribution and use acknowledge that the software was developed
+** by the University of California, Berkeley. The name of the
+** University may not be used to endorse or promote products derived
+** from this software without specific prior written permission.
+** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+** IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#ifndef LIBC_SCCS
+#ifndef lint
+static const char      sccsid[] = "@(#)strftime.c      5.4 (Berkeley) 3/14/89";
+#endif /* !defined lint */
+#endif /* !defined LIBC_SCCS */
+
+#include "tzfile.h"
+#include "fcntl.h"
+#include "locale.h"
+
+struct lc_time_T {
+       const char *    mon[MONSPERYEAR];
+       const char *    month[MONSPERYEAR];
+       const char *    wday[DAYSPERWEEK];
+       const char *    weekday[DAYSPERWEEK];
+       const char *    X_fmt;
+       const char *    x_fmt;
+       const char *    c_fmt;
+       const char *    am;
+       const char *    pm;
+       const char *    date_fmt;
+};
+
+#ifdef LOCALE_HOME
+#include "sys/stat.h"
+static struct lc_time_T                localebuf;
+static struct lc_time_T *      _loc P((void));
+#define Locale _loc()
+#endif /* defined LOCALE_HOME */
+#ifndef LOCALE_HOME
+#define Locale (&C_time_locale)
+#endif /* !defined LOCALE_HOME */
+
+static const struct lc_time_T  C_time_locale = {
+       {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+       }, {
+               "January", "February", "March", "April", "May", "June",
+               "July", "August", "September", "October", "November", "December"
+       }, {
+               "Sun", "Mon", "Tue", "Wed",
+               "Thu", "Fri", "Sat"
+       }, {
+               "Sunday", "Monday", "Tuesday", "Wednesday",
+               "Thursday", "Friday", "Saturday"
+       },
+
+       /* X_fmt */
+       "%H:%M:%S",
+
+       /*
+       ** x_fmt
+       ** C99 requires this format.
+       ** Using just numbers (as here) makes Quakers happier;
+       ** it's also compatible with SVR4.
+       */
+       "%m/%d/%y",
+
+       /*
+       ** c_fmt
+       ** C99 requires this format.
+       ** Previously this code used "%D %X", but we now conform to C99.
+       ** Note that
+       **      "%a %b %d %H:%M:%S %Y"
+       ** is used by Solaris 2.3.
+       */
+       "%a %b %e %T %Y",
+
+       /* am */
+       "AM",
+
+       /* pm */
+       "PM",
+
+       /* date_fmt */
+       "%a %b %e %H:%M:%S %Z %Y"
+};
+
+static char *  _add P((const char *, char *, const char *));
+static char *  _conv P((int, const char *, char *, const char *));
+static char *  _fmt P((const char *, const struct tm *, char *, const char *,
+                       int *));
+static char *  _yconv P((int, int, int, int, char *, const char *));
+
+extern char *  tzname[];
+
+#ifndef YEAR_2000_NAME
+#define YEAR_2000_NAME "CHECK_STRFTIME_FORMATS_FOR_TWO_DIGIT_YEARS"
+#endif /* !defined YEAR_2000_NAME */
+
+#define IN_NONE        0
+#define IN_SOME        1
+#define IN_THIS        2
+#define IN_ALL 3
+
+size_t
+strftime(s, maxsize, format, t)
+char * const           s;
+const size_t           maxsize;
+const char * const     format;
+const struct tm * const        t;
+{
+       char *  p;
+       int     warn;
+
+       tzset();
+#ifdef LOCALE_HOME
+       localebuf.mon[0] = 0;
+#endif /* defined LOCALE_HOME */
+       warn = IN_NONE;
+       p = _fmt(((format == NULL) ? "%c" : format), t, s, s + maxsize, &warn);
+#ifndef NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU
+       if (warn != IN_NONE && getenv(YEAR_2000_NAME) != NULL) {
+               (void) fprintf(stderr, "\n");
+               if (format == NULL)
+                       (void) fprintf(stderr, "NULL strftime format ");
+               else    (void) fprintf(stderr, "strftime format \"%s\" ",
+                               format);
+               (void) fprintf(stderr, "yields only two digits of years in ");
+               if (warn == IN_SOME)
+                       (void) fprintf(stderr, "some locales");
+               else if (warn == IN_THIS)
+                       (void) fprintf(stderr, "the current locale");
+               else    (void) fprintf(stderr, "all locales");
+               (void) fprintf(stderr, "\n");
+       }
+#endif /* !defined NO_RUN_TIME_WARNINGS_ABOUT_YEAR_2000_PROBLEMS_THANK_YOU */
+       if (p == s + maxsize)
+               return 0;
+       *p = '\0';
+       return p - s;
+}
+
+static char *
+_fmt(format, t, pt, ptlim, warnp)
+const char *           format;
+const struct tm * const        t;
+char *                 pt;
+const char * const     ptlim;
+int *                  warnp;
+{
+       for ( ; *format; ++format) {
+               if (*format == '%') {
+label:
+                       switch (*++format) {
+                       case '\0':
+                               --format;
+                               break;
+                       case 'A':
+                               pt = _add((t->tm_wday < 0 ||
+                                       t->tm_wday >= DAYSPERWEEK) ?
+                                       "?" : Locale->weekday[t->tm_wday],
+                                       pt, ptlim);
+                               continue;
+                       case 'a':
+                               pt = _add((t->tm_wday < 0 ||
+                                       t->tm_wday >= DAYSPERWEEK) ?
+                                       "?" : Locale->wday[t->tm_wday],
+                                       pt, ptlim);
+                               continue;
+                       case 'B':
+                               pt = _add((t->tm_mon < 0 ||
+                                       t->tm_mon >= MONSPERYEAR) ?
+                                       "?" : Locale->month[t->tm_mon],
+                                       pt, ptlim);
+                               continue;
+                       case 'b':
+                       case 'h':
+                               pt = _add((t->tm_mon < 0 ||
+                                       t->tm_mon >= MONSPERYEAR) ?
+                                       "?" : Locale->mon[t->tm_mon],
+                                       pt, ptlim);
+                               continue;
+                       case 'C':
+                               /*
+                               ** %C used to do a...
+                               **      _fmt("%a %b %e %X %Y", t);
+                               ** ...whereas now POSIX 1003.2 calls for
+                               ** something completely different.
+                               ** (ado, 1993-05-24)
+                               */
+                               pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 0,
+                                       pt, ptlim);
+                               continue;
+                       case 'c':
+                               {
+                               int warn2 = IN_SOME;
+
+                               pt = _fmt(Locale->c_fmt, t, pt, ptlim, warnp);
+                               if (warn2 == IN_ALL)
+                                       warn2 = IN_THIS;
+                               if (warn2 > *warnp)
+                                       *warnp = warn2;
+                               }
+                               continue;
+                       case 'D':
+                               pt = _fmt("%m/%d/%y", t, pt, ptlim, warnp);
+                               continue;
+                       case 'd':
+                               pt = _conv(t->tm_mday, "%02d", pt, ptlim);
+                               continue;
+                       case 'E':
+                       case 'O':
+                               /*
+                               ** C99 locale modifiers.
+                               ** The sequences
+                               **      %Ec %EC %Ex %EX %Ey %EY
+                               **      %Od %oe %OH %OI %Om %OM
+                               **      %OS %Ou %OU %OV %Ow %OW %Oy
+                               ** are supposed to provide alternate
+                               ** representations.
+                               */
+                               goto label;
+                       case 'e':
+                               pt = _conv(t->tm_mday, "%2d", pt, ptlim);
+                               continue;
+                       case 'F':
+                               pt = _fmt("%Y-%m-%d", t, pt, ptlim, warnp);
+                               continue;
+                       case 'H':
+                               pt = _conv(t->tm_hour, "%02d", pt, ptlim);
+                               continue;
+                       case 'I':
+                               pt = _conv((t->tm_hour % 12) ?
+                                       (t->tm_hour % 12) : 12,
+                                       "%02d", pt, ptlim);
+                               continue;
+                       case 'j':
+                               pt = _conv(t->tm_yday + 1, "%03d", pt, ptlim);
+                               continue;
+                       case 'k':
+                               /*
+                               ** This used to be...
+                               **      _conv(t->tm_hour % 12 ?
+                               **              t->tm_hour % 12 : 12, 2, ' ');
+                               ** ...and has been changed to the below to
+                               ** match SunOS 4.1.1 and Arnold Robbins'
+                               ** strftime version 3.0. That is, "%k" and
+                               ** "%l" have been swapped.
+                               ** (ado, 1993-05-24)
+                               */
+                               pt = _conv(t->tm_hour, "%2d", pt, ptlim);
+                               continue;
+#ifdef KITCHEN_SINK
+                       case 'K':
+                               /*
+                               ** After all this time, still unclaimed!
+                               */
+                               pt = _add("kitchen sink", pt, ptlim);
+                               continue;
+#endif /* defined KITCHEN_SINK */
+                       case 'l':
+                               /*
+                               ** This used to be...
+                               **      _conv(t->tm_hour, 2, ' ');
+                               ** ...and has been changed to the below to
+                               ** match SunOS 4.1.1 and Arnold Robbin's
+                               ** strftime version 3.0. That is, "%k" and
+                               ** "%l" have been swapped.
+                               ** (ado, 1993-05-24)
+                               */
+                               pt = _conv((t->tm_hour % 12) ?
+                                       (t->tm_hour % 12) : 12,
+                                       "%2d", pt, ptlim);
+                               continue;
+                       case 'M':
+                               pt = _conv(t->tm_min, "%02d", pt, ptlim);
+                               continue;
+                       case 'm':
+                               pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim);
+                               continue;
+                       case 'n':
+                               pt = _add("\n", pt, ptlim);
+                               continue;
+                       case 'p':
+                               pt = _add((t->tm_hour >= (HOURSPERDAY / 2)) ?
+                                       Locale->pm :
+                                       Locale->am,
+                                       pt, ptlim);
+                               continue;
+                       case 'R':
+                               pt = _fmt("%H:%M", t, pt, ptlim, warnp);
+                               continue;
+                       case 'r':
+                               pt = _fmt("%I:%M:%S %p", t, pt, ptlim, warnp);
+                               continue;
+                       case 'S':
+                               pt = _conv(t->tm_sec, "%02d", pt, ptlim);
+                               continue;
+                       case 's':
+                               {
+                                       struct tm       tm;
+                                       char            buf[INT_STRLEN_MAXIMUM(
+                                                               time_t) + 1];
+                                       time_t          mkt;
+
+                                       tm = *t;
+                                       mkt = mktime(&tm);
+                                       if (TYPE_SIGNED(time_t))
+                                               (void) sprintf(buf, "%ld",
+                                                       (long) mkt);
+                                       else    (void) sprintf(buf, "%lu",
+                                                       (unsigned long) mkt);
+                                       pt = _add(buf, pt, ptlim);
+                               }
+                               continue;
+                       case 'T':
+                               pt = _fmt("%H:%M:%S", t, pt, ptlim, warnp);
+                               continue;
+                       case 't':
+                               pt = _add("\t", pt, ptlim);
+                               continue;
+                       case 'U':
+                               pt = _conv((t->tm_yday + DAYSPERWEEK -
+                                       t->tm_wday) / DAYSPERWEEK,
+                                       "%02d", pt, ptlim);
+                               continue;
+                       case 'u':
+                               /*
+                               ** From Arnold Robbins' strftime version 3.0:
+                               ** "ISO 8601: Weekday as a decimal number
+                               ** [1 (Monday) - 7]"
+                               ** (ado, 1993-05-24)
+                               */
+                               pt = _conv((t->tm_wday == 0) ?
+                                       DAYSPERWEEK : t->tm_wday,
+                                       "%d", pt, ptlim);
+                               continue;
+                       case 'V':       /* ISO 8601 week number */
+                       case 'G':       /* ISO 8601 year (four digits) */
+                       case 'g':       /* ISO 8601 year (two digits) */
+/*
+** From Arnold Robbins' strftime version 3.0: "the week number of the
+** year (the first Monday as the first day of week 1) as a decimal number
+** (01-53)."
+** (ado, 1993-05-24)
+**
+** From "http://www.ft.uni-erlangen.de/~mskuhn/iso-time.html" by Markus Kuhn:
+** "Week 01 of a year is per definition the first week which has the
+** Thursday in this year, which is equivalent to the week which contains
+** the fourth day of January. In other words, the first week of a new year
+** is the week which has the majority of its days in the new year. Week 01
+** might also contain days from the previous year and the week before week
+** 01 of a year is the last week (52 or 53) of the previous year even if
+** it contains days from the new year. A week starts with Monday (day 1)
+** and ends with Sunday (day 7). For example, the first week of the year
+** 1997 lasts from 1996-12-30 to 1997-01-05..."
+** (ado, 1996-01-02)
+*/
+                               {
+                                       int     year;
+                                       int     base;
+                                       int     yday;
+                                       int     wday;
+                                       int     w;
+
+                                       year = t->tm_year;
+                                       base = TM_YEAR_BASE;
+                                       yday = t->tm_yday;
+                                       wday = t->tm_wday;
+                                       for ( ; ; ) {
+                                               int     len;
+                                               int     bot;
+                                               int     top;
+
+                                               len = isleap_sum(year, base) ?
+                                                       DAYSPERLYEAR :
+                                                       DAYSPERNYEAR;
+                                               /*
+                                               ** What yday (-3 ... 3) does
+                                               ** the ISO year begin on?
+                                               */
+                                               bot = ((yday + 11 - wday) %
+                                                       DAYSPERWEEK) - 3;
+                                               /*
+                                               ** What yday does the NEXT
+                                               ** ISO year begin on?
+                                               */
+                                               top = bot -
+                                                       (len % DAYSPERWEEK);
+                                               if (top < -3)
+                                                       top += DAYSPERWEEK;
+                                               top += len;
+                                               if (yday >= top) {
+                                                       ++base;
+                                                       w = 1;
+                                                       break;
+                                               }
+                                               if (yday >= bot) {
+                                                       w = 1 + ((yday - bot) /
+                                                               DAYSPERWEEK);
+                                                       break;
+                                               }
+                                               --base;
+                                               yday += isleap_sum(year, base) ?
+                                                       DAYSPERLYEAR :
+                                                       DAYSPERNYEAR;
+                                       }
+#ifdef XPG4_1994_04_09
+                                       if ((w == 52 &&
+                                               t->tm_mon == TM_JANUARY) ||
+                                               (w == 1 &&
+                                               t->tm_mon == TM_DECEMBER))
+                                                       w = 53;
+#endif /* defined XPG4_1994_04_09 */
+                                       if (*format == 'V')
+                                               pt = _conv(w, "%02d",
+                                                       pt, ptlim);
+                                       else if (*format == 'g') {
+                                               *warnp = IN_ALL;
+                                               pt = _yconv(year, base, 0, 1,
+                                                       pt, ptlim);
+                                       } else  pt = _yconv(year, base, 1, 1,
+                                                       pt, ptlim);
+                               }
+                               continue;
+                       case 'v':
+                               /*
+                               ** From Arnold Robbins' strftime version 3.0:
+                               ** "date as dd-bbb-YYYY"
+                               ** (ado, 1993-05-24)
+                               */
+                               pt = _fmt("%e-%b-%Y", t, pt, ptlim, warnp);
+                               continue;
+                       case 'W':
+                               pt = _conv((t->tm_yday + DAYSPERWEEK -
+                                       (t->tm_wday ?
+                                       (t->tm_wday - 1) :
+                                       (DAYSPERWEEK - 1))) / DAYSPERWEEK,
+                                       "%02d", pt, ptlim);
+                               continue;
+                       case 'w':
+                               pt = _conv(t->tm_wday, "%d", pt, ptlim);
+                               continue;
+                       case 'X':
+                               pt = _fmt(Locale->X_fmt, t, pt, ptlim, warnp);
+                               continue;
+                       case 'x':
+                               {
+                               int     warn2 = IN_SOME;
+
+                               pt = _fmt(Locale->x_fmt, t, pt, ptlim, &warn2);
+                               if (warn2 == IN_ALL)
+                                       warn2 = IN_THIS;
+                               if (warn2 > *warnp)
+                                       *warnp = warn2;
+                               }
+                               continue;
+                       case 'y':
+                               *warnp = IN_ALL;
+                               pt = _yconv(t->tm_year, TM_YEAR_BASE, 0, 1,
+                                       pt, ptlim);
+                               continue;
+                       case 'Y':
+                               pt = _yconv(t->tm_year, TM_YEAR_BASE, 1, 1,
+                                       pt, ptlim);
+                               continue;
+                       case 'Z':
+#ifdef TM_ZONE
+                               if (t->TM_ZONE != NULL)
+                                       pt = _add(t->TM_ZONE, pt, ptlim);
+                               else
+#endif /* defined TM_ZONE */
+                               if (t->tm_isdst >= 0)
+                                       pt = _add(tzname[t->tm_isdst != 0],
+                                               pt, ptlim);
+                               /*
+                               ** C99 says that %Z must be replaced by the
+                               ** empty string if the time zone is not
+                               ** determinable.
+                               */
+                               continue;
+                       case 'z':
+                               {
+                               int             diff;
+                               char const *    sign;
+
+                               if (t->tm_isdst < 0)
+                                       continue;
+#ifdef TM_GMTOFF
+                               diff = t->TM_GMTOFF;
+#else /* !defined TM_GMTOFF */
+                               /*
+                               ** C99 says that the UTC offset must
+                               ** be computed by looking only at
+                               ** tm_isdst. This requirement is
+                               ** incorrect, since it means the code
+                               ** must rely on magic (in this case
+                               ** altzone and timezone), and the
+                               ** magic might not have the correct
+                               ** offset. Doing things correctly is
+                               ** tricky and requires disobeying C99;
+                               ** see GNU C strftime for details.
+                               ** For now, punt and conform to the
+                               ** standard, even though it's incorrect.
+                               **
+                               ** C99 says that %z must be replaced by the
+                               ** empty string if the time zone is not
+                               ** determinable, so output nothing if the
+                               ** appropriate variables are not available.
+                               */
+                               if (t->tm_isdst == 0)
+#ifdef USG_COMPAT
+                                       diff = -timezone;
+#else /* !defined USG_COMPAT */
+                                       continue;
+#endif /* !defined USG_COMPAT */
+                               else
+#ifdef ALTZONE
+                                       diff = -altzone;
+#else /* !defined ALTZONE */
+                                       continue;
+#endif /* !defined ALTZONE */
+#endif /* !defined TM_GMTOFF */
+                               if (diff < 0) {
+                                       sign = "-";
+                                       diff = -diff;
+                               } else  sign = "+";
+                               pt = _add(sign, pt, ptlim);
+                               diff /= SECSPERMIN;
+                               diff = (diff / MINSPERHOUR) * 100 +
+                                       (diff % MINSPERHOUR);
+                               pt = _conv(diff, "%04d", pt, ptlim);
+                               }
+                               continue;
+                       case '+':
+                               pt = _fmt(Locale->date_fmt, t, pt, ptlim,
+                                       warnp);
+                               continue;
+                       case '%':
+                       /*
+                       ** X311J/88-090 (4.12.3.5): if conversion char is
+                       ** undefined, behavior is undefined. Print out the
+                       ** character itself as printf(3) also does.
+                       */
+                       default:
+                               break;
+                       }
+               }
+               if (pt == ptlim)
+                       break;
+               *pt++ = *format;
+       }
+       return pt;
+}
+
+static char *
+_conv(n, format, pt, ptlim)
+const int              n;
+const char * const     format;
+char * const           pt;
+const char * const     ptlim;
+{
+       char    buf[INT_STRLEN_MAXIMUM(int) + 1];
+
+       (void) sprintf(buf, format, n);
+       return _add(buf, pt, ptlim);
+}
+
+static char *
+_add(str, pt, ptlim)
+const char *           str;
+char *                 pt;
+const char * const     ptlim;
+{
+       while (pt < ptlim && (*pt = *str++) != '\0')
+               ++pt;
+       return pt;
+}
+
+/*
+** POSIX and the C Standard are unclear or inconsistent about
+** what %C and %y do if the year is negative or exceeds 9999.
+** Use the convention that %C concatenated with %y yields the
+** same output as %Y, and that %Y contains at least 4 bytes,
+** with more only if necessary.
+*/
+
+static char *
+_yconv(a, b, convert_top, convert_yy, pt, ptlim)
+const int              a;
+const int              b;
+const int              convert_top;
+const int              convert_yy;
+char *                 pt;
+const char * const     ptlim;
+{
+       register int    lead;
+       register int    trail;
+
+#define DIVISOR        100
+       trail = a % DIVISOR + b % DIVISOR;
+       lead = a / DIVISOR + b / DIVISOR + trail / DIVISOR;
+       trail %= DIVISOR;
+       if (trail < 0 && lead > 0) {
+               trail += DIVISOR;
+               --lead;
+       } else if (lead < 0 && trail > 0) {
+               trail -= DIVISOR;
+               ++lead;
+       }
+       if (convert_top) {
+               if (lead == 0 && trail < 0)
+                       pt = _add("-0", pt, ptlim);
+               else    pt = _conv(lead, "%02d", pt, ptlim);
+       }
+       if (convert_yy)
+               pt = _conv(((trail < 0) ? -trail : trail), "%02d", pt, ptlim);
+       return pt;
+}
+
+#ifdef LOCALE_HOME
+static struct lc_time_T *
+_loc P((void))
+{
+       static const char       locale_home[] = LOCALE_HOME;
+       static const char       lc_time[] = "LC_TIME";
+       static char *           locale_buf;
+
+       int                     fd;
+       int                     oldsun; /* "...ain't got nothin' to do..." */
+       char *                  lbuf;
+       char *                  name;
+       char *                  p;
+       const char **           ap;
+       const char *            plim;
+       char                    filename[FILENAME_MAX];
+       struct stat             st;
+       size_t                  namesize;
+       size_t                  bufsize;
+
+       /*
+       ** Use localebuf.mon[0] to signal whether locale is already set up.
+       */
+       if (localebuf.mon[0])
+               return &localebuf;
+       name = setlocale(LC_TIME, (char *) NULL);
+       if (name == NULL || *name == '\0')
+               goto no_locale;
+       /*
+       ** If the locale name is the same as our cache, use the cache.
+       */
+       lbuf = locale_buf;
+       if (lbuf != NULL && strcmp(name, lbuf) == 0) {
+               p = lbuf;
+               for (ap = (const char **) &localebuf;
+                       ap < (const char **) (&localebuf + 1);
+                               ++ap)
+                                       *ap = p += strlen(p) + 1;
+               return &localebuf;
+       }
+       /*
+       ** Slurp the locale file into the cache.
+       */
+       namesize = strlen(name) + 1;
+       if (sizeof filename <
+               ((sizeof locale_home) + namesize + (sizeof lc_time)))
+                       goto no_locale;
+       oldsun = 0;
+       (void) sprintf(filename, "%s/%s/%s", locale_home, name, lc_time);
+       fd = open(filename, O_RDONLY);
+       if (fd < 0) {
+               /*
+               ** Old Sun systems have a different naming and data convention.
+               */
+               oldsun = 1;
+               (void) sprintf(filename, "%s/%s/%s", locale_home,
+                       lc_time, name);
+               fd = open(filename, O_RDONLY);
+               if (fd < 0)
+                       goto no_locale;
+       }
+       if (fstat(fd, &st) != 0)
+               goto bad_locale;
+       if (st.st_size <= 0)
+               goto bad_locale;
+       bufsize = namesize + st.st_size;
+       locale_buf = NULL;
+       lbuf = (lbuf == NULL) ? malloc(bufsize) : realloc(lbuf, bufsize);
+       if (lbuf == NULL)
+               goto bad_locale;
+       (void) strcpy(lbuf, name);
+       p = lbuf + namesize;
+       plim = p + st.st_size;
+       if (read(fd, p, (size_t) st.st_size) != st.st_size)
+               goto bad_lbuf;
+       if (close(fd) != 0)
+               goto bad_lbuf;
+       /*
+       ** Parse the locale file into localebuf.
+       */
+       if (plim[-1] != '\n')
+               goto bad_lbuf;
+       for (ap = (const char **) &localebuf;
+               ap < (const char **) (&localebuf + 1);
+                       ++ap) {
+                               if (p == plim)
+                                       goto bad_lbuf;
+                               *ap = p;
+                               while (*p != '\n')
+                                       ++p;
+                               *p++ = '\0';
+       }
+       if (oldsun) {
+               /*
+               ** SunOS 4 used an obsolescent format; see localdtconv(3).
+               ** c_fmt had the ``short format for dates and times together''
+               ** (SunOS 4 date, "%a %b %e %T %Z %Y" in the C locale);
+               ** date_fmt had the ``long format for dates''
+               ** (SunOS 4 strftime %C, "%A, %B %e, %Y" in the C locale).
+               ** Discard the latter in favor of the former.
+               */
+               localebuf.date_fmt = localebuf.c_fmt;
+       }
+       /*
+       ** Record the successful parse in the cache.
+       */
+       locale_buf = lbuf;
+
+       return &localebuf;
+
+bad_lbuf:
+       free(lbuf);
+bad_locale:
+       (void) close(fd);
+no_locale:
+       localebuf = C_time_locale;
+       locale_buf = NULL;
+       return &localebuf;
+}
+#endif /* defined LOCALE_HOME */
diff --git a/commands/zoneinfo/systemv b/commands/zoneinfo/systemv
new file mode 100644 (file)
index 0000000..6cf9645
--- /dev/null
@@ -0,0 +1,36 @@
+# @(#)systemv  8.1
+
+# Old rules, should the need arise.
+# No attempt is made to handle Newfoundland, since it cannot be expressed
+# using the System V "TZ" scheme (half-hour offset), or anything outside
+# North America (no support for non-standard DST start/end dates), nor
+# the changes in the DST rules in the US after 1976 (which occurred after
+# the old rules were written).
+#
+# If you need the old rules, uncomment ## lines.
+# Compile this *without* leap second correction for true conformance.
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   SystemV min     1973    -       Apr     lastSun 2:00    1:00    D
+Rule   SystemV min     1973    -       Oct     lastSun 2:00    0       S
+Rule   SystemV 1974    only    -       Jan     6       2:00    1:00    D
+Rule   SystemV 1974    only    -       Nov     lastSun 2:00    0       S
+Rule   SystemV 1975    only    -       Feb     23      2:00    1:00    D
+Rule   SystemV 1975    only    -       Oct     lastSun 2:00    0       S
+Rule   SystemV 1976    max     -       Apr     lastSun 2:00    1:00    D
+Rule   SystemV 1976    max     -       Oct     lastSun 2:00    0       S
+
+# Zone NAME            GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+## Zone        SystemV/AST4ADT -4:00   SystemV         A%sT
+## Zone        SystemV/EST5EDT -5:00   SystemV         E%sT
+## Zone        SystemV/CST6CDT -6:00   SystemV         C%sT
+## Zone        SystemV/MST7MDT -7:00   SystemV         M%sT
+## Zone        SystemV/PST8PDT -8:00   SystemV         P%sT
+## Zone        SystemV/YST9YDT -9:00   SystemV         Y%sT
+## Zone        SystemV/AST4    -4:00   -               AST
+## Zone        SystemV/EST5    -5:00   -               EST
+## Zone        SystemV/CST6    -6:00   -               CST
+## Zone        SystemV/MST7    -7:00   -               MST
+## Zone        SystemV/PST8    -8:00   -               PST
+## Zone        SystemV/YST9    -9:00   -               YST
+## Zone        SystemV/HST10   -10:00  -               HST
diff --git a/commands/zoneinfo/time2posix.3 b/commands/zoneinfo/time2posix.3
new file mode 100644 (file)
index 0000000..3ce2e0e
--- /dev/null
@@ -0,0 +1,121 @@
+.TH TIME2POSIX 3
+.SH NAME
+time2posix, posix2time \- convert seconds since the Epoch
+.SH SYNOPSIS
+.nf
+.B #include <sys/types.h>
+.B #include <time.h>
+.PP
+.B time_t time2posix(t)
+.B time_t t
+.PP
+.B time_t posix2time(t)
+.B time_t t
+.PP
+.B cc ... -ltz
+.fi
+.SH DESCRIPTION
+IEEE Standard 1003.1
+(POSIX)
+legislates that a time_t value of
+536457599 shall correspond to "Wed Dec 31 23:59:59 UTC 1986."
+This effectively implies that POSIX time_t's cannot include leap
+seconds and,
+therefore,
+that the system time must be adjusted as each leap occurs.
+.PP
+If the time package is configured with leap-second support
+enabled,
+however,
+no such adjustment is needed and
+time_t values continue to increase over leap events
+(as a true `seconds since...' value).
+This means that these values will differ from those required by POSIX
+by the net number of leap seconds inserted since the Epoch.
+.PP
+Typically this is not a problem as the type time_t is intended
+to be
+(mostly)
+opaque\(emtime_t values should only be obtained-from and
+passed-to functions such as
+.IR time(2) ,
+.IR localtime(3) ,
+.IR mktime(3) ,
+and
+.IR difftime(3) .
+However,
+POSIX gives an arithmetic
+expression for directly computing a time_t value from a given date/time,
+and the same relationship is assumed by some
+(usually older)
+applications.
+Any programs creating/dissecting time_t's
+using such a relationship will typically not handle intervals
+over leap seconds correctly.
+.PP
+The
+.I time2posix
+and
+.I posix2time
+functions are provided to address this time_t mismatch by converting
+between local time_t values and their POSIX equivalents.
+This is done by accounting for the number of time-base changes that
+would have taken place on a POSIX system as leap seconds were inserted
+or deleted.
+These converted values can then be used in lieu of correcting the older
+applications,
+or when communicating with POSIX-compliant systems.
+.PP
+.I Time2posix
+is single-valued.
+That is,
+every local time_t
+corresponds to a single POSIX time_t.
+.I Posix2time
+is less well-behaved:
+for a positive leap second hit the result is not unique,
+and for a negative leap second hit the corresponding
+POSIX time_t doesn't exist so an adjacent value is returned.
+Both of these are good indicators of the inferiority of the
+POSIX representation.
+.PP
+The following table summarizes the relationship between a time
+T and it's conversion to,
+and back from,
+the POSIX representation over the leap second inserted at the end of June,
+1993.
+.nf
+.ta \w'93/06/30 'u +\w'23:59:59 'u +\w'A+0 'u +\w'X=time2posix(T) 'u
+DATE   TIME    T       X=time2posix(T) posix2time(X)
+93/06/30       23:59:59        A+0     B+0     A+0
+93/06/30       23:59:60        A+1     B+1     A+1 or A+2
+93/07/01       00:00:00        A+2     B+1     A+1 or A+2
+93/07/01       00:00:01        A+3     B+2     A+3
+
+A leap second deletion would look like...
+
+DATE   TIME    T       X=time2posix(T) posix2time(X)
+??/06/30       23:59:58        A+0     B+0     A+0
+??/07/01       00:00:00        A+1     B+2     A+1
+??/07/01       00:00:01        A+2     B+3     A+2
+.sp
+.ce
+       [Note: posix2time(B+1) => A+0 or A+1]
+.fi
+.PP
+If leap-second support is not enabled,
+local time_t's and
+POSIX time_t's are equivalent,
+and both
+.I time2posix
+and
+.I posix2time
+degenerate to the identity function.
+.SH SEE ALSO
+difftime(3),
+localtime(3),
+mktime(3),
+time(2)
+.\" @(#)time2posix.3   7.8
+.\" This file is in the public domain, so clarified as of
+.\" 1996-06-05 by Arthur David Olson.
diff --git a/commands/zoneinfo/time2posix.3.txt b/commands/zoneinfo/time2posix.3.txt
new file mode 100644 (file)
index 0000000..b61e4c7
--- /dev/null
@@ -0,0 +1,83 @@
+NAME
+
+     time2posix, posix2time - convert seconds since the Epoch
+
+SYNOPSIS
+     #include <sys/types.h>
+     #include <time.h>
+
+     time_t time2posix(t)
+     time_t t
+
+     time_t posix2time(t)
+     time_t t
+
+     cc ... -ltz
+
+DESCRIPTION
+     IEEE Standard 1003.1 (POSIX) legislates that a time_t value
+     of 536457599 shall correspond to "Wed Dec 31 23:59:59 UTC
+     1986."  This effectively implies that POSIX time_t's cannot
+     include leap seconds and, therefore, that the system time
+     must be adjusted as each leap occurs.
+
+     If the time package is configured with leap-second support
+     enabled, however, no such adjustment is needed and time_t
+     values continue to increase over leap events (as a true
+     `seconds since...' value).  This means that these values
+     will differ from those required by POSIX by the net number
+     of leap seconds inserted since the Epoch.
+
+     Typically this is not a problem as the type time_t is
+     intended to be (mostly) opaque-time_t values should only be
+     obtained-from and passed-to functions such as time(2),
+     localtime(3), mktime(3), and difftime(3).  However, POSIX
+     gives an arithmetic expression for directly computing a
+     time_t value from a given date/time, and the same
+     relationship is assumed by some (usually older)
+     applications.  Any programs creating/dissecting time_t's
+     using such a relationship will typically not handle
+     intervals over leap seconds correctly.
+
+     The time2posix and posix2time functions are provided to
+     address this time_t mismatch by converting between local
+     time_t values and their POSIX equivalents.  This is done by
+     accounting for the number of time-base changes that would
+     have taken place on a POSIX system as leap seconds were
+     inserted or deleted.  These converted values can then be
+     used in lieu of correcting the older applications, or when
+     communicating with POSIX-compliant systems.
+
+     Time2posix is single-valued.  That is, every local time_t
+     corresponds to a single POSIX time_t.  Posix2time is less
+     well-behaved:  for a positive leap second hit the result is
+     not unique, and for a negative leap second hit the
+     corresponding POSIX time_t doesn't exist so an adjacent
+     value is returned.  Both of these are good indicators of the
+     inferiority of the POSIX representation.
+
+     The following table summarizes the relationship between a
+     time T and it's conversion to, and back from, the POSIX
+     representation over the leap second inserted at the end of
+     June, 1993.
+     DATE     TIME     T   X=time2posix(T) posix2time(X)
+     93/06/30 23:59:59 A+0 B+0             A+0
+     93/06/30 23:59:60 A+1 B+1             A+1 or A+2
+     93/07/01 00:00:00 A+2 B+1             A+1 or A+2
+     93/07/01 00:00:01 A+3 B+2             A+3
+
+     A leap second deletion would look like...
+
+     DATE     TIME     T   X=time2posix(T) posix2time(X)
+     ??/06/30 23:59:58 A+0 B+0             A+0
+     ??/07/01 00:00:00 A+1 B+2             A+1
+     ??/07/01 00:00:01 A+2 B+3             A+2
+
+                     [Note: posix2time(B+1) => A+0 or A+1]
+
+     If leap-second support is not enabled, local time_t's and
+     POSIX time_t's are equivalent, and both time2posix and
+     posix2time degenerate to the identity function.
+
+SEE ALSO
+     difftime(3), localtime(3), mktime(3), time(2)
diff --git a/commands/zoneinfo/tz-art.htm b/commands/zoneinfo/tz-art.htm
new file mode 100644 (file)
index 0000000..4abbd51
--- /dev/null
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!DOCTYPE html
+PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+"DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-type" content='text/html; charset="US-ASCII"' />
+<title>Time and the Arts</title>
+</head>
+<body>
+<h1>Time and the Arts</h1>
+<address>
+@(#)tz-art.htm 7.59
+</address>
+<p>
+Please send corrections to this web page to the
+<a href="mailto:tz@elsie.nci.nih.gov">time zone mailing list</a>.</p>
+<p>
+See also <a href="tz-link.htm">Sources for Time Zone and Daylight Saving Time Data</a>.</p>
+<hr />
+<p>
+Data on recordings of "Save That Time," Russ Long, Serrob Publishing, BMI:</p>
+<table>
+<tr><td>Artist</td><td>Karrin Allyson</td></tr>
+<tr><td>CD</td><td>I Didn't Know About You</td></tr>
+<tr><td>Copyright Date</td><td>1993</td></tr>
+<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
+<tr><td>ID</td><td>CCD-4543</td></tr>
+<tr><td>Track Time</td><td>3:44</td></tr>
+<tr><td>Personnel</td><td>Karrin Allyson, vocal;
+Russ Long, piano;
+Gerald Spaits, bass;
+Todd Strait, drums</td></tr>
+<tr><td>Notes</td><td>CD notes "additional lyric by Karrin Allyson;
+arranged by Russ Long and Karrin Allyson"</td></tr>
+<tr><td>ADO Rating</td><td>1 star</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=A1fdovw9ta92k">AMG Rating</a></td><td>4 stars</td></tr>
+<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Kevin Mahogany</td></tr>
+<tr><td>CD</td><td>Double Rainbow</td></tr>
+<tr><td>Copyright Date</td><td>1993</td></tr>
+<tr><td>Label</td><td>Enja Records</td></tr>
+<tr><td>ID</td><td>ENJ-7097 2</td></tr>
+<tr><td>Track Time</td><td>6:27</td></tr>
+<tr><td>Personnel</td><td>Kevin Mahogany, vocal;
+Kenny Barron, piano;
+Ray Drummond, bass;
+Ralph Moore, tenor saxophone;
+Lewis Nash, drums</td></tr>
+<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=Akikbikzjbb19">AMG Rating</a></td><td>3 stars</td></tr>
+<tr><td>Penguin Rating</td><td>3 stars</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Joe Williams</td></tr>
+<tr><td>CD</td><td>Here's to Life</td></tr>
+<tr><td>Copyright Date</td><td>1994</td></tr>
+<tr><td>Label</td><td>Telarc International Corporation</td></tr>
+<tr><td>ID</td><td>CD-83357</td></tr>
+<tr><td>Track Time</td><td>3:58</td></tr>
+<tr><td>Personnel</td><td>Joe Williams, vocal
+The Robert Farnon [39 piece] Orchestra</td></tr>
+<tr><td>Notes</td><td>This CD is also available as part of a 3-CD package from
+Telarc, "Triple Play" (CD-83461)</td></tr>
+<tr><td>ADO Rating</td><td>black dot</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=Amyyvad6kt8w1">AMG Rating</a></td><td>2 stars</td></tr>
+<tr><td>Penguin Rating</td><td>3 stars</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Charles Fambrough</td></tr>
+<tr><td>CD</td><td>Keeper of the Spirit</td></tr>
+<tr><td>Copyright Date</td><td>1995</td></tr>
+<tr><td>Label</td><td>AudioQuest Music</td></tr>
+<tr><td>ID</td><td>AQ-CD1033</td></tr>
+<tr><td>Track Time</td><td>7:07</td></tr>
+<tr><td>Personnel</td><td>Charles Fambrough, bass;
+Joel Levine, tenor recorder;
+Edward Simon, piano;
+Lenny White, drums;
+Marion Simon, percussion</td></tr>
+<tr><td>Notes</td><td>On-line information and samples available at
+<a href="http://wwmusic.com/~music/audioq/rel/1033.html">http://wwmusic.com/~music/audioq/rel/1033.html</a></td></tr>
+<tr><td>ADO Rating</td><td>2 stars</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=A5rkcikcjbb89">AMG Rating</a></td><td>unrated</td></tr>
+<tr><td>Penguin Rating</td><td>3 stars</td></tr>
+</table>
+<hr />
+<p>Also of note:</p>
+<table>
+<tr><td>Artist</td><td>Holly Cole Trio</td></tr>
+<tr><td>CD</td><td>Blame It On My Youth</td></tr>
+<tr><td>Copyright Date</td><td>1992</td></tr>
+<tr><td>Label</td><td>Manhattan</td></tr>
+<tr><td>ID</td><td>CDP 7 97349 2</td></tr>
+<tr><td>Total Time</td><td>37:45</td></tr>
+<tr><td>Personnel</td><td>Holly Cole, voice;
+Aaron Davis, piano;
+David Piltch, string bass</td></tr>
+<tr><td>Notes</td><td>Lyrical reference to "Eastern Standard Time" in
+Tom Waits' "Purple Avenue"</td></tr>
+<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=A3a9ds37ya3dg">AMG Rating</a></td><td>3 stars</td></tr>
+<tr><td>Penguin Rating</td><td>unrated</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Milt Hinton</td></tr>
+<tr><td>CD</td><td>Old Man Time</td></tr>
+<tr><td>Copyright Date</td><td>1990</td></tr>
+<tr><td>Label</td><td>Chiaroscuro</td></tr>
+<tr><td>ID</td><td>CR(D) 310</td></tr>
+<tr><td>Total Time</td><td>149:38 (two CDs)</td></tr>
+<tr><td>Personnel</td><td>Milt Hinton, bass;
+Doc Cheatham, Dizzy Gillespie, Clark Terry, trumpet;
+Al Grey, trombone;
+Eddie Barefield, Joe Camel (Flip Phillips), Buddy Tate,
+clarinet and saxophone;
+John Bunch, Red Richards, Norman Simmons, Derek Smith,
+Ralph Sutton, piano;
+Danny Barker, Al Casey, guitar;
+Gus Johnson, Gerryck King, Bob Rosengarden, Jackie Williams,
+drums;
+Lionel Hampton, vibraphone;
+Cab Calloway, Joe Williams, vocal;
+Buck Clayton, arrangements</td></tr>
+<tr><td>Notes</td><td>tunes include Old Man Time, Time After Time,
+Sometimes I'm Happy,
+A Hot Time in the Old Town Tonight,
+Four or Five Times, Now's the Time,
+Time on My Hands, This Time It's Us,
+and Good Time Charlie
+On-line samples available at
+<a href="http://www.chiaroscurojazz.com/albuminfo.php4?albumid=49">http://www.chiaroscurojazz.com/albuminfo.php3?albumid=49</a></td></tr>
+<tr><td>ADO Rating</td><td>3 stars</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=A1cbyxdab8ola">AMG Rating</a></td><td>4.5 stars</td></tr>
+<tr><td>Penguin Rating</td><td>3 stars</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Alan Broadbent</td></tr>
+<tr><td>CD</td><td>Pacific Standard Time</td></tr>
+<tr><td>Copyright Date</td><td>1995</td></tr>
+<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
+<tr><td>ID</td><td>CCD-4664</td></tr>
+<tr><td>Total Time</td><td>62:42</td></tr>
+<tr><td>Personnel</td><td>Alan Broadbent, piano;
+Putter Smith, Bass;
+Frank Gibson, Jr., drums</td></tr>
+<tr><td>Notes</td><td>The CD cover features an analemma for equation-of-time fans</td></tr>
+<tr><td>ADO Rating</td><td>1 star</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=Asl8zefuk8gfo">AMG Rating</a></td><td>4 stars</td></tr>
+<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Anthony Braxton/Richard Teitelbaum</td></tr>
+<tr><td>CD</td><td>Silence/Time Zones</td></tr>
+<tr><td>Copyright Date</td><td>1996</td></tr>
+<tr><td>Label</td><td>Black Lion</td></tr>
+<tr><td>ID</td><td>BLCD 760221</td></tr>
+<tr><td>Total Time</td><td>72:58</td></tr>
+<tr><td>Personnel</td><td>Anthony Braxton, sopranino and alto saxophones,
+contrebasse clarinet, miscellaneous instruments;
+Leo Smith, trumpet and miscellaneous instruments;
+Leroy Jenkins, violin and miscellaneous instruments;
+Richard Teitelbaum, modular moog and micromoog synthesizer</td></tr>
+<tr><td>ADO Rating</td><td>black dot</td></tr>
+<tr><td><a href="http://www.allmusic.com/cg/amg.dll?p=amg&amp;sql=A5bkvu3xjan1k">AMG Rating</a></td><td>unrated</td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Artist</td><td>Jules Verne</td></tr>
+<tr><td>Book</td><td>Le Tour du Monde en Quatre-Vingts Jours
+(Around the World in Eighty Days)</td></tr>
+<tr><td>Notes</td><td>Wall-clock time plays a central role in the plot.
+European readers of the 1870s clearly held the U.S. press in
+deep contempt; the protagonists cross the U.S. without once
+reading a paper.
+An on-line French-language version of the book
+"with illustrations from the original 1873 French-language edition"
+is available at
+<a href="http://fourmilab.ch/etexts/www/tdm80j">http://fourmilab.ch/etexts/www/tdm80j</a>
+An on-line English-language translation of the book is available at
+<a href="http://www.literature.org/Works/Jules-Verne/eighty">http://www.literature.org/Works/Jules-Verne/eighty</a></td></tr>
+<tr><td>&nbsp;</td></tr>
+<tr><td>Film</td><td>Bell Science - About Time</td></tr>
+<tr><td>Notes</td><td>The Frank Baxter/Richard Deacon extravaganza.
+Information is available at
+<a href="http://www.videoflicks.com/titles/1035/1035893.htm">http://www.videoflicks.com/titles/1035/1035893.htm</a></td></tr>
+</table>
+<hr />
+<ul>
+<li>
+An episode of "The Adventures of Superman" entitled "The Mysterious
+Cube," first aired 1958-02-24, had Superman convincing the controllers
+of WWV to broadcast time signals five minutes ahead of actual time;
+doing so got a crook trying to beat the statute of limitations to
+emerge a bit too early from the titular enclosure.
+</li>
+<li>
+The 1960s ITC television series "The Prisoner" included an episode
+entitled "The Chimes of Big Ben" in which our protagonist tumbled to
+the fraudulent nature of a Poland-to-England escape upon hearing "Big
+Ben" chiming on Polish local time.
+</li>
+<li>
+The series "Seinfeld" included an episode entitled "The Susie," first
+broadcast 1997-02-13, in which Kramer decides that daylight saving time
+isn't coming fast enough, so he sets his watch ahead an hour.
+</li>
+<li>
+The syndicated comic strip "Dilbert" featured an all-too-rare example of
+time zone humor on 1998-03-14.
+</li>
+<li>
+Surrealist artist Guy Billout's work "Date Line" appeared on page 103
+of the 1999-11 Atlantic Monthly.
+</li>
+<li>
+"Gloom, Gloom, Go Away" by Walter Kirn appeared on page 106 of Time
+Magazine's 2002-11-11 issue; among other things, it proposed
+year-round DST as a way of lessening wintertime despair.
+</li>
+<li>
+The "20 Hours in America" episode of "The West Wing," first aired 2002-09-25,
+saw White House staffers stranded in Indiana; they thought they had time to
+catch Air Force One but were done in by intra-Indiana local time changes.
+</li>
+<li>
+"In what time zone would you find New York City?" was a $200 question on
+the 1999-11-13 United States airing of "Who Wants to Be a Millionaire?"
+"In 1883, what industry led the movement to divide the U.S. into four time
+zones?" was a $32,000 question on the 2001-05-23 United States airing of
+"Who Wants to Be a Millionaire?" At this rate, the million-dollar time-zone
+question should have been asked 2002-06-04.
+</li>
+</ul>
+<hr />
+<ul>
+<li>
+"We're been using the five-cent nickle in this country since 1492.
+Now that's pretty near 100 years, daylight savings [sic]."
+(Groucho Marx as Captain Spaulding in "Animal Crackers", 1930,
+as noted by Will Fitzerald)
+</li>
+<li>
+"Good news."
+"What did they do? Extend Daylight Saving Time year round?"
+(Professional tanner George Hamilton, in dialog from a
+May, 1999 episode of the syndicated television series "Baywatch")
+</li>
+<li>
+"A fundamental belief held by Americans is that if you are on land, you
+cannot be killed by a fish...So most Americans remain on land, believing
+they're safe. Unfortunately, this belief&mdash;like so many myths, such as that
+there's a reason for 'Daylight Saving Time'&mdash;is false."
+(Dave Barry column, 2000-07-02)
+</li>
+<li>
+"I once had sex for an hour and five minutes, but that was on the day
+when you turn the clocks ahead."
+(Garry Shandling, 52nd Annual Emmys, 2000-09-10)
+</li>
+<li>
+"Would it impress you if I told you I invented Daylight Savings Time?"
+("Sahjhan" to "Lilah" in dialog from the "Loyalty" episode of "Angel,"
+originally aired 2002-02-25)
+</li>
+<li>
+"I thought you said Tulsa was a three hour flight."
+"Well, you're forgetting about the time difference."
+("Chandler" and "Joey" in dialog from the episode of "Friends" first
+aired 2002-12-05)
+</li>
+<li>
+"Is that a pertinent fact,
+or are you trying to dazzle me with your command of time zones?"
+(Kelsey Grammer as "Frasier Crane")
+</li>
+<li>
+"Don't worry about the world coming to an end today.
+It is already tomorrow in Australia."
+(Charles M. Schulz, provided by Steve Summit)
+</li>
+</ul>
+</body>
+</html>
diff --git a/commands/zoneinfo/tz-link.htm b/commands/zoneinfo/tz-link.htm
new file mode 100644 (file)
index 0000000..17b8d7f
--- /dev/null
@@ -0,0 +1,589 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<!DOCTYPE html
+       PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+       "DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>Sources for Time Zone and Daylight Saving Time Data</title>
+<link rel="schema.DC" href="http://purl.org/DC/elements/1.1/" />
+<meta http-equiv="Content-type" content='text/html; charset="US-ASCII"' />
+<meta name="DC.Creator" content="Eggert, Paul" />
+<meta name="DC.Contributor" content="Olson, Arthur David" />
+<meta name="DC.Date" content="2006-01-20" />
+<meta name="DC.Description"
+ content="Sources of information about time zones and daylight saving time" />
+<meta name="DC.Identifier" content="http://www.twinsun.com/tz/tz-link.htm" />
+<meta name="Keywords"
+ content="database,daylight saving,DST,time zone,timezone,tz,zoneinfo" />
+</head>
+<body>
+<h1>Sources for Time Zone and Daylight Saving Time Data</h1>
+<address>
+@(#)tz-link.htm        7.54
+</address>
+<p>
+Please send corrections to this web page to the
+<a href="mailto:tz@elsie.nci.nih.gov">time zone mailing list</a>.</p>
+<h2>The <code>tz</code> database</h2>
+<p>
+The public-domain time zone database contains code and data
+that represent the history of local time
+for many representative locations around the globe.
+It is updated periodically to reflect changes made by political bodies
+to <a href="http://en.wikipedia.org/wiki/Time_zone">time zone</a>
+boundaries, <a
+href="http://en.wikipedia.org/wiki/Coordinated_Universal_Time"><abbr
+title="Coordinated Universal Time">UTC</abbr></a> offsets, and
+<a href="http://en.wikipedia.org/wiki/Daylight_saving">daylight-saving</a>
+rules.
+This database (often called <code>tz</code> or <code>zoneinfo</code>)
+is used by several implementations,
+including
+<a href="http://www.gnu.org/software/libc/">the
+<abbr title="GNU's Not Unix">GNU</abbr>
+C Library</a> used in
+<a href="http://www.linux.org/"><abbr>GNU</abbr>/Linux</a>,
+<a href="http://www.freebsd.org/">FreeBSD</a>,
+<a href="http://www.netbsd.org/">NetBSD</a>,
+<a href="http://www.openbsd.org/">OpenBSD</a>,
+<a href="http://www.cygwin.com/">Cygwin</a>,
+<a href="http://www.delorie.com/djgpp/"><abbr
+title="DJ's GNU Programming Platform">DJGPP</abbr></a>,
+<a href="http://www.hp.com/products1/unix/operating/">HP-UX</a>,
+<a href="http://www.sgi.com/developers/technology/irix/">IRIX</a>,
+<a href="http://www.apple.com/macosx/">Mac OS X</a>,
+<a href="http://h71000.www7.hp.com/">OpenVMS</a>,
+<a href="http://www.sun.com/software/solaris/">Solaris</a>,
+<a href="http://h30097.www3.hp.com/">Tru64</a>, and
+<a href="http://www.sco.com/products/unixware/">UnixWare</a>.</p>
+<p>
+Each location in the database represents a national region where all
+clocks keeping local time have agreed since 1970.
+Locations are identified by continent or ocean and then by the name of
+the location, which is typically the largest city within the region.
+For example, <code>America/New_York</code>
+represents most of the <abbr title="United States">US</abbr> eastern time zone;
+<code>America/Phoenix</code> represents most of Arizona, which
+uses mountain time without daylight saving time (<abbr
+title="daylight saving time">DST</abbr>);
+<code>America/Detroit</code> represents most of Michigan, which uses
+eastern time but with different <abbr>DST</abbr> rules in 1975;
+and other entries represent smaller regions like Starke County,
+Indiana, which switched from central to eastern time in 1991
+and switched back in 2006.
+To use the database on an extended <a
+href="http://en.wikipedia.org/wiki/POSIX"><abbr
+title="Portable Operating System Interface">POSIX</abbr></a>
+implementation set the <code>TZ</code> environment variable to
+the location's full name, e.g., <code>TZ="America/New_York"</code>.</p>
+<p>
+In the <code>tz</code> database's
+<a href="ftp://elsie.nci.nih.gov/pub/"><abbr
+title="File Transfer Protocol">FTP</abbr> distribution</a>
+the code is in the file <code>tzcode<var>C</var>.tar.gz</code>,
+where <code><var>C</var></code> is the code's version;
+similarly, the data are in <code>tzdata<var>D</var>.tar.gz</code>,
+where <code><var>D</var></code> is the data's version.
+The following shell commands download
+these files to a <abbr>GNU</abbr>/Linux or similar host;
+see the downloaded
+<code>README</code> file for what to do next.</p>
+<pre style="margin-left: 2em"><code><a href="http://www.gnu.org/software/wget/">wget</a> 'ftp://elsie.nci.nih.gov/pub/tz*.tar.gz'
+<a href="http://www.gnu.org/software/gzip/">gzip</a> -dc tzcode*.tar.gz | <a href="http://www.gnu.org/software/tar/">tar</a> -xf -
+gzip -dc tzdata*.tar.gz | tar -xf -
+</code></pre>
+<p>
+The code lets you compile the <code>tz</code> source files into
+machine-readable binary files, one for each location. It also lets
+you read a <code>tz</code> binary file and interpret time stamps for that
+location.</p>
+<p>
+The data are by no means authoritative. If you find errors, please
+send changes to the <a href="mailto:tz@elsie.nci.nih.gov">time zone
+mailing list</a>. You can also <a
+href="mailto:tz-request@elsie.nci.nih.gov">subscribe</a> to the
+mailing list, retrieve the <a
+href="ftp://elsie.nci.nih.gov/pub/tzarchive.gz">archive of old
+messages</a> (in gzip compressed format), or retrieve <a
+href="ftp://munnari.oz.au/pub/oldtz/">archived older versions of code
+and data</a>; there is also a smaller <a
+href="http://public.planetmirror.com/pub/timezone/"><abbr
+title="Hypertext Transfer Protocol">HTTP</abbr>
+mirror</a>.</p>
+<p>
+The Web has several other sources for time zone and daylight saving time data.
+Here are some recent links that may be of interest.
+</p>
+<h2>Web pages using recent versions of the <code>tz</code> database</h2>
+<ul>
+<li><a href="http://twiki.org/cgi-bin/xtra/tzdatepick.html">Date and Time Gateway</a>
+is a text-based point-and-click interface to tables of current time
+throughout the world.</li>
+<li>Fancier web interfaces, roughly in ascending order of complexity, include:
+<ul>
+<li><a
+href="http://www.convertit.com/Go/ConvertIt/World_Time/Current_Time.ASP">Current
+Time in 1000 Places</a></li>
+<li><a href="http://timezoneconverter.com/">Time Zone Converter</a></li>
+</ul></li>
+<li><a href="http://www.timeanddate.com/worldclock/">The World Clock -
+Time Zones</a>
+is a web interface to a time zone database derived from
+<code>tz</code>'s.</li>
+</ul>
+<h2>Other time zone database formats</h2>
+<ul>
+<li>The <a href="ftp://ftp.rfc-editor.org/in-notes/rfc2445.txt">
+Internet Calendaring and Scheduling Core Object Specification
+(iCalendar)</a> specification published by the (now-concluded) <a
+href="http://www.ietf.org/html.charters/OLD/calsch-charter.html"><abbr
+title="Internet Engineering Task Force">IETF</abbr>
+Calendaring and Scheduling Working Group (<abbr
+title="Calendaring and Scheduling Working Group">calsch</abbr>)</a>
+covers time zone
+data; see its VTIMEZONE calendar component.
+The <a href="http://www.calconnect.org/">Calendaring and Scheduling
+Consortium</a> is promoting further work in this area. <a
+href="ftp://ftp.rfc-editor.org/internet-drafts/draft-royer-ical-basic-04.txt">iCalendar
+Basic</a> is a draft simplified definition that omits VTIMEZONE due to
+its complexity, but this removal is expected to appear as an
+independent specification later.</li>
+<li><a
+href="ftp://ftp.rfc-editor.org/internet-drafts/draft-royer-timezone-registry-03.txt">Time
+Zone Registry</a> proposes an <a href="http://www.iana.org/"><abbr
+title="Internet Assigned Numbers Authority">IANA</abbr></a> time zone
+registration process that would establish unique names for each
+version of each <code>tz</code> zone, along with a polygonal
+representation of the geographical area corresponding to the
+zone.</li>
+<li>The <a
+href="http://lists.w3.org/Archives/Public/www-rdf-calendar/">www-rdf-calendar</a>
+list discusses <a
+href="http://www.w3.org/RDF/"><abbr
+title="Resource Description Framework">RDF</abbr></a>-based calendar
+and group scheduling systems, and has a <a
+href="http://www.w3.org/2002/12/cal/#tzd">workspace on time zone
+data</a> converted from <code>tz</code>. An earlier <a
+href="http://www.w3.org/2000/01/foo">schema</a> was sketched out.</li>
+<li><a
+href="ftp://ftp.rfc-editor.org/internet-drafts/draft-royer-calsch-xcal-03.txt"><abbr
+title="iCalendar in XML Format">xCal-Basic</abbr></a>
+is a draft <a
+href="http://www.w3.org/XML/"><abbr
+title="Extensible Markup Language">XML</abbr></a> document type
+definition that corresponds to iCalendar.</li>
+</ul>
+<h2>Other <code>tz</code> compilers</h2>
+<ul>
+<li><a href="http://dialspace.dial.pipex.com/prod/dialspace/town/pipexdsl/s/asbm26/vzic/">Vzic iCalendar
+Timezone Converter</a> describes a program Vzic that compiles
+<code>tz</code> source into iCalendar-compatible VTIMEZONE files.
+Vzic is freely
+available under the <a
+href="http://www.gnu.org/copyleft/gpl.html"><abbr>GNU</abbr>
+General Public License (<abbr
+title="General Public License">GPL</abbr>)</a>.</li>
+<li><a
+href="http://search.cpan.org/dist/DateTime-TimeZone/">DateTime::TimeZone</a>
+contains a script <code>parse_olson</code> that compiles
+<code>tz</code> source into <a href="http://www.perl.org/">Perl</a>
+modules. It is part of the Perl <a
+href="http://datetime.perl.org/">DateTime Project</a>, which is freely
+available under both the <abbr>GPL</abbr> and the Perl Artistic
+License. DateTime::TimeZone also contains a script
+<code>tests_from_zdump</code> that generates test cases for each clock
+transition in the <code>tz</code> database.</li>
+<li><a href="http://www-306.ibm.com/software/globalization/icu/"><abbr
+title="International Components for Unicode">ICU</abbr></a>
+contains a C/C++ library for internationalization that
+has a compiler from <code>tz</code> source
+into an <abbr>ICU</abbr>-specific format.
+<abbr>ICU</abbr> is freely available under a
+<abbr title="Berkeley Software Distribution">BSD</abbr>-style license.</li>
+<li><a href="http://joda-time.sourceforge.net/">Joda Time - Java date
+and time <abbr title="Application Program Interface">API</abbr></a>
+contains a class
+<code>org.joda.time.tz.ZoneInfoCompiler</code> that compiles
+<code>tz</code> source into a Joda-specific binary format. Joda Time
+is freely available under a <abbr>BSD</abbr>-style license.</li>
+<li><a href="http://sourceforge.net/projects/pytz/">PyTZ - Python Time
+Zone Library</a> compiles <code>tz</code> source into
+<a href="http://www.python.org/">Python</a>.
+It is freely available under a <abbr>BSD</abbr>-style license.</li>
+<li><a href="http://tzinfo.rubyforge.org/">TZInfo - Ruby Timezone Library</a>
+compiles <code>tz</code> source into
+<a href="http://www.ruby-lang.org/">Ruby</a>.
+It is freely available under the <abbr
+title="Massachusetts Institute of Technology">MIT</abbr> license.</li>
+</ul>
+<h2>Other <code>tz</code> binary file readers</h2>
+<ul>
+<li>The <a
+href="http://www.gnu.org/software/libc/"><abbr>GNU</abbr> C
+Library</a>
+has an independent, thread-safe implementation of
+a <code>tz</code> binary file reader.
+This library is freely available under the
+<a href="http://www.gnu.org/copyleft/lesser.html">
+<abbr>GNU</abbr> Lesser General Public License
+(<abbr title="Lesser General Public License">LGPL</abbr>)</a>,
+and is widely used in <abbr>GNU</abbr>/Linux systems.</li>
+<li><a href="http://www.bmsi.com/java/#TZ">ZoneInfo.java</a>
+is a <code>tz</code> binary file reader written in Java.
+It is freely available under the <abbr>LGPL</abbr>.</li>
+<li><a href="http://s.keim.free.fr/tz/doc.html">Python time zones</a>
+is a <code>tz</code> binary file reader written in Python.
+It is freely available under a <abbr>BSD</abbr>-style license.</li>
+</ul>
+<h2>Other <code>tz</code>-based time zone software</h2>
+<ul>
+<li><a
+href="http://users.skynet.be/Peter.Verthez/projects/intclock/">International
+clock (intclock)</a> is a multi-timezone clock for
+<abbr>GNU</abbr>/Linux and similar systems. It is freely available
+under the <abbr>GPL</abbr>.</li>
+<li><a href="http://java.sun.com/">Sun Java</a> releases since 1.4
+contain a copy of a subset of a recent <code>tz</code> database in a
+Java-specific format.</li>
+<li><a
+href="http://www1.tip.nl/~t876506/AboutTimeZonesHC.html">HyperCard
+time zones calculator</a> was a HyperCard stack.</li>
+<li><a
+href="http://www.veladg.com/velaterra.html">VelaTerra</a> is
+a Mac OS X program. Its developers
+<a href="http://www.veladg.com/tzoffer.html">offer free
+licenses</a> to <code>tz</code> contributors.</li>
+<li><a
+href="http://www.cimmyt.org/timezone/">World Time Explorer</a> is a
+Microsoft Windows program.</li>
+</ul>
+<h2>Other time zone databases</h2>
+<ul>
+<li><a href="http://www.astro.com/cgi/aq.cgi?lang=e">Atlas Query</a>
+is Astrodienst's Web version of Shanks's
+excellent time zone history atlases published in both <a
+href="http://astrocom.com/products/software.php?software_id=ibmwboth">computer</a>
+and book form (<a
+href="http://astrocom.com/products/book.php?book_id=b110x">one volume
+for the USA</a>, and <a
+href="http://astrocom.com/products/book.php?book_id=b112x">one for
+other locations</a>) by <a
+href="http://astrocom.com/">Astro Communications Services</a>.</li>
+<li><a href="http://worldtime.com/">WORLDTIME: interactive atlas,
+time info, public holidays</a>
+contains information on local time, sunrise and sunset,
+and public holidays in several hundred cities around the world.</li>
+<li><a href="http://www.worldtimeserver.com/">World Time Server</a>
+is another time zone database.</li>
+<li><a href="http://tycho.usno.navy.mil/tzones.html">World Time Zones</a>
+contains data from the Time Service Department of the
+<abbr>US</abbr> Naval Observatory, used as the source
+for the <code>usno*</code> files in the <code>tz</code> distribution.</li>
+<li>The <a href="http://www.iata.org/ps/publications/9179.htm">Standard
+Schedules Information Manual</a> of the
+<a href="http://www.iata.org/index.htm">International Air Transport
+Association</a>
+gives current time zone rules for airports served by commercial aviation.</li>
+</ul>
+<h2>Maps</h2>
+<ul>
+<li>The <a href="http://www.odci.gov/">United States Central
+Intelligence Agency (<abbr
+title="Central Intelligence Agency">CIA</abbr>)</a> publishes a <a
+href="http://www.odci.gov/cia/publications/factbook/reference_maps/pdf/time_zones.pdf">time
+zone map</a>; the
+<a
+href="http://www.lib.utexas.edu/maps/world.html">Perry-Casta&ntilde;eda
+Library Map Collection</a>
+of the University of Texas at Austin has copies of
+recent editions.
+The pictorial quality is good,
+but the maps do not indicate summer time,
+and parts of the data are a few years out of date.</li>
+<li><a href="http://worldtimezone.com/">Current time around the world
+and standard time zones map of the world</a>
+has several fancy time zone maps; it covers Russia particularly well.
+The maps' pictorial quality is not quite as good as the
+<abbr>CIA</abbr>'s
+but the maps are more up to date.</li>
+</ul>
+<h2>Time zone boundaries</h2>
+<ul>
+<li><a href="http://www.statoids.com/statoids.html">Administrative Divisions
+of Countries ("Statoids")</a> contains detailed lists of
+<code>tz</code>-related zone subdivision data.</li>
+<li><a href="http://home-4.tiscali.nl/~t876506/Multizones.html">Time
+zone boundaries for multizone countries</a> summarizes legal
+boundaries between time zones within countries.</li>
+<li>Manifold.net's <a
+href="http://www.manifold.net/download/freemaps.html">Free Maps and
+<abbr title="Geographic Information Systems">GIS</abbr>
+Data</a> includes a Manifold-format map of
+world time zone boundaries distributed under the
+<abbr>GPL</abbr>.</li>
+<li>The <abbr>US</abbr> Geological Survey's National Atlas of
+the United States
+publishes the <a href="http://nationalatlas.gov/mld/timeznp.html">Time
+Zones of the United States</a> in the public domain.</li>
+<li>The GeoCommunity lists several commercial sources for <a
+href="http://spatialnews.geocomm.com/features/timezones/">International
+Time Zones and Time Zone Data</a>.</li>
+</ul>
+<h2>Civil time concepts and history</h2>
+<ul>
+<li><a href="http://physics.nist.gov/GenInt/Time/time.html">A
+Walk through Time</a>
+surveys the evolution of timekeeping.</li>
+<li><a href="http://webexhibits.org/daylightsaving/">About Daylight
+Saving Time - History, rationale, laws &amp; dates</a>
+is an overall history of <abbr>DST</abbr>.</li>
+<li><a href="http://www.energy.ca.gov/daylightsaving.html">Saving Time,
+Saving Energy</a> discusses a primary justification for <abbr>DST</abbr>.</li>
+<li><a href="http://www.seizethedaylight.com/dst/">Who Knew? A Brief
+History of Daylight Saving Time</a> summarizes some of the contentious
+history of <abbr>DST</abbr>.</li>
+<li><a href="http://toi.iriti.cnr.it/">The
+Time of Internet</a>
+describes time zones and daylight saving time,
+with diagrams.
+The time zone map is out of date, however.</li>
+<li><a href="http://www.phys.uu.nl/~vgent/idl/idl.htm">A History of
+the International Date Line</a> tells the story of the most important
+time zone boundary.</li>
+<li><a href="http://www.statoids.com/tconcept.html">Basic Time
+Zone Concepts</a> discusses terminological issues behind time zones.</li>
+</ul>
+<h2>National histories of legal time</h2>
+<dl>
+<dt>Australia</dt>
+<dd>The Bureau of Metrology publishes a list of
+<a href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml">Implementation Dates of Daylight Savings Time within Australia</a>.</dd>
+<dt>Austria</dt>
+<dd>The Federal Office of Metrology and Surveying publishes a
+table of <a href="http://www.metrologie.at/pdf/sommerzeit.pdf"
+hreflang="de">daylight saving time in Austria (in German)</a>.</dd>
+<dt>Belgium</dt>
+<dd>The Royal Observatory of Belgium maintains a table of <a
+href="http://www.astro.oma.be/GENERAL/INFO/nli001a.html"
+hreflang="nl">time in Belgium (in Dutch)</a>.</dd>
+<dt>Brazil</dt>
+<dd>The Time Service Department of the National Observatory
+records <a href="http://pcdsh01.on.br/DecHV.html"
+hreflang="pt-BR">Brazil's daylight saving time decrees (in
+Portuguese)</a>.</dd>
+<dt>Canada</dt>
+<dd>The Institute for National Measurement Standards publishes current
+and some older information about <a
+href="http://inms-ienm.nrc-cnrc.gc.ca/en/time_services/daylight_saving_e.php">Time
+Zones &amp; Daylight Saving Time</a>.</dd>
+<dt>Chile</dt>
+<dd>WebExhibits publishes a <a
+href="http://webexhibits.org/daylightsaving/chile.html"
+hreflang="es">history of official time (in Spanish)</a> originally
+written by the Chilean Hydrographic and Oceanographic Service.</dd>
+<dt>Germany</dt>
+<dd>The National Institute for Science and Technology maintains the <a
+href="http://www.ptb.de/en/org/4/44/441/dars_e.htm">Realisation of
+Legal Time in Germany</a>.</dd>
+<dt>Israel</dt>
+<dd>The Interior Ministry periodically issues <a
+href="ftp://ftp.cs.huji.ac.il/pub/tz/announcements/"
+hreflang="he">announcements (in Hebrew)</a>.</dd>
+<dt>Mexico</dt>
+<dd>The Investigation and Analysis Service of the Mexican Library of
+Congress has published a <a
+href="http://www.cddhcu.gob.mx/bibliot/publica/inveyana/polisoc/horver/"
+hreflang="es">history of Mexican local time (in Spanish)</a>.</dd>
+<dt>Malaysia</dt>
+<dd>See Singapore below.</dd>
+<dt>Netherlands</dt>
+<dd><a href="http://www.phys.uu.nl/~vgent/wettijd/wettijd.htm"
+hreflang="nl">Legal time in the Netherlands (in Dutch)</a>
+covers the history of local time in the Netherlands from ancient times.</dd>
+<dt>New Zealand</dt>
+<dd>The Department of Internal Affairs maintains a brief history <a
+href="http://www.dia.govt.nz/diawebsite.nsf/wpg_URL/Resource-material-Information-We-Provide-About-Daylight-Saving">About
+Daylight Saving</a>. The privately-maintained <a
+href="http://www.astrologyschool.com/nztime.html">History of New Zealand
+time</a> has more details.</dd>
+<dt>Norway</dt>
+<dd>The Norwegian Meteorological Institute lists
+<a href="http://met.no/met/met_lex/q_u/sommertid.html" hreflang="no">Summer
+time in Norway (in Norwegian)</a>, citing the
+Institute of Theoretical Astrophysics, Oslo.</dd>
+<dt>Singapore</dt>
+<dd><a
+href="http://www.math.nus.edu.sg/aslaksen/teaching/timezone.html">Why
+is Singapore in the "Wrong" Time Zone?</a> details the
+history of legal time in Singapore and Malaysia.</dd>
+<dt>United Kingdom</dt>
+<dd><a
+href="http://www.srcf.ucam.org/~jsm28/british-time/">History of
+legal time in Britain</a> discusses in detail the country
+with perhaps the best-documented history of clock adjustments.
+The National Physical Laboratory also maintains an <a
+href="http://www.npl.co.uk/time/summer_time_archive.html">Archive
+of Summer time dates</a>.</dd>
+</dl>
+<h2>Precision timekeeping</h2>
+<ul>
+<li><a
+href="http://literature.agilent.com/litweb/pdf/5965-7984E.pdf">The
+Science of Timekeeping</a> is a thorough introduction
+to the theory and practice of precision timekeeping.</li>
+<li><a href="http://www.ntp.org/"><abbr
+title="Network Time Protocol">NTP</abbr>: The Network
+Time Protocol</a>
+discusses how to synchronize clocks of
+Internet hosts.</li>
+<li><a href="http://gauss.gge.unb.ca/GMT.UT.and.the.RGO.html">A Few
+Facts Concerning <abbr title="Greenwich Mean Time">GMT</abbr>, <abbr
+title="Universal Time">UT</abbr>, and
+the <abbr title="Royal Greenwich Observatory">RGO</abbr></a>
+answers questions like "What is the
+difference between <abbr>GMT</abbr> and <abbr>UTC</abbr>?"</li>
+<li><a
+href="http://www.cv.nrao.edu/~rfisher/Ephemerides/times.html">Astronomical
+Times</a> explains more abstruse astronomical time scales like
+<abbr title="Terrestrial Dynamic Time">TDT</abbr>,
+<abbr title="Geocentric Coordinate Time">TCG</abbr>, and
+<abbr title="Barycentric Dynamic Time">TDB</abbr>.
+<a href="http://www.ucolick.org/~sla/leapsecs/timescales.html">Time
+Scales</a> goes into more detail, particularly for historical variants.</li>
+<li>The <a href="http://www.iau.org/"><abbr
+title="International Astronomical Union">IAU</abbr></a>'s <a
+href="http://www.iau-sofa.rl.ac.uk/"><abbr
+title="Standards Of Fundamental Astronomy">SOFA</abbr></a>
+initiative publishes Fortran
+code for converting among time scales like
+<abbr title="International Atomic Time">TAI</abbr>,
+<abbr>TDB</abbr>, <abbr>TDT</abbr> and
+<abbr>UTC</abbr>.</li>
+<li><a href="http://www.jpl.nasa.gov/basics/bsf2-3.htm">Basics of
+Space Flight - Reference Systems - Time Conventions</a>
+briefly explains interplanetary space flight timekeeping.</li>
+<li><a
+href="http://www.giss.nasa.gov/tools/mars24/help/notes.html">Technical
+Notes on Mars Solar Time as Adopted by the Mars24 Sunclock</a> briefly
+describes Mars Coordinated Time (<abbr
+title="Mars Coordinated Time">MTC</abbr>) and the
+diverse local time
+scales used by each landed mission on Mars.</li>
+<li><a href="http://www.leapsecond.com/">LeapSecond.com</a> is
+dedicated not only to leap seconds but to precise time and frequency
+in general. It covers the state of the art in amateur timekeeping, and
+how the art has progressed over the past few decades.</li>
+<li><a
+href="http://hpiers.obspm.fr/eop-pc/products/bulletins/bulletins.html">Bulletins
+maintained by the
+<abbr title="International Earth Rotation Service">IERS</abbr>
+<abbr title="Earth Orientation Parameters">EOP</abbr>
+(<abbr title="Product Center">PC</abbr>)</a> contains official publications of
+the Earth Orientation Parameters Product Center of the
+International Earth Rotation Service, the committee that decides
+when leap seconds occur.</li>
+<li>The <a
+href="http://www.mail-archive.com/leapsecs@rom.usno.navy.mil/">Leap
+Second Discussion List</a> and <a
+href="http://rom.usno.navy.mil/archives/leapsecs.html">archive</a> covers <a
+href="http://gauss.gge.unb.ca/papers.pdf/gpsworld.november99.pdf">McCarthy
+and Klepczynski's proposal to discontinue leap seconds</a>, published in <a
+href="http://www.gpsworld.com/gpsworld/"><abbr
+title="Global Positioning System">GPS</abbr> World</a>
+<strong>10</strong>, 11
+(1999-11), 50&ndash;57 and discussed further in R. A. Nelson et al.,
+<a href="http://www.cl.cam.ac.uk/~mgk25/time/metrologia-leapsecond.pdf">The
+leap second: its history and possible future</a>,
+<a href="http://www.bipm.fr/metrologia/index.html">Metrologia</a>
+<strong>38</strong> (2001), 509&ndash;529.
+<a href="http://www.ucolick.org/~sla/leapsecs/">The
+Future of Leap Seconds</a> covers this
+contentious issue.</li>
+</ul>
+<h2>Time notation</h2>
+<ul>
+<li>
+<a href="http://www.cl.cam.ac.uk/~mgk25/iso-time.html">A Summary of
+the International Standard Date and Time Notation</a> is a good
+summary of
+<a
+href="http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=40874"><abbr
+title="International Organization for Standardization">ISO</abbr>
+8601:2004 -- Data elements and interchange formats -- Information
+interchange -- Representation of dates and times</a>.</li>
+<li>
+<a href="http://www.w3.org/TR/xmlschema-2/#dateTime"><abbr>XML</abbr>
+Schema: Datatypes - dateTime</a> specifies a format inspired by
+<abbr>ISO</abbr> 8601 that is in common use in <abbr>XML</abbr> data.</li>
+<li>
+Section 3.3 of <a
+href="ftp://ftp.rfc-editor.org/in-notes/rfc2822.txt">Internet
+<abbr title="Request For Comments">RFC</abbr> 2822</a>
+specifies the time notation used in email and <a
+href="ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt"><abbr>HTTP</abbr></a>
+headers.</li>
+<li>
+<a href="ftp://ftp.rfc-editor.org/in-notes/rfc3339.txt">Internet
+<abbr>RFC</abbr> 3339</a> specifies an <abbr>ISO</abbr> 8601
+profile for use in new Internet
+protocols.</li>
+<li>
+<a href="http://www.hackcraft.net/web/datetime/">Date &amp; Time
+Formats on the Web</a> surveys web- and Internet-oriented date and time
+formats.</li>
+<li>
+<a href="http://www.exit109.com/~ghealton/y2k/yrexamples.html">The
+Best of Dates, the Worst of Dates</a> covers many problems encountered
+by software developers when handling dates and time stamps.</li>
+<li><a
+href="http://www-306.ibm.com/software/globalization/icu/"><abbr>ICU</abbr></a>
+contains a mechanism for localizing time zone
+labels and abbreviations; for example, one can use it to specify
+Russian translations for "Eastern European Summer Time",
+"<abbr title="Eastern European Summer Time">EEST</abbr>",
+and <code>Europe/Bucharest</code>.
+This mechanism is part of the
+<a href="http://unicode.org/cldr/">Unicode
+<abbr title="Common Locale Data Repository">CLDR</abbr> Project</a>;
+for example, the <a
+href="http://unicode.org/cldr/data/diff/by_type/dates_timeZoneNames.html"><abbr>CLDR</abbr> Sideways Data for dates_timeZoneNames</a>
+shows values for time zone names in many locales.</li>
+<li>Alphabetic time zone abbreviations should not be used as unique
+identifiers for <abbr>UTC</abbr> offsets as they are ambiguous in
+practice. For example, "<abbr>EST</abbr>" denotes 5 hours behind
+<abbr>UTC</abbr> in English-speaking North America, but it denotes 10
+or 11 hours ahead of <abbr>UTC</abbr> in Australia; and
+French-speaking North Americans prefer
+"<abbr title="Heure Normale de l'Est">HNE</abbr>" to
+"<abbr>EST</abbr>". For <abbr>POSIX</abbr> the <code>tz</code>
+database contains English abbreviations for all time stamps but in
+many cases these are merely inventions of the database
+maintainers.</li>
+<li>Numeric time zone abbreviations typically count hours east of
+<abbr>UTC</abbr>, e.g., <code>+09</code> for Japan and
+<code>-10</code> for Hawaii. However, the <abbr>POSIX</abbr>
+<code>TZ</code> environment variable uses the opposite convention. For
+example, one might use <code>TZ="JST-9"</code> and
+<code>TZ="HST10"</code> for Japan and Hawaii, respectively. If the
+<code>tz</code> database is available, it is usually better to use
+settings like <code>TZ="Asia/Tokyo"</code> and
+<code>TZ="Pacific/Honolulu"</code> instead, as this should avoid
+confusion, handle old time stamps better, and insulate you better from
+any future changes to the rules. One should never set
+<abbr>POSIX</abbr> <code>TZ</code> to a value like
+<code>"GMT-9"</code>, though, since this would falsely claim that
+local time is nine hours ahead of <abbr>UTC</abbr> and the time zone
+is called "<abbr>GMT</abbr>".</li>
+</ul>
+<h2>Related indexes</h2>
+<ul>
+<li><a href="tz-art.htm">Time and the Arts</a></li>
+<li><a href="http://dmoz.org/Reference/Time/">Open Directory -
+Reference: Time</a></li>
+<li><a href="http://directory.google.com/Top/Reference/Time/">Google Directory
+- Reference &gt; Time</a></li>
+<li><a href="http://dir.yahoo.com/Science/Measurements_and_Units/Time/">Yahoo!
+Directory &gt; Science &gt; Measurements and Units &gt; Time</a></li>
+</ul>
+</body>
+</html>
diff --git a/commands/zoneinfo/tzfile.5 b/commands/zoneinfo/tzfile.5
new file mode 100644 (file)
index 0000000..ceb6a77
--- /dev/null
@@ -0,0 +1,138 @@
+.TH TZFILE 5
+.SH NAME
+tzfile \- time zone information
+.SH SYNOPSIS
+.B
+#include <tzfile.h>
+.SH DESCRIPTION
+The time zone information files used by
+.IR tzset (3)
+begin with the magic characters "TZif" to identify then as
+time zone information files,
+followed by sixteen bytes reserved for future use,
+followed by six four-byte values of type
+.BR long ,
+written in a ``standard'' byte order
+(the high-order byte of the value is written first).
+These values are,
+in order:
+.TP
+.I tzh_ttisgmtcnt
+The number of UTC/local indicators stored in the file.
+.TP
+.I tzh_ttisstdcnt
+The number of standard/wall indicators stored in the file.
+.TP
+.I tzh_leapcnt
+The number of leap seconds for which data is stored in the file.
+.TP
+.I tzh_timecnt
+The number of "transition times" for which data is stored
+in the file.
+.TP
+.I tzh_typecnt
+The number of "local time types" for which data is stored
+in the file (must not be zero).
+.TP
+.I tzh_charcnt
+The number of characters of "time zone abbreviation strings"
+stored in the file.
+.PP
+The above header is followed by
+.I tzh_timecnt
+four-byte values of type
+.BR long ,
+sorted in ascending order.
+These values are written in ``standard'' byte order.
+Each is used as a transition time (as returned by
+.IR time (2))
+at which the rules for computing local time change.
+Next come
+.I tzh_timecnt
+one-byte values of type
+.BR "unsigned char" ;
+each one tells which of the different types of ``local time'' types
+described in the file is associated with the same-indexed transition time.
+These values serve as indices into an array of
+.I ttinfo
+structures that appears next in the file;
+these structures are defined as follows:
+.in +.5i
+.sp
+.nf
+.ta .5i +\w'unsigned int\0\0'u
+struct ttinfo {
+       long    tt_gmtoff;
+       int     tt_isdst;
+       unsigned int    tt_abbrind;
+};
+.in -.5i
+.fi
+.sp
+Each structure is written as a four-byte value for
+.I tt_gmtoff
+of type
+.BR long ,
+in a standard byte order, followed by a one-byte value for
+.I tt_isdst
+and a one-byte value for
+.IR tt_abbrind .
+In each structure,
+.I tt_gmtoff
+gives the number of seconds to be added to UTC,
+.I tt_isdst
+tells whether
+.I tm_isdst
+should be set by
+.I localtime (3)
+and
+.I tt_abbrind
+serves as an index into the array of time zone abbreviation characters
+that follow the
+.I ttinfo
+structure(s) in the file.
+.PP
+Then there are
+.I tzh_leapcnt
+pairs of four-byte values, written in standard byte order;
+the first value of each pair gives the time
+(as returned by
+.IR time(2))
+at which a leap second occurs;
+the second gives the
+.I total
+number of leap seconds to be applied after the given time.
+The pairs of values are sorted in ascending order by time.
+.PP
+Then there are
+.I tzh_ttisstdcnt
+standard/wall indicators, each stored as a one-byte value;
+they tell whether the transition times associated with local time types
+were specified as standard time or wall clock time,
+and are used when a time zone file is used in handling POSIX-style
+time zone environment variables.
+.PP
+Finally there are
+.I tzh_ttisgmtcnt
+UTC/local indicators, each stored as a one-byte value;
+they tell whether the transition times associated with local time types
+were specified as UTC or local time,
+and are used when a time zone file is used in handling POSIX-style
+time zone environment variables.
+.PP
+.I Localtime
+uses the first standard-time
+.I ttinfo
+structure in the file
+(or simply the first
+.I ttinfo
+structure in the absence of a standard-time structure)
+if either
+.I tzh_timecnt
+is zero or the time argument is less than the first transition time recorded
+in the file.
+.SH SEE ALSO
+newctime(3)
+.\" @(#)tzfile.5       7.12
+.\" This file is in the public domain, so clarified as of
+.\" 1996-06-05 by Arthur David Olson.
diff --git a/commands/zoneinfo/tzfile.5.txt b/commands/zoneinfo/tzfile.5.txt
new file mode 100644 (file)
index 0000000..dec5df5
--- /dev/null
@@ -0,0 +1,93 @@
+NAME
+
+     tzfile - time zone information
+
+SYNOPSIS
+     #include <tzfile.h>
+
+DESCRIPTION
+     The time zone information files used by tzset(3) begin with
+     the magic characters "TZif" to identify then as time zone
+     information files, followed by sixteen bytes reserved for
+     future use, followed by six four-byte values of type long,
+     written in a ``standard'' byte order (the high-order byte of
+     the value is written first).  These values are, in order:
+
+     tzh_ttisgmtcnt
+          The number of UTC/local indicators stored in the file.
+
+     tzh_ttisstdcnt
+          The number of standard/wall indicators stored in the
+          file.
+
+     tzh_leapcnt
+          The number of leap seconds for which data is stored in
+          the file.
+
+     tzh_timecnt
+          The number of "transition times" for which data is
+          stored in the file.
+
+     tzh_typecnt
+          The number of "local time types" for which data is
+          stored in the file (must not be zero).
+
+     tzh_charcnt
+          The number of characters of "time zone abbreviation
+          strings" stored in the file.
+
+     The above header is followed by tzh_timecnt four-byte values
+     of type long, sorted in ascending order.  These values are
+     written in ``standard'' byte order.  Each is used as a
+     transition time (as returned by time(2)) at which the rules
+     for computing local time change.  Next come tzh_timecnt
+     one-byte values of type unsigned char; each one tells which
+     of the different types of ``local time'' types described in
+     the file is associated with the same-indexed transition
+     time.  These values serve as indices into an array of ttinfo
+     structures that appears next in the file; these structures
+     are defined as follows:
+
+          struct ttinfo {
+               long          tt_gmtoff;
+               int           tt_isdst;
+               unsigned int  tt_abbrind;
+          };
+
+     Each structure is written as a four-byte value for tt_gmtoff
+     of type long, in a standard byte order, followed by a one-
+     byte value for tt_isdst and a one-byte value for tt_abbrind.
+     In each structure, tt_gmtoff gives the number of seconds to
+     be added to UTC, tt_isdst tells whether tm_isdst should be
+     set by localtime (3) and tt_abbrind serves as an index into
+     the array of time zone abbreviation characters that follow
+     the ttinfo structure(s) in the file.
+
+     Then there are tzh_leapcnt pairs of four-byte values,
+     written in standard byte order; the first value of each pair
+     gives the time (as returned by time(2)) at which a leap
+     second occurs; the second gives the total number of leap
+     seconds to be applied after the given time.  The pairs of
+     values are sorted in ascending order by time.
+
+     Then there are tzh_ttisstdcnt standard/wall indicators, each
+     stored as a one-byte value; they tell whether the transition
+     times associated with local time types were specified as
+     standard time or wall clock time, and are used when a time
+     zone file is used in handling POSIX-style time zone
+     environment variables.
+
+     Finally there are tzh_ttisgmtcnt UTC/local indicators, each
+     stored as a one-byte value; they tell whether the transition
+     times associated with local time types were specified as UTC
+     or local time, and are used when a time zone file is used in
+     handling POSIX-style time zone environment variables.
+
+     Localtime uses the first standard-time ttinfo structure in
+     the file (or simply the first ttinfo structure in the
+     absence of a standard-time structure) if either tzh_timecnt
+     is zero or the time argument is less than the first
+     transition time recorded in the file.
+
+SEE ALSO
+     newctime(3)
diff --git a/commands/zoneinfo/tzfile.h b/commands/zoneinfo/tzfile.h
new file mode 100644 (file)
index 0000000..fb6ca98
--- /dev/null
@@ -0,0 +1,175 @@
+#ifndef TZFILE_H
+
+#define TZFILE_H
+
+/*
+** This file is in the public domain, so clarified as of
+** 1996-06-05 by Arthur David Olson.
+*/
+
+/*
+** This header is for use ONLY with the time conversion code.
+** There is no guarantee that it will remain unchanged,
+** or that it will remain at all.
+** Do NOT copy it to any system include directory.
+** Thank you!
+*/
+
+/*
+** ID
+*/
+
+#ifndef lint
+#ifndef NOID
+static char    tzfilehid[] = "@(#)tzfile.h     7.18";
+#endif /* !defined NOID */
+#endif /* !defined lint */
+
+/*
+** Information about time zone files.
+*/
+
+#ifndef TZDIR
+#define TZDIR  "/usr/local/etc/zoneinfo" /* Time zone object file directory */
+#endif /* !defined TZDIR */
+
+#ifndef TZDEFAULT
+#define TZDEFAULT      "localtime"
+#endif /* !defined TZDEFAULT */
+
+#ifndef TZDEFRULES
+#define TZDEFRULES     "posixrules"
+#endif /* !defined TZDEFRULES */
+
+/*
+** Each file begins with. . .
+*/
+
+#define        TZ_MAGIC        "TZif"
+
+struct tzhead {
+       char    tzh_magic[4];           /* TZ_MAGIC */
+       char    tzh_reserved[16];       /* reserved for future use */
+       char    tzh_ttisgmtcnt[4];      /* coded number of trans. time flags */
+       char    tzh_ttisstdcnt[4];      /* coded number of trans. time flags */
+       char    tzh_leapcnt[4];         /* coded number of leap seconds */
+       char    tzh_timecnt[4];         /* coded number of transition times */
+       char    tzh_typecnt[4];         /* coded number of local time types */
+       char    tzh_charcnt[4];         /* coded number of abbr. chars */
+};
+
+/*
+** . . .followed by. . .
+**
+**     tzh_timecnt (char [4])s         coded transition times a la time(2)
+**     tzh_timecnt (unsigned char)s    types of local time starting at above
+**     tzh_typecnt repetitions of
+**             one (char [4])          coded UTC offset in seconds
+**             one (unsigned char)     used to set tm_isdst
+**             one (unsigned char)     that's an abbreviation list index
+**     tzh_charcnt (char)s             '\0'-terminated zone abbreviations
+**     tzh_leapcnt repetitions of
+**             one (char [4])          coded leap second transition times
+**             one (char [4])          total correction after above
+**     tzh_ttisstdcnt (char)s          indexed by type; if TRUE, transition
+**                                     time is standard time, if FALSE,
+**                                     transition time is wall clock time
+**                                     if absent, transition times are
+**                                     assumed to be wall clock time
+**     tzh_ttisgmtcnt (char)s          indexed by type; if TRUE, transition
+**                                     time is UTC, if FALSE,
+**                                     transition time is local time
+**                                     if absent, transition times are
+**                                     assumed to be local time
+*/
+
+/*
+** In the current implementation, "tzset()" refuses to deal with files that
+** exceed any of the limits below.
+*/
+
+#ifndef TZ_MAX_TIMES
+/*
+** The TZ_MAX_TIMES value below is enough to handle a bit more than a
+** year's worth of solar time (corrected daily to the nearest second) or
+** 138 years of Pacific Presidential Election time
+** (where there are three time zone transitions every fourth year).
+*/
+#define TZ_MAX_TIMES   370
+#endif /* !defined TZ_MAX_TIMES */
+
+#ifndef TZ_MAX_TYPES
+#ifndef NOSOLAR
+#define TZ_MAX_TYPES   256 /* Limited by what (unsigned char)'s can hold */
+#endif /* !defined NOSOLAR */
+#ifdef NOSOLAR
+/*
+** Must be at least 14 for Europe/Riga as of Jan 12 1995,
+** as noted by Earl Chew.
+*/
+#define TZ_MAX_TYPES   20      /* Maximum number of local time types */
+#endif /* !defined NOSOLAR */
+#endif /* !defined TZ_MAX_TYPES */
+
+#ifndef TZ_MAX_CHARS
+#define TZ_MAX_CHARS   50      /* Maximum number of abbreviation characters */
+                               /* (limited by what unsigned chars can hold) */
+#endif /* !defined TZ_MAX_CHARS */
+
+#ifndef TZ_MAX_LEAPS
+#define TZ_MAX_LEAPS   50      /* Maximum number of leap second corrections */
+#endif /* !defined TZ_MAX_LEAPS */
+
+#define SECSPERMIN     60
+#define MINSPERHOUR    60
+#define HOURSPERDAY    24
+#define DAYSPERWEEK    7
+#define DAYSPERNYEAR   365
+#define DAYSPERLYEAR   366
+#define SECSPERHOUR    (SECSPERMIN * MINSPERHOUR)
+#define SECSPERDAY     ((long) SECSPERHOUR * HOURSPERDAY)
+#define MONSPERYEAR    12
+
+#define TM_SUNDAY      0
+#define TM_MONDAY      1
+#define TM_TUESDAY     2
+#define TM_WEDNESDAY   3
+#define TM_THURSDAY    4
+#define TM_FRIDAY      5
+#define TM_SATURDAY    6
+
+#define TM_JANUARY     0
+#define TM_FEBRUARY    1
+#define TM_MARCH       2
+#define TM_APRIL       3
+#define TM_MAY         4
+#define TM_JUNE                5
+#define TM_JULY                6
+#define TM_AUGUST      7
+#define TM_SEPTEMBER   8
+#define TM_OCTOBER     9
+#define TM_NOVEMBER    10
+#define TM_DECEMBER    11
+
+#define TM_YEAR_BASE   1900
+
+#define EPOCH_YEAR     1970
+#define EPOCH_WDAY     TM_THURSDAY
+
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+
+/*
+** Since everything in isleap is modulo 400 (or a factor of 400), we know that
+**     isleap(y) == isleap(y % 400)
+** and so
+**     isleap(a + b) == isleap((a + b) % 400)
+** or
+**     isleap(a + b) == isleap(a % 400 + b % 400)
+** This is true even if % means modulo rather than Fortran remainder
+** (which is allowed by C89 but not C99).
+** We use this to avoid addition overflow problems.
+*/
+
+#define isleap_sum(a, b)       isleap((a) % 400 + (b) % 400)
+
+#endif /* !defined TZFILE_H */
diff --git a/commands/zoneinfo/tzselect.8 b/commands/zoneinfo/tzselect.8
new file mode 100644 (file)
index 0000000..1545481
--- /dev/null
@@ -0,0 +1,41 @@
+.TH TZSELECT 8
+.SH NAME
+tzselect \- select a time zone
+.SH SYNOPSIS
+.B tzselect
+.SH DESCRIPTION
+The
+.B tzselect
+program asks the user for information about the current location,
+and outputs the resulting time zone description to standard output.
+The output is suitable as a value for the TZ environment variable.
+.PP
+All interaction with the user is done via standard input and standard error.
+.SH "ENVIRONMENT VARIABLES"
+.TP
+\f3AWK\fP
+Name of a Posix-compliant
+.I awk
+program (default:
+.BR awk ).
+.TP
+\f3TZDIR\fP
+Name of the directory containing time zone data files (default:
+.BR /usr/local/etc/zoneinfo ).
+.SH FILES
+.TP
+\f2TZDIR\fP\f3/iso3166.tab\fP
+Table of ISO 3166 2-letter country codes and country names.
+.TP
+\f2TZDIR\fP\f3/zone.tab\fP
+Table of country codes, latitude and longitude, TZ values, and
+descriptive comments.
+.TP
+\f2TZDIR\fP\f3/\fP\f2TZ\fP
+Time zone data file for time zone \f2TZ\fP.
+.SH "EXIT STATUS"
+The exit status is zero if a time zone was successfully obtained from the user,
+nonzero otherwise.
+.SH "SEE ALSO"
+newctime(3), tzfile(5), zdump(8), zic(8)
+.\" @(#)tzselect.8     1.3
diff --git a/commands/zoneinfo/tzselect.8.txt b/commands/zoneinfo/tzselect.8.txt
new file mode 100644 (file)
index 0000000..9813bd4
--- /dev/null
@@ -0,0 +1,41 @@
+NAME
+
+     tzselect - select a time zone
+
+SYNOPSIS
+     tzselect
+
+DESCRIPTION
+     The tzselect program asks the user for information about the
+     current location, and outputs the resulting time zone
+     description to standard output.  The output is suitable as a
+     value for the TZ environment variable.
+
+     All interaction with the user is done via standard input and
+     standard error.
+
+ENVIRONMENT VARIABLES
+     AWK  Name of a Posix-compliant awk program (default:  awk).
+
+     TZDIR
+          Name of the directory containing time zone data files
+          (default:  /usr/local/etc/zoneinfo).
+
+FILES
+     TZDIR/iso3166.tab
+          Table of ISO 3166 2-letter country codes and country
+          names.
+
+     TZDIR/zone.tab
+          Table of country codes, latitude and longitude, TZ
+          values, and descriptive comments.
+
+     TZDIR/TZ
+          Time zone data file for time zone TZ.
+
+EXIT STATUS
+     The exit status is zero if a time zone was successfully
+     obtained from the user, nonzero otherwise.
+
+SEE ALSO
+     newctime(3), tzfile(5), zdump(8), zic(8)
diff --git a/commands/zoneinfo/tzselect.ksh b/commands/zoneinfo/tzselect.ksh
new file mode 100644 (file)
index 0000000..fa0c3e5
--- /dev/null
@@ -0,0 +1,308 @@
+#! /bin/ksh
+
+# '@(#)tzselect.ksh    1.8'
+
+# Ask the user about the time zone, and output the resulting TZ value to stdout.
+# Interact with the user via stderr and stdin.
+
+# Contributed by Paul Eggert.
+
+# Porting notes:
+#
+# This script requires several features of the Korn shell.
+# If your host lacks the Korn shell,
+# you can use either of the following free programs instead:
+#
+#      <a href=ftp://ftp.gnu.org/pub/gnu/>
+#      Bourne-Again shell (bash)
+#      </a>
+#
+#      <a href=ftp://ftp.cs.mun.ca/pub/pdksh/pdksh.tar.gz>
+#      Public domain ksh
+#      </a>
+#
+# This script also uses several features of modern awk programs.
+# If your host lacks awk, or has an old awk that does not conform to Posix.2,
+# you can use either of the following free programs instead:
+#
+#      <a href=ftp://ftp.gnu.org/pub/gnu/>
+#      GNU awk (gawk)
+#      </a>
+#
+#      <a href=ftp://ftp.whidbey.net/pub/brennan/>
+#      mawk
+#      </a>
+
+
+# Specify default values for environment variables if they are unset.
+: ${AWK=awk}
+: ${TZDIR=$(pwd)}
+
+# Check for awk Posix compliance.
+($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
+[ $? = 123 ] || {
+       echo >&2 "$0: Sorry, your \`$AWK' program is not Posix compatible."
+       exit 1
+}
+
+# Make sure the tables are readable.
+TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
+TZ_ZONE_TABLE=$TZDIR/zone.tab
+for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
+do
+       <$f || {
+               echo >&2 "$0: time zone files are not set up correctly"
+               exit 1
+       }
+done
+
+newline='
+'
+IFS=$newline
+
+
+# Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout.
+case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in
+?*) PS3=
+esac
+
+
+# Begin the main loop.  We come back here if the user wants to retry.
+while
+
+       echo >&2 'Please identify a location' \
+               'so that time zone rules can be set correctly.'
+
+       continent=
+       country=
+       region=
+
+
+       # Ask the user for continent or ocean.
+
+       echo >&2 'Please select a continent or ocean.'
+
+       select continent in \
+           Africa \
+           Americas \
+           Antarctica \
+           'Arctic Ocean' \
+           Asia \
+           'Atlantic Ocean' \
+           Australia \
+           Europe \
+           'Indian Ocean' \
+           'Pacific Ocean' \
+           'none - I want to specify the time zone using the Posix TZ format.'
+       do
+           case $continent in
+           '')
+               echo >&2 'Please enter a number in range.';;
+           ?*)
+               case $continent in
+               Americas) continent=America;;
+               *' '*) continent=$(expr "$continent" : '\([^ ]*\)')
+               esac
+               break
+           esac
+       done
+       case $continent in
+       '')
+               exit 1;;
+       none)
+               # Ask the user for a Posix TZ string.  Check that it conforms.
+               while
+                       echo >&2 'Please enter the desired value' \
+                               'of the TZ environment variable.'
+                       echo >&2 'For example, GST-10 is a zone named GST' \
+                               'that is 10 hours ahead (east) of UTC.'
+                       read TZ
+                       $AWK -v TZ="$TZ" 'BEGIN {
+                               tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
+                               time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
+                               offset = "[-+]?" time
+                               date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)"
+                               datetime = "," date "(/" time ")?"
+                               tzpattern = "^(:.*|" tzname offset "(" tzname \
+                                 "(" offset ")?(" datetime datetime ")?)?)$"
+                               if (TZ ~ tzpattern) exit 1
+                               exit 0
+                       }'
+               do
+                       echo >&2 "\`$TZ' is not a conforming" \
+                               'Posix time zone string.'
+               done
+               TZ_for_date=$TZ;;
+       *)
+               # Get list of names of countries in the continent or ocean.
+               countries=$($AWK -F'\t' \
+                       -v continent="$continent" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       /^#/ { next }
+                       $3 ~ ("^" continent "/") {
+                               if (!cc_seen[$1]++) cc_list[++ccs] = $1
+                       }
+                       END {
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/) cc_name[$1] = $2
+                               }
+                               for (i = 1; i <= ccs; i++) {
+                                       country = cc_list[i]
+                                       if (cc_name[country]) {
+                                         country = cc_name[country]
+                                       }
+                                       print country
+                               }
+                       }
+               ' <$TZ_ZONE_TABLE | sort -f)
+
+
+               # If there's more than one country, ask the user which one.
+               case $countries in
+               *"$newline"*)
+                       echo >&2 'Please select a country.'
+                       select country in $countries
+                       do
+                           case $country in
+                           '') echo >&2 'Please enter a number in range.';;
+                           ?*) break
+                           esac
+                       done
+
+                       case $country in
+                       '') exit 1
+                       esac;;
+               *)
+                       country=$countries
+               esac
+
+
+               # Get list of names of time zone rule regions in the country.
+               regions=$($AWK -F'\t' \
+                       -v country="$country" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       BEGIN {
+                               cc = country
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/  &&  country == $2) {
+                                               cc = $1
+                                               break
+                                       }
+                               }
+                       }
+                       $1 == cc { print $4 }
+               ' <$TZ_ZONE_TABLE)
+
+
+               # If there's more than one region, ask the user which one.
+               case $regions in
+               *"$newline"*)
+                       echo >&2 'Please select one of the following' \
+                               'time zone regions.'
+                       select region in $regions
+                       do
+                               case $region in
+                               '') echo >&2 'Please enter a number in range.';;
+                               ?*) break
+                               esac
+                       done
+                       case $region in
+                       '') exit 1
+                       esac;;
+               *)
+                       region=$regions
+               esac
+
+               # Determine TZ from country and region.
+               TZ=$($AWK -F'\t' \
+                       -v country="$country" \
+                       -v region="$region" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       BEGIN {
+                               cc = country
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/  &&  country == $2) {
+                                               cc = $1
+                                               break
+                                       }
+                               }
+                       }
+                       $1 == cc && $4 == region { print $3 }
+               ' <$TZ_ZONE_TABLE)
+
+               # Make sure the corresponding zoneinfo file exists.
+               TZ_for_date=$TZDIR/$TZ
+               <$TZ_for_date || {
+                       echo >&2 "$0: time zone files are not set up correctly"
+                       exit 1
+               }
+       esac
+
+
+       # Use the proposed TZ to output the current date relative to UTC.
+       # Loop until they agree in seconds.
+       # Give up after 8 unsuccessful tries.
+
+       extra_info=
+       for i in 1 2 3 4 5 6 7 8
+       do
+               TZdate=$(LANG=C TZ="$TZ_for_date" date)
+               UTdate=$(LANG=C TZ=UTC0 date)
+               TZsec=$(expr "$TZdate" : '.*:\([0-5][0-9]\)')
+               UTsec=$(expr "$UTdate" : '.*:\([0-5][0-9]\)')
+               case $TZsec in
+               $UTsec)
+                       extra_info="
+Local time is now:     $TZdate.
+Universal Time is now: $UTdate."
+                       break
+               esac
+       done
+
+
+       # Output TZ info and ask the user to confirm.
+
+       echo >&2 ""
+       echo >&2 "The following information has been given:"
+       echo >&2 ""
+       case $country+$region in
+       ?*+?*)  echo >&2 "      $country$newline        $region";;
+       ?*+)    echo >&2 "      $country";;
+       +)      echo >&2 "      TZ='$TZ'"
+       esac
+       echo >&2 ""
+       echo >&2 "Therefore TZ='$TZ' will be used.$extra_info"
+       echo >&2 "Is the above information OK?"
+
+       ok=
+       select ok in Yes No
+       do
+           case $ok in
+           '') echo >&2 'Please enter 1 for Yes, or 2 for No.';;
+           ?*) break
+           esac
+       done
+       case $ok in
+       '') exit 1;;
+       Yes) break
+       esac
+do :
+done
+
+case $SHELL in
+*csh) file=.login line="setenv TZ '$TZ'";;
+*) file=.profile line="TZ='$TZ'; export TZ"
+esac
+
+echo >&2 "
+You can make this change permanent for yourself by appending the line
+       $line
+to the file '$file' in your home directory; then log out and log in again.
+
+Here is that TZ value again, this time on standard output so that you
+can use the $0 command in shell scripts:"
+
+echo "$TZ"
diff --git a/commands/zoneinfo/usno1988 b/commands/zoneinfo/usno1988
new file mode 100644 (file)
index 0000000..1607da5
--- /dev/null
@@ -0,0 +1,111 @@
+# @(#)usno1988 7.2
+#
+# From Arthur David Olson (1989-01-19):
+#
+# Here's some United States Naval Observatory time zone data from
+# February 1988.  It's here mostly to convince you that the USNO has indeed
+# been updating its files (see its 1989 data elsewhere).
+#
+ANDORRA             1 H AHEAD OF UTC
+ARGENTINA           3 H BEHIND   UTC
+BRASIL   WEST       5 H BEHIND UTC        (CRUZEIRO DO SUL)
+BRASIL   CENTRAL    4 H BEHIND UTC              (MANAUS)
+BRASIL   EAST       3 H BEHIND UTC   COASTAL STATES, RIO, SP, BRASILIA
+BRASIL              2 H BEHIND UTC   ATLANTIC ISLANDS
+BRAZIL              5 H BEHIND UTC   WEST (CRUZEIRO DO SUL)
+BRAZIL              4 H BEHIND UTC   CENTRAL    (MANAUS)
+BRAZIL              3 H BEHIND UTC   COASTAL STATES, RIO, SP, BRASILIA
+BRAZIL              3 H BEHIND UTC   FOR MOST MAJOR AIRPORTS.
+BRAZIL              2 H BEHIND UTC   ATLANTIC ISLANDS
+BULGARIA            2 H AHEAD OF UTC WINTER
+BULGARIA            3 H AHEAD OF UTC SUMMER MAR31 - SEP 85, 0100 LOCAL
+CHINA               8 H AHEAD OF UTC; ALL OF CHINA, INCL TAIWAN
+CUBA                5 H BEHIND UTC IN WINTER
+CUBA                4 H BEHIND UTC MAY 8 - OCT 8
+CYPRUS              2 H AHEAD UTC IN WINTER
+CYPRUS              3 H AHEAD UTC MAR 25 - SEP 30
+DENMARK             1 H AHEAD UTC IN WINTER
+DENMARK             2 H AHEAD UTC MAR 31 - SEP 30  , 0200 LOCAL
+DENMK. FAEROE IS    1 H AHEAD UTC MAR 31 - SEP 30  , 0200 LOCAL
+EGYPT               2 H AHEAD UTC
+EGYPT               3 H AHEAD UTC SUMMER (AFTER RAMADAN)
+ENGLAND             ON UTC IN WINTER; WALES, SCOTLAND, N.I., CH.IS.
+ENGLAND             1 H AHEAD OF UTC; SUMMER TIL 28 OCT 0200 LOCAL
+FINLAND             2 H AHEAD OF UTC IN WINTER
+FINLAND             3 H AHEAD OF UTC MAR 25 - SEP 30
+FRANCE              1 H AHEAD OF UTC IN WINTER
+FRANCE              2 H AHEAD OF UTC MAR 31 - SEP 30 , 0100 LOCAL
+GREECE              2 H AHEAD OF UTC IN WINTER
+GREECE              3 H AHEAD OF UTC IN SUMMER EFF. 31MAR85 02/03 LOCAL
+GREECE              3 H AHEAD OF UTC MAR 25 - SEP 30
+GREENLAND           4 H BEHIND UTC  IN THULE AIRBASE YEAR ROUND
+GREENLAND           3 H BEHIND UTC  IN WINTER AT SONDRESTROM
+GREENLAND           2 H BEHIND UTC  30 MAR - 30 SEP 2200 LOCAL AT -"-
+GREENLAND           2 H BEHIND UTC  AROUND SCORESBY SUND
+ICELAND             ON UTC
+IRAN                3.5H AHEAD OF UTC
+IRELAND             ON UTC IN WINTER
+IRELAND             1 H AHEAD OF UTC MAR 31 - OCT 23  0200 LOCAL
+ITALY               1 H AHEAD OF UTC IN WINTER
+ITALY               2 H AHEAD OF UTC MAR 31 - SEP 30, 0030 LOCAL
+JAMAICA             5 H BEHIND UTC IN WINTER
+JAMAICA             4 H BEHIND UTC APR 29 - OCT 29
+LIBYA               2 H AHEAD OF UTC
+MEXICO BAJA CAL N   8 H BEHIND UTC IN WINTER; NORTH BAJA CAL, TIJUANA
+MEXICO BAJA CAL N   7 H BEHIND UTC APR 29 - OCT 29
+MEXICO BAJA CAL S   7 H BEHIND UTC ALL YEAR; MAZATLAN
+MEXICO CENTRAL      6 H BEHIND UTC ALL YEAR; MEXICO CITY
+MONACO              1 H AHEAD UTC IN WINTER
+MONACO              2 H AHEAD UTC MAR 25 - SEP30
+PARAGUAY            4 H BEHIND UTC IN WINTER
+PARAGUAY            3 H BEHIND UTC SEP 30 - MAR 30
+POLAND              1 H AHEAD OF UTC IN WINTER
+POLAND              2 H AHEAD OF UTC MAR 24 - SEP     0200 LOCAL
+PORTUGAL            ON UTC IN WINTER
+PORTUGAL            1 H AHEAD OF UTC IN SUMMER MAR 31 - SEP 29   0100 LOCAL
+PORTUGAL AZORES     1 H BEHIND UTC IN WINTER
+PORTUGAL AZORES     ON UTC IN SUMMER MAR 31 - SEP 29
+PORTUGAL MADEIRA    ON UTC ALL YEAR;
+ROMANIA             2 H AHEAD OF UTC IN WINTER
+ROMANIA             3 H AHEAD OF UTC APR 3 - SEP 24
+SCOTLAND            SEE ENGLAND
+SWITZERLAND         1 H AHEAD OF UTC IN WINTER
+SWITZERLAND         2 H AHEAD OF UTC MAR 31 - SEP 30  0200 LOCAL
+TURKEY              3 H AHEAD OF UTC
+USA   EASTERN       5 H BEHIND UTC IN WINTER; NEW YORK, WASHINGTON
+USA   EASTERN       4 H BEHIND UTC APR 29 - OCT 29
+USA   CENTRAL       6 H BEHIND UTC IN WINTER; CHICAGO, HOUSTON
+USA   CENTRAL       5 H BEHIND UTC APR 29 - OCT 29
+USA   MOUNTAIN      7 H BEHIND UTC IN WINTER; DENVER
+USA   MOUNTAIN      6 H BEHIND UTC APR 29 - OCT 29
+USA   PACIFIC       8 H BEHIND UTC IN WINTER; L.A., SAN FRANCISCO
+USA   PACIFIC       7 H BEHIND UTC APR 29 - OCT 29
+USA   ALASKA STD    9 H BEHIND UTC IN WINTER; MOST OF ALASKA     (AKST)
+USA   ALASKA STD    8 H BEHIND UTC APR 29 - OCT 29               (AKDT)
+USA   ALEUTIAN     10 H BEHIND UTC IN WINTER; ISLANDS WEST OF 170W
+USA   - " -         9 H BEHIND UTC APR 29 - OCT 29
+USA   HAWAII       10 H BEHIND UTC ALL YEAR;
+USA   BERING       11 H BEHIND UTC ALL YEAR; SAMOA, MIDWAY
+USSR WEST EUROP     3 H AHEAD OF UTC IN WINTER; LENINGRAD, MOSCOW
+USSR WEST EUROP     4 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL EUR    4 H AHEAD OF UTC IN WINTER; ROSTOV, BAKU
+USSR CENTRAL EUR    5 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST EUROP     5 H AHEAD OF UTC IN WINTER; SVERDLOVSK
+USSR EAST EUROP     6 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST SIBERIAN  6 H AHEAD OF UTC IN WINTER; TASHKENT, ALMA ATA
+USSR WEST SIBERIAN  7 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL   7 H AHEAD OF UTC IN WINTER; NOVOSIBIRSK
+USSR WEST-CENTRAL   8 H AHEAD OF UTC APR 1 - SEP 30
+USSR WEST-CENTRAL   8 H AHEAD OF UTC IN WINTER; IRKUTSK
+USSR WEST-CENTRAL   9 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB    9 H AHEAD OF UTC IN WINTER; YAKUTSK
+USSR CENTRAL SIB   10 H AHEAD OF UTC APR 1 - SEP 30
+USSR CENTRAL SIB   10 H AHEAD OF UTC IN WINTER; VLADIVOSTOK
+USSR CENTRAL SIB   11 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA  11 H AHEAD OF UTC IN WINTER; MAGADAN
+USSR EAST SIBERIA  12 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA  12 H AHEAD OF UTC IN WINTER; PETROPAVLOVSK
+USSR EAST SIBERIA  13 H AHEAD OF UTC APR 1 - SEP 30
+USSR EAST SIBERIA  13 H AHEAD OF UTC IN WINTER; UELEN
+USSR EAST SIBERIA  14 H AHEAD OF UTC APR 1 - SEP 30
+WALES               SEE ENGLAND
diff --git a/commands/zoneinfo/usno1989 b/commands/zoneinfo/usno1989
new file mode 100644 (file)
index 0000000..6af33c0
--- /dev/null
@@ -0,0 +1,452 @@
+# @(#)usno1989 7.2
+#
+# From Arthur David Olson (1989-01-19):
+#
+# Here's time zone information from the United States Naval Observatory;
+# no corrections have been made, and there are some obvious challenges.
+# The USNO warns:
+#      DUE TO FREQUENT CHANGES IN THE LOCAL LAWS GOVERNING DAYLIGHT
+#      SAVING TIME, WE CANNOT GUARANTEE THE ACCURACY OF THIS
+#      INFORMATION.  PLEASE ALERT US TO ANY DISCREPANCY YOU MAY
+#      DISCOVER.
+#
+AFGHANISTAN         4.5H AHEAD OF UTC
+ALBANIA             1 H  AHEAD OF UTC
+ALBANIA             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ALBANIA                                (ESTIMATED)
+ALGERIA             1 H  AHEAD OF UTC
+AMERICAN SAMOA     11 H  BEHIND UTC
+ANDORRA             1 H  AHEAD OF UTC
+ANDORRA             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ANDORRA                                (ESTIMATED)
+ANGOLA              1 H  AHEAD OF UTC
+ARGENTINA           3 H  BEHIND UTC
+ARUBA               4 H  BEHIND UTC    ALSO BONAIRE, CURACAO,
+ARUBA                                  ST.MAARTEN
+AUSTRALIA  WEST     8 H  AHEAD OF UTC  PERTH, EXMOUTH
+AUSTRALIA  N.T.     9.5H AHEAD OF UTC  DARWIN  NO ADVANCED TIME
+AUSTRALIA  N.T.                                IN SUMMER
+AUSTRALIA  SOUTH    9.5H AHEAD OF UTC  ADELAIDE
+AUSTRALIA                              INCLUDING BROKEN HILL, NSW
+AUSTRALIA  SOUTH   10.5H AHEAD OF UTC  ADELAIDE OCT 30, '88-MAR
+AUSTRALIA  SOUTH                       18, '89 INCLUDING BROKEN
+AUSTRIALIA SOUTH                       HILL, NSW
+AUSTRALIA  QUEENL  10 H  AHEAD OF UTC
+AUSTRALIA  NSW     10 H  AHEAD OF UTC  SYDNEY
+AUSTRALIA  NSW     11 H  AHEAD OF UTC  SYDNEY OCT 30, '88-MAR 18,
+AUSTRALIA  NSW                         '89
+AUSTRALIA  TASM.   10 H  AHEAD OF UTC  HOBART
+AUSTRALIA  TASM.   11 H  AHEAD OF UTC  HOBART OCT 30, '88-MAR 18,
+AUSTRALIA  TASM.                       '89
+AUSTRIA             1 H  AHEAD OF UTC
+AUSTRIA             2 H  AHEAD OF UTC  MAR 27 - SEPT 24
+AZORES                   SEE PORTUGAL
+BAHAMAS             5 H  BEHIND UTC    EXCLUDING TURKS AND CAICOS
+BAHAMAS                                ISLANDS)
+BAHAMAS             4 H  BEHIND UTC    APR 3 - OCT 29 (SAME
+BAHAMAS                                EXCLUSION)
+BAHRAIN             3 H  AHEAD OF UTC
+BANGLADESH          6 H  AHEAD OF UTC
+BARBADOS            4 H  BEHIND UTC
+BELGIUM             1 H  AHEAD OF UTC
+BELGIUM             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+BELIZE              6 H  BEHIND UTC
+BENIN PEOPLES REP   1 H  AHEAD OF UTC  DAHOMEY
+BERMUDA             4 H  BEHIND UTC
+BERMUDA             3 H  BEHIND UTC    APR 3 - OCT 29
+BHUTAN              6 H  AHEAD OF UTC
+BOLIVIA             4 H  BEHIND UTC
+BONAIRE             4 H  BEHIND UTC    ALSO ARUBA,CURACAO,
+BONAIRE                                ST.MAARTEN, SABA
+BOTSWANA            2 H  AHEAD OF UTC
+BRAZIL     WEST     5 H  BEHIND UTC    TERRITORY OF ACRE
+BRAZIL     WEST     4 H  BEHIND UTC    ACRE OCT 23, '88-FEB 11,
+BRAZIL                                 '89 (ESTIMATED)
+BRAZIL     CENTRAL  4 H  BEHIND UTC    MANAUS
+BRAZIL     CENTRAL  3 H  BEHIND UTC    MANAUS OCT 23, '88-FEB 11,
+BRAZIL     CENTRAL                     '89 (ESTIMATED)
+BRAZIL     EAST     3 H  BEHIND UTC    COASTAL STATES, RIO, SAO
+BRAZIL     EAST                        PAULO, BRASILIA
+BRAZIL     EAST     2 H  BEHIND UTC    COASTAL STATES, RIO, SAO
+BRAZIL                                 PAULO, BRASILIA OCT 23,
+BRAZIL                                 '88-FEB 11, '89
+BRAZIL                                 (ESTIMATED)
+BRAZIL              2 H  BEHIND UTC    ATLANTIC ISLANDS, FERNANDO
+BRAZIL                                 DE NORONHA
+BRAZIL              1 H  BEHIND UTC    OCT 23, '88-FEB 11, '89
+BRAZIL                                 (ESTIMATED)
+BRAZIL              3 H  BEHIND UTC    FOR MOST MAJOR AIRPORTS.
+BRITISH VIRGIN I.   4 H  BEHIND UTC
+BRUNEI              8 H  AHEAD OF UTC
+BULGARIA            2 H  AHEAD OF UTC
+BULGARIA            3 H  AHEAD OF UTC  MAR 27 - SEP 24
+BURKINA FASO        ON UTC
+BURMA               6.5H AHEAD OF UTC
+BURUNDI             2 H  AHEAD OF UTC
+CAMBODIA            SEE KAMPUCHEA
+CAMEROON            1 H  AHEAD OF UTC
+CANADA   NEW FDL    3.5H BEHIND UTC    ST.JOHN'S
+CANADA   NEW FDL    1.5H BEHIND UTC    APR 3 - OCT 29
+CANADA   ATLANTIC   4 H  BEHIND UTC    HALIFAX
+CANADA   ATLANTIC   3 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   EASTERN    5 H  BEHIND UTC    TORONTO, MONTREAL, OTTAWA
+CANADA   EASTERN    4 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   CENTRAL    6 H  BEHIND UTC    REGINA, WINNIPEG
+CANADA   CENTRAL    5 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   MOUNTAIN   7 H  BEHIND UTC    CALGARY, EDMONTON
+CANADA   MOUNTAIN   6 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   PACIFIC    8 H  BEHIND UTC    VANCOUVER
+CANADA   PACIFIC    7 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   YUKON      SAME AS PACIFIC    DAWSON
+CAPE VERDE          1 H  BEHIND UTC
+CAYMAN ISLANDS      5 H  BEHIND UTC
+CAROLINE ISLAND    10 H  AHEAD OF UTC  EXCLUDING PONAPE IS.,
+CAROLINE ISLAND                       KUSAIE, AND PINGELAP
+CENTRAL AFRICA      1 H  AHEAD OF UTC
+CEYLON              5.5H AHEAD OF UTC, SEE SRI LANKA
+CHAD                1 H  AHEAD OF UTC
+CHANNEL ISLANDS     SEE ENGLAND
+CHILE               4 H  BEHIND UTC    CONTINENTAL
+CHILE               3 H  BEHIND UTC    OCT 9, '88-MAR 11, '89
+CHILE               6 H  BEHIND UTC    EASTER ISLAND
+CHILE               5 H  BEHIND UTC    OCT 9, '88-MAR 11, '89
+CHINA               8 H  AHEAD OF UTC  ALL OF CHINA, INCL TAIWAN
+CHINA               9 H  AHEAD OF UTC  APR 17 - SEP 10
+COCOS (Keeling) I.  6.5H AHEAD OF UTC
+COLOMBIA            5 H  BEHIND UTC
+COMOROS             3 H  AHEAD OF UTC
+CONGO               1 H  AHEAD OF UTC
+COOK ISLANDS       10 H  BEHIND UTC
+COOK ISLANDS        9.5H  BEHIND UTC   OCT 30, '88-MAR 24, '89
+COOK ISLANDS                           (ESTIMATED)
+COSTA RICA          6 H  BEHIND UTC
+COTE D'IVOIRE       ON UTC
+CUBA                5 H  BEHIND UTC
+CUBA                4 H  BEHIND UTC    MAR 20 - OCT 8
+CURACAO             4 H  BEHIND UTC    ALSO BONAIRE, ARUBA,
+CURACAO                                ST.MAARTEN
+CYPRUS              2 H  AHEAD OF UTC
+CYPRUS              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+CZECHOSLOVAKIA      1 H  AHEAD OF UTC
+CZECHOSLOVAKIA      2 H  AHEAD OF UTC  MAR 27 - SEP 24
+DENMARK             1 H  AHEAD OF UTC
+DENMARK             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+DENMK. FAEROE IS    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+DJIBOUTI            3 H  AHEAD OF UTC
+DOMINICA            4 H  BEHIND UTC
+DOMINICAN REP       4 H  BEHIND UTC
+ECUADOR             5 H  BEHIND UTC    CONTINENTAL
+ECUADOR             6 H  BEHIND UTC    GALAPAGOS ISLANDS
+EGYPT               2 H  AHEAD OF UTC
+EGYPT               3 H  AHEAD OF UTC  MAY 17 - SEP 30 (AFTER
+EGYPT                                  RAMADAN)
+EL SALVADOR         6 H  BEHIND UTC
+ENGLAND             ON UTC             (WALES, SCOTLAND, N.I.,
+ENGLAND                                CH. IS.)
+ENGLAND             1 H  AHEAD OF UTC  MAR 27 - OCT 22
+ENEZUELA           4 H  BEHIND UTC
+EQUITORIAL GUINEA   1 H  AHEAD OF UTC
+ETHIOPIA            3 H  AHEAD OF UTC
+FALKLAND ISLANDS    4 H  BEHIND UTC
+FALKLAND ISLANDS    3 H  BEHIND UTC    SEP 11, '88-APR 15, '89
+FALKLAND ISLANDS                       (ESTIMATED)
+FAROE ISLAND        ON UTC
+FAROE ISLAND        1 H  AHEAD OF UTC  MAR 27 - SEP 24
+FIJI               12 H  AHEAD OF UTC
+FINLAND             2 H  AHEAD OF UTC
+FINLAND             3 H  AHEAD OF UTC  MAR 27 - SEP 24
+FRANCE              1 H  AHEAD OF UTC
+FRANCE              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+FRENCH GUIANA       3 H  BEHIND UTC
+FRENCH POLYNESIA    9 H  BEHIND UTC    GAMBIER ISLAND
+FRENCH POLYNESIA    9.5H BEHIND UTC    MARQUESAS ISLANDS
+FRENCH POLYNESIA   10 H  BEHIND UTC    SOCIETY ISLANDS, TUBUAI
+FRENCH POLYNESIA                       ISLANDS, TUAMOTU ISLAND,
+FRENCH POLYNESIA                       TAHITI
+GABON               1 H  AHEAD OF UTC
+GAMBIA              ON UTC
+GERMANY ALL         1 H  AHEAD OF UTC
+GERMANY ALL         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+GHANA               ON UTC
+GIBRALTAR           1 H  AHEAD OF UTC
+GIBRALTAR           2 H  AHEAD OF UTC  MAR 27 - SEP 24
+GREECE              2 H  AHEAD OF UTC
+GREECE              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+GREENLAND           4 H  BEHIND UTC    THULE AIRBASE YEAR ROUND
+GREENLAND           3 H  BEHIND UTC    ANGMAGSSALIK AND W. COAST
+GREENLAND           2 H  BEHIND UTC    MAR 27 - SEP 24
+GREENLAND           1 H  BEHIND UTC    SCORESBYSUND
+GREENLAND           ON UTC             MAR 27 - SEP 24
+GRENADA             4 H  BEHIND UTC
+GUADELOUPE          4 H  BEHIND UTC    ST. BARTHELEMY, NORTHERN
+GUADELOUPE                             ST. MARTIN MARTINIQUE
+GUAM               10 H  AHEAD OF UTC
+GUATEMALA           6 H  BEHIND UTC
+GUINEA              ON UTC
+GUINEA BISSAU       ON UTC
+GUINEA REPUBLIC     ON UTC
+GUINEA EQUATORIAL   1 H  AHEAD OF UTC
+GUYANA              3 H  BEHIND UTC
+HAITI               5 H  BEHIND UTC
+HAITI               4 H  BEHIND UTC    APR 3 - OCT 29
+HOLLAND             SEE NETHERLANDS
+HONDURAS            6 H  BEHIND UTC
+HONG KONG           8 H  AHEAD OF UTC
+HUNGARY             1 H  AHEAD OF UTC
+HUNGARY             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ICELAND             ON UTC
+INDIA               5.5H AHEAD OF UTC  INCLUDING ANDAMAN ISLANDS
+INDONESIA WEST      7 H  AHEAD OF UTC  SUMATRA, JAVA, BALI,
+INDONESIA WEST                         JAKARTA
+INDONESIA CENTRAL   8 H  AHEAD OF UTC  KALIMANTAN, SULAWESI
+INDONESIA EAST      9 H  AHEAD OF UTC  IRIAN, BARAT
+IRAN                3.5H AHEAD OF UTC
+IRAQ                3 H  AHEAD OF UTC
+IRAQ                4 H  AHEAD OF UTC  APR 1 - SEP 30
+IRELAND             ON UTC
+IRELAND             1 H  AHEAD OF UTC  MAR 27 - OCT 22
+ISRAEL              2 H  AHEAD OF UTC
+ISRAEL              3 H  AHEAD OF UTC  APR 10 - SEP 3
+ITALY               1 H  AHEAD OF UTC
+ITALY               2 H  AHEAD OF UTC  MAR 27 - SEP 24
+IVORY COAST         ON UTC
+IWAN              8 H  AHEAD OF UTC
+JAMAICA             5 H  BEHIND UTC
+JAPAN               9 H  AHEAD OF UTC
+JOHNSTON ISLAND    10 H  BEHIND UTC
+JORDAN              2 H  AHEAD OF UTC
+JORDAN              3 H  AHEAD OF UTC  APR 1 - OCT 6
+KAMPUCHEA           7 H  AHEAD OF UTC
+KENYA               3 H  AHEAD OF UTC
+KIRIBATI, REP OF   12 H  AHEAD OF UTC  CANTON, ENDERBURY ISLANDS
+KIRIBATI, REP OF   11 H  AHEAD OF UTC  CHRISTMAS ISLAND
+KOREA               9 H  AHEAD OF UTC
+KOREA, REP OF       9 H  AHEAD OF UTC
+KOREA, REP OF      10 H  AHEAD OF UTC  MAY 8 - OCT 8
+KUWAIT              3 H  AHEAD OF UTC
+KUSAIE, PINGELAP  12 H  AHEAD OF UTC  INCLUDING MARSHALL IS.,
+KUSAIE, PINGELAP                      EXCLUDING KWAJALEIN)
+KWAJALEIN         12 H  BEHIND UTC
+LAOS                7 H  AHEAD OF UTC
+LEBANON             2 H  AHEAD OF UTC
+LEBANON             3 H  AHEAD OF UTC  JUN 1 - OCT 31
+LEEWARD ISLANDS     4 H BEHIND UTC     ANTIGUA, DOMINICA,
+LEEWARD ISLANDS                        MONTSERRAT, ST.
+LEEWARD ISLAANDS                       CHRISTOPHER, ST. KITTS,
+LEEWARD ISLANDS                        NEVIS, ANGUILLA
+LESOTHO             2 H  AHEAD OF UTC
+LIBERIA             ON UTC
+LIBYAN ARAB         1 H  AHEAD OF UTC  JAMAHIRIYA/LIBYA
+LIBYAN ARAB         2 H  AHEAD OF UTC  APR 1 - SEP 30 JAMAHIRIYA/LIBYA
+LIECHTENSTEIN       1 H  AHEAD OF UTC
+LIECHTENSTEIN       2 H  AHEAD OF UTC  MAR 27 - SEP 24
+LUXEMBOURG          1 H  AHEAD OF UTC
+LUXEMBOURG          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MACAO               8 H  AHEAD OF UTC
+MADAGASCAR          3 H  AHEAD OF UTC
+MADEIRA             SEE PORTUGAL
+MALAWI              2 H  AHEAD OF UTC
+MALAYSIA            8 H  AHEAD OF UTC
+MALDIVES            5 H  AHEAD OF UTC
+MALI                ON UTC
+MALTA               1 H  AHEAD OF UTC
+MALTA               2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MARTINIQUE          4 H  BEHIND UTC
+MAURITANIA          ON UTC
+MAURITIUS           4 H  AHEAD OF UTC
+MARIANA ISLAND    10 H  AHEAD OF UTC  EXCLUDING GUAM
+MEXICO BAJA CAL N   7 H  BEHIND UTC    BAJA CALIFORNIA SUR AND
+MEXICO BAJA CAL N                      N. PACIFIC COAST (STATES
+MEXICO BAJA CAL N                      OF SINALOA AND SONORA)
+MEXICO BAJA CAL N   8 H  BEHIND UTC    ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N                      - OCT 29
+MEXICO BAJA CAL N   7 H  BEHIND UTC    ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N                      - 0CT 29
+MEXICO              6 H  BEHIND UTC    STATES OF DURANGO,
+MEXICO                                 COAHUILA, NUEVO LEON,
+MEXICO                                 TAMAULIPAS
+MEXICO              5 H  BEHIND UTC    STATES OF DURANGO,
+MEXICO                                 COAHUILA, NUEVO LEON,
+MEXICO                                 TAMAULIPAS  APR 3 - OCT 29
+MEXICO              6 H  BEHIND UTC    GENERAL MEXICO, STATES OF
+MEXICO                                 CAMPECHE, QUINTANA ROO AND
+MEXICO                                 YUCATAN
+MIDWAY ISLAND      11 H  BEHIND UTC
+MONACO              1 H  AHEAD OF UTC
+MONACO              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MONGOLIA            8 H  AHEAD OF UTC
+MONGOLIA            9 H  AHEAD OF UTC  MAR 27 - SEP 24
+MONTSERRAT          4 H  BEHIND UTC
+MOROCCO             ON UTC
+MOZAMBIQUE          2 H  AHEAD OF UTC
+NAMIBIA             2 H  AHEAD OF UTC
+NAURU, REP OF      12 H  AHEAD OF UTC
+NEPAL              5H45M AHEAD OF UTC
+NETHERLANDS         1 H  AHEAD OF UTC
+NETHERLANDS         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+NETHERLANDS         4 H  BEHIND UTC    ANTILLES AND SOUTHERN ST.
+NETHERLANDS                            MAARTEN
+NEW CALEDONIA      11 H  AHEAD OF UTC
+NEW HEBRIDES        SEE VANUATU
+NEW ZEALAND        12 H  AHEAD OF UTC  (EXCLUDING CHATHAM ISLAND)
+NEW ZEALAND        13 H  AHEAD OF UTC  OCT 30, '88-MAR 4, '89
+NEW ZEALAND       12H45M AHEAD OF UTC  CHATHAM ISLAND
+NICARAGUA           6 H  BEHIND UTC
+NIGER               1 H  AHEAD OF UTC
+NIGERIA             1 H  AHEAD OF UTC
+NIUE ISLAND        11 H  BEHIND UTC
+NORFOLK ISLAND    11H30M AHEAD OF UTC
+NORTHERN IRELAND    ON UTC             WALES, SCOTLAND, N.I.,
+NORTHERN IRELAND                       CH.IS.
+NORTHERN IRELAND    1 H  AHEAD OF UTC  MAR 27 - OCT 22
+NORWAY              1 H  AHEAD OF UTC
+NORWAY              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+OGO                ON UTC
+OMAN                4 H  AHEAD OF UTC
+PACIFIC ISLAND T.T.
+PALAU ISLAND       9 H  AHEAD OF UTC
+PAKISTAN            5 H  AHEAD OF UTC
+PANAMA              5 H  BEHIND UTC
+PAPUA NEW GUINEA   10 H  AHEAD OF UTC  INCLUDING BOUGAINVILLE
+PAPUA NEW GUINEA                       ISLAND
+PARAGUAY            4 H  BEHIND UTC
+PARAGUAY            3 H  BEHIND UTC    OCT 1, '88-MAR 31, '89
+PERU                5 H  BEHIND UTC
+PHILIPPINES         8 H  AHEAD OF UTC
+PONAPE ISLAND     11 H  AHEAD OF UTC
+POLAND              1 H  AHEAD OF UTC
+POLAND              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+PORTUGAL MAINLAND   ON UTC
+PORTUGAL MAINLAND   1 H  AHEAD OF UTC  MAR 27 - SEP 24
+PORTUGAL AZORES     1 H  BEHIND UTC
+PORTUGAL AZORES     ON UTC             MAR 27 - SEP 24
+PORTUGAL MADEIRA    ON UTC
+PORTUGAL MADEIRA    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+PUERTO RICO         4 H  BEHIND UTC
+QATAR               3 H  AHEAD OF UTC
+ROMANIA             2 H  AHEAD OF UTC
+ROMANIA             3 H  AHEAD OF UTC  MAR 27 - SEP 24
+RUSSIA              SEE USSR
+RWANDA              2 H  AHEAD OF UTC
+SABA                4 H  BEHIND UTC    ALSO BONAIRE, CURACAO,
+SAMOA              11 H  BEHIND UTC
+SAN MARINO          1 H  AHEAD OF UTC
+SAN MARINO          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SAN SALVADOR        6  H  BEHIND UTC
+SAO TOME ISLAND     ON UTC             AND PRINCIPE ISLAND
+SAUDI ARABIA        3 H  AHEAD OF UTC
+SCOTLAND            SEE ENGLAND
+SENEGAL             ON UTC
+SEYCHELLES          4 H  AHEAD OF UTC
+SIERRA LEONE        ON UTC
+SINGAPORE           8 H  AHEAD OF UTC
+SOLOMON ISLANDS    11 H  AHEAD OF UTC  EXCLUDING BOUGAINVILLE
+SOLOMON ISLANDS                        ISLAND
+SOMALI              3 H  AHEAD OF UTC
+SOUTH AFRICA        2 H  AHEAD OF UTC
+SPAIN  CANARY IS    ON UTC
+SPAIN  CANARY IS    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+SPAIN               1 H  AHEAD OF UTC  CONTINENTAL, BALEARIC AND
+SPAIN                                  MALLORCA ISLANDS
+SPAIN               2 H  AHEAD OF UTC  CONTINENTAL, BALEARIC AND
+SPAIN                                  MALLORCA ISLANDS  MAR 27 -
+SPAIN                                  SEP 24
+SPAIN  MAINLAND     1 H  AHEAD OF UTC  MELILLA
+SPAIN  MAINLAND     2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SRI LANKA          5H30M AHEAD OF UTC
+ST.MAARTEN
+ST.KITTS-NEVIS     4 H  BEHIND UTC
+ST.LUCIA           4 H  BEHIND UTC
+ST.PIERRE          3 H  BEHIND UTC    INCLUDING MIQUELON
+ST.PIERRE          2 H  BEHIND UTC    INLCUDING MIQUELON  APR 3
+ST.PIERRE                             - OCT 29
+ST.VINCENT         4 H  BEHIND UTC    INCLUDING THE GRENADINES
+ST. HELENA          ON UTC
+SURINAME            3 H  BEHIND UTC
+SWAZILAND           2 H  AHEAD OF UTC
+SWEDEN              1 H  AHEAD OF UTC
+SWEDEN              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SWITZERLAND         1 H  AHEAD OF UTC
+SWITZERLAND         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SYRIA               2 H  AHEAD OF UTC
+SYRIA               3 H  AHEAD OF UTC  MAR 15 - OCT 30
+TAHITI             10 H  BEHIND UTC
+TANZANIA            3 H  AHEAD OF UTC
+THAILAND            7 H  AHEAD OF UTC
+TRINIDAD / TOBAGO   4 H  BEHIND UTC
+TUNISIA             1 H  AHEAD OF UTC
+TUNISIA             2 H  AHEAD OF UTC  APR 10 - SEP 24
+TURKEY              2 H  AHEAD OF UTC
+TURKEY              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+TURKS AND CAICOS    5 H  BEHIND UTC
+TURKS AND CAICOS    4 H  BEHIND UTC    APR 3 - OCT 29
+TUVALU             12 H  AHEAD OF UTC
+UDAN               2 H  AHEAD OF UTC
+UGANDA              3 H  AHEAD OF UTC
+UNITED ARAB EMIR.   4 H  AHEAD OF UTC  ABU DHABI, DUBAI, SHARJAH,
+UNITED ARAB EMIR                       RAS AL KHAIMAH
+UNITED KINGDOM      ON UTC             WALES, SCOTLAND, N.I., CH.
+UNITED KINGDOM                         IS.
+UNITED KINGDOM      1 H  AHEAD OF UTC  MAR 27 - OCT 22
+UNITED STATES       SEE USA
+UPPER VOLTA         ON UTC
+URUGUAY             3 H  BEHIND UTC
+URUGUAY             2 H  BEHIND UTC    DEC 11, '88-FEB 25, '89
+URAGUAY                                (ESTIMATED)
+USA  EASTERN       5 H  BEHIND UTC    NEW YORK, WASHINGTON
+USA  EASTERN       4 H  BEHIND UTC    APR 3 - OCT 30
+USA  CENTRAL       6 H  BEHIND UTC    CHICAGO, HOUSTON
+USA  CENTRAL       5 H  BEHIND UTC    APR 3 - OCT 30
+USA  MOUNTAIN      7 H  BEHIND UTC    DENVER
+USA  MOUNTAIN      6 H  BEHIND UTC    APR 3 - OCT 30
+USA  PACIFIC       8 H  BEHIND UTC    L.A., SAN FRANCISCO
+USA  PACIFIC       7 H  BEHIND UTC    APR 3 - OCT 30
+USA  ALASKA STD    9 H  BEHIND UTC    MOST OF ALASKA     (AKST)
+USA  ALASKA STD    8 H  BEHIND UTC    APR 3 - OCT 30 (AKDT)
+USA  ALEUTIAN     10 H  BEHIND UTC    ISLANDS WEST OF 170W
+USA  - " -         9 H  BEHIND UTC    APR 3 - OCT 30
+USA  HAWAII       10 H  BEHIND UTC
+USA  BERING       11 H  BEHIND UTC    SAMOA, MIDWAY
+USA  FOR SPECIFIC INFO ON USA ZONES/TIMES CALL DOT 202-426-4520
+USSR WEST EUROP     3 H  AHEAD OF UTC  LENINGRAD, MOSCOW
+USSR WEST EUROP     4 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL EUR    4 H  AHEAD OF UTC  ROSTOV, BAKU
+USSR CENTRAL EUR    5 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST EUROP     5 H  AHEAD OF UTC  SVERDLOVSK
+USSR EAST EUROP     6 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST SIBERIAN  6 H  AHEAD OF UTC  TASHKENT, ALMA ATA
+USSR WEST SIBERIAN  7 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST-CENTRAL   7 H  AHEAD OF UTC  NOVOSIBIRSK
+USSR WEST-CENTRAL   8 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST-CENTRAL   8 H  AHEAD OF UTC  IRKUTSK
+USSR WEST-CENTRAL   9 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL SIB    9 H  AHEAD OF UTC  YAKUTSK
+USSR CENTRAL SIB   10 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL SIB   10 H  AHEAD OF UTC  VLADIVOSTOK
+USSR CENTRAL SIB   11 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  11 H  AHEAD OF UTC  MAGADAN
+USSR EAST SIBERIA  12 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  12 H  AHEAD OF UTC  PETROPAVLOVSK
+USSR EAST SIBERIA  13 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  13 H  AHEAD OF UTC  UELEN
+USSR EAST SIBERIA  14 H  AHEAD OF UTC  APR 1 - SEP 30
+VANUATU            11 H  AHEAD OF UTC  (NEW HEBRIDES)
+VANUATU            12 H  AHEAD OF UTC  SEP 25, '88-MAR 25, '89
+VANUATU                                (ESTIMATED)
+VATICAN             1 H  AHEAD OF UTC
+VATICAN             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+VIETNAM             7 H  AHEAD OF UTC
+VIRGIN ISLANDS      4 H  BEHIND UTC    ST.CROIX, ST.THOMAS,
+VIRGIN ISLANDS                         ST.JOHN
+WAKE ISLAND        12 H  AHEAD OF UTC
+WALES               SEE ENGLAND
+WALLIS/FUTUNA IS.  12 H  AHEAD OF UTC
+WINDWARD ISLANDS    4 H  BEHIND UTC    GRENADA, ST. LUCIA
+YEMEN               3 H  AHEAD OF UTC  BOTH REPUBLICS
+YUGOSLAVIA          1 H  AHEAD OF UTC
+YUGOSLAVIA          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ZAIRE  EAST         1 H  AHEAD OF UTC  KINSHASA MBANDAKA
+ZAIRE  WEST         2 H  AHEAD OF UTC  LUBUMBASHI, KASAI, KIVU,
+ZAIRE  WEST                            HAUT-ZAIRE, SHABA
+ZAMBIA              2 H  AHEAD OF UTC
+ZIMBABWE            2 H  AHEAD OF UTC
diff --git a/commands/zoneinfo/usno1989a b/commands/zoneinfo/usno1989a
new file mode 100644 (file)
index 0000000..30d100b
--- /dev/null
@@ -0,0 +1,452 @@
+# @(#)usno1989a        7.4
+#
+# From Arthur David Olson (1994-02-07):
+#
+# Here's time zone information from the United States Naval Observatory,
+# with corrections from Paul Eggert.
+# The USNO warns:
+#      DUE TO FREQUENT CHANGES IN THE LOCAL LAWS GOVERNING DAYLIGHT
+#      SAVING TIME, WE CANNOT GUARANTEE THE ACCURACY OF THIS
+#      INFORMATION.  PLEASE ALERT US TO ANY DISCREPANCY YOU MAY
+#      DISCOVER.
+#
+AFGHANISTAN         4.5H AHEAD OF UTC
+ALBANIA             1 H  AHEAD OF UTC
+ALBANIA             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ALBANIA                                (ESTIMATED)
+ALGERIA             1 H  AHEAD OF UTC
+AMERICAN SAMOA     11 H  BEHIND UTC
+ANDORRA             1 H  AHEAD OF UTC
+ANDORRA             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ANDORRA                                (ESTIMATED)
+ANGOLA              1 H  AHEAD OF UTC
+ARGENTINA           3 H  BEHIND UTC
+ARUBA               4 H  BEHIND UTC    ALSO BONAIRE, CURACAO,
+ARUBA                                  ST.MAARTEN
+AUSTRALIA  WEST     8 H  AHEAD OF UTC  PERTH, EXMOUTH
+AUSTRALIA  N.T.     9.5H AHEAD OF UTC  DARWIN  NO ADVANCED TIME
+AUSTRALIA  N.T.                                IN SUMMER
+AUSTRALIA  SOUTH    9.5H AHEAD OF UTC  ADELAIDE
+AUSTRALIA                              INCLUDING BROKEN HILL, NSW
+AUSTRALIA  SOUTH   10.5H AHEAD OF UTC  ADELAIDE OCT 30, '88-MAR
+AUSTRALIA  SOUTH                       18, '89 INCLUDING BROKEN
+AUSTRIALIA SOUTH                       HILL, NSW
+AUSTRALIA  QUEENL  10 H  AHEAD OF UTC
+AUSTRALIA  NSW     10 H  AHEAD OF UTC  SYDNEY
+AUSTRALIA  NSW     11 H  AHEAD OF UTC  SYDNEY OCT 30, '88-MAR 18,
+AUSTRALIA  NSW                         '89
+AUSTRALIA  TASM.   10 H  AHEAD OF UTC  HOBART
+AUSTRALIA  TASM.   11 H  AHEAD OF UTC  HOBART OCT 30, '88-MAR 18,
+AUSTRALIA  TASM.                       '89
+AUSTRIA             1 H  AHEAD OF UTC
+AUSTRIA             2 H  AHEAD OF UTC  MAR 27 - SEPT 24
+AZORES                   SEE PORTUGAL
+BAHAMAS             5 H  BEHIND UTC    EXCLUDING TURKS AND CAICOS
+BAHAMAS                                ISLANDS)
+BAHAMAS             4 H  BEHIND UTC    APR 3 - OCT 29 (SAME
+BAHAMAS                                EXCLUSION)
+BAHRAIN             3 H  AHEAD OF UTC
+BANGLADESH          6 H  AHEAD OF UTC
+BARBADOS            4 H  BEHIND UTC
+BELGIUM             1 H  AHEAD OF UTC
+BELGIUM             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+BELIZE              6 H  BEHIND UTC
+BENIN PEOPLES REP   1 H  AHEAD OF UTC  DAHOMEY
+BERMUDA             4 H  BEHIND UTC
+BERMUDA             3 H  BEHIND UTC    APR 3 - OCT 29
+BHUTAN              6 H  AHEAD OF UTC
+BOLIVIA             4 H  BEHIND UTC
+BONAIRE             4 H  BEHIND UTC    ALSO ARUBA,CURACAO,
+BONAIRE                                ST.MAARTEN, SABA
+BOTSWANA            2 H  AHEAD OF UTC
+BRAZIL     WEST     5 H  BEHIND UTC    TERRITORY OF ACRE
+BRAZIL     WEST     4 H  BEHIND UTC    ACRE OCT 23, '88-FEB 11,
+BRAZIL                                 '89 (ESTIMATED)
+BRAZIL     CENTRAL  4 H  BEHIND UTC    MANAUS
+BRAZIL     CENTRAL  3 H  BEHIND UTC    MANAUS OCT 23, '88-FEB 11,
+BRAZIL     CENTRAL                     '89 (ESTIMATED)
+BRAZIL     EAST     3 H  BEHIND UTC    COASTAL STATES, RIO, SAO
+BRAZIL     EAST                        PAULO, BRASILIA
+BRAZIL     EAST     2 H  BEHIND UTC    COASTAL STATES, RIO, SAO
+BRAZIL                                 PAULO, BRASILIA OCT 23,
+BRAZIL                                 '88-FEB 11, '89
+BRAZIL                                 (ESTIMATED)
+BRAZIL              2 H  BEHIND UTC    ATLANTIC ISLANDS, FERNANDO
+BRAZIL                                 DE NORONHA
+BRAZIL              1 H  BEHIND UTC    OCT 23, '88-FEB 11, '89
+BRAZIL                                 (ESTIMATED)
+BRAZIL              3 H  BEHIND UTC    FOR MOST MAJOR AIRPORTS.
+BRITISH VIRGIN I.   4 H  BEHIND UTC
+BRUNEI              8 H  AHEAD OF UTC
+BULGARIA            2 H  AHEAD OF UTC
+BULGARIA            3 H  AHEAD OF UTC  MAR 27 - SEP 24
+BURKINA FASO        ON UTC
+BURMA               6.5H AHEAD OF UTC
+BURUNDI             2 H  AHEAD OF UTC
+CAMBODIA            SEE KAMPUCHEA
+CAMEROON            1 H  AHEAD OF UTC
+CANADA   NEW FDL    3.5H BEHIND UTC    ST.JOHN'S
+CANADA   NEW FDL    1.5H BEHIND UTC    APR 3 - OCT 29
+CANADA   ATLANTIC   4 H  BEHIND UTC    HALIFAX
+CANADA   ATLANTIC   3 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   EASTERN    5 H  BEHIND UTC    TORONTO, MONTREAL, OTTAWA
+CANADA   EASTERN    4 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   CENTRAL    6 H  BEHIND UTC    REGINA, WINNIPEG
+CANADA   CENTRAL    5 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   MOUNTAIN   7 H  BEHIND UTC    CALGARY, EDMONTON
+CANADA   MOUNTAIN   6 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   PACIFIC    8 H  BEHIND UTC    VANCOUVER
+CANADA   PACIFIC    7 H  BEHIND UTC    APR 3 - OCT 29
+CANADA   YUKON      SAME AS PACIFIC    DAWSON
+CAPE VERDE          1 H  BEHIND UTC
+CAYMAN ISLANDS      5 H  BEHIND UTC
+CAROLINE ISLAND    10 H  AHEAD OF UTC  EXCLUDING PONAPE IS.,
+CAROLINE ISLAND                        KUSAIE, AND PINGELAP
+CENTRAL AFRICA      1 H  AHEAD OF UTC
+CEYLON              5.5H AHEAD OF UTC, SEE SRI LANKA
+CHAD                1 H  AHEAD OF UTC
+CHANNEL ISLANDS     SEE ENGLAND
+CHILE               4 H  BEHIND UTC    CONTINENTAL
+CHILE               3 H  BEHIND UTC    OCT 9, '88-MAR 11, '89
+CHILE               6 H  BEHIND UTC    EASTER ISLAND
+CHILE               5 H  BEHIND UTC    OCT 9, '88-MAR 11, '89
+CHINA               8 H  AHEAD OF UTC  ALL OF CHINA, INCL TAIWAN
+CHINA               9 H  AHEAD OF UTC  APR 17 - SEP 10
+COCOS (Keeling) I.  6.5H AHEAD OF UTC
+COLOMBIA            5 H  BEHIND UTC
+COMOROS             3 H  AHEAD OF UTC
+CONGO               1 H  AHEAD OF UTC
+COOK ISLANDS       10 H  BEHIND UTC
+COOK ISLANDS        9.5H BEHIND UTC    OCT 30, '88-MAR 24, '89
+COOK ISLANDS                           (ESTIMATED)
+COSTA RICA          6 H  BEHIND UTC
+COTE D'IVOIRE       ON UTC
+CUBA                5 H  BEHIND UTC
+CUBA                4 H  BEHIND UTC    MAR 20 - OCT 8
+CURACAO             4 H  BEHIND UTC    ALSO BONAIRE, ARUBA,
+CURACAO                                ST.MAARTEN
+CYPRUS              2 H  AHEAD OF UTC
+CYPRUS              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+CZECHOSLOVAKIA      1 H  AHEAD OF UTC
+CZECHOSLOVAKIA      2 H  AHEAD OF UTC  MAR 27 - SEP 24
+DENMARK             1 H  AHEAD OF UTC
+DENMARK             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+DENMK. FAEROE IS    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+DJIBOUTI            3 H  AHEAD OF UTC
+DOMINICA            4 H  BEHIND UTC
+DOMINICAN REP       4 H  BEHIND UTC
+ECUADOR             5 H  BEHIND UTC    CONTINENTAL
+ECUADOR             6 H  BEHIND UTC    GALAPAGOS ISLANDS
+EGYPT               2 H  AHEAD OF UTC
+EGYPT               3 H  AHEAD OF UTC  MAY 17 - SEP 30 (AFTER
+EGYPT                                  RAMADAN)
+EL SALVADOR         6 H  BEHIND UTC
+ENGLAND             ON UTC             (WALES, SCOTLAND, N.I.,
+ENGLAND                                CH. IS.)
+ENGLAND             1 H  AHEAD OF UTC  MAR 27 - OCT 22
+EQUATORIAL GUINEA   1 H  AHEAD OF UTC
+ETHIOPIA            3 H  AHEAD OF UTC
+FALKLAND ISLANDS    4 H  BEHIND UTC
+FALKLAND ISLANDS    3 H  BEHIND UTC    SEP 11, '88-APR 15, '89
+FALKLAND ISLANDS                       (ESTIMATED)
+FAROE ISLAND        ON UTC
+FAROE ISLAND        1 H  AHEAD OF UTC  MAR 27 - SEP 24
+FIJI               12 H  AHEAD OF UTC
+FINLAND             2 H  AHEAD OF UTC
+FINLAND             3 H  AHEAD OF UTC  MAR 27 - SEP 24
+FRANCE              1 H  AHEAD OF UTC
+FRANCE              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+FRENCH GUIANA       3 H  BEHIND UTC
+FRENCH POLYNESIA    9 H  BEHIND UTC    GAMBIER ISLAND
+FRENCH POLYNESIA    9.5H BEHIND UTC    MARQUESAS ISLANDS
+FRENCH POLYNESIA   10 H  BEHIND UTC    SOCIETY ISLANDS, TUBUAI
+FRENCH POLYNESIA                       ISLANDS, TUAMOTU ISLAND,
+FRENCH POLYNESIA                       TAHITI
+GABON               1 H  AHEAD OF UTC
+GAMBIA              ON UTC
+GERMANY ALL         1 H  AHEAD OF UTC
+GERMANY ALL         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+GHANA               ON UTC
+GIBRALTAR           1 H  AHEAD OF UTC
+GIBRALTAR           2 H  AHEAD OF UTC  MAR 27 - SEP 24
+GREECE              2 H  AHEAD OF UTC
+GREECE              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+GREENLAND           4 H  BEHIND UTC    THULE AIRBASE YEAR ROUND
+GREENLAND           3 H  BEHIND UTC    ANGMAGSSALIK AND W. COAST
+GREENLAND           2 H  BEHIND UTC    MAR 27 - SEP 24
+GREENLAND           1 H  BEHIND UTC    SCORESBYSUND
+GREENLAND           ON UTC             MAR 27 - SEP 24
+GRENADA             4 H  BEHIND UTC
+GUADELOUPE          4 H  BEHIND UTC    ST. BARTHELEMY, NORTHERN
+GUADELOUPE                             ST. MARTIN MARTINIQUE
+GUAM               10 H  AHEAD OF UTC
+GUATEMALA           6 H  BEHIND UTC
+GUINEA              ON UTC
+GUINEA BISSAU       ON UTC
+GUINEA REPUBLIC     ON UTC
+GUINEA EQUATORIAL   1 H  AHEAD OF UTC
+GUYANA              3 H  BEHIND UTC
+HAITI               5 H  BEHIND UTC
+HAITI               4 H  BEHIND UTC    APR 3 - OCT 29
+HOLLAND             SEE NETHERLANDS
+HONDURAS            6 H  BEHIND UTC
+HONG KONG           8 H  AHEAD OF UTC
+HUNGARY             1 H  AHEAD OF UTC
+HUNGARY             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ICELAND             ON UTC
+INDIA               5.5H AHEAD OF UTC  INCLUDING ANDAMAN ISLANDS
+INDONESIA WEST      7 H  AHEAD OF UTC  SUMATRA, JAVA, BALI,
+INDONESIA WEST                         JAKARTA
+INDONESIA CENTRAL   8 H  AHEAD OF UTC  KALIMANTAN, SULAWESI
+INDONESIA EAST      9 H  AHEAD OF UTC  IRIAN, BARAT
+IRAN                3.5H AHEAD OF UTC
+IRAQ                3 H  AHEAD OF UTC
+IRAQ                4 H  AHEAD OF UTC  APR 1 - SEP 30
+IRELAND             ON UTC
+IRELAND             1 H  AHEAD OF UTC  MAR 27 - OCT 22
+ISRAEL              2 H  AHEAD OF UTC
+ISRAEL              3 H  AHEAD OF UTC  APR 10 - SEP 3
+ITALY               1 H  AHEAD OF UTC
+ITALY               2 H  AHEAD OF UTC  MAR 27 - SEP 24
+IVORY COAST         ON UTC
+JAMAICA             5 H  BEHIND UTC
+JAPAN               9 H  AHEAD OF UTC
+JOHNSTON ISLAND    10 H  BEHIND UTC
+JORDAN              2 H  AHEAD OF UTC
+JORDAN              3 H  AHEAD OF UTC  APR 1 - OCT 6
+KAMPUCHEA           7 H  AHEAD OF UTC
+KENYA               3 H  AHEAD OF UTC
+KIRIBATI, REP OF   12 H  AHEAD OF UTC  CANTON, ENDERBURY ISLANDS
+KIRIBATI, REP OF   11 H  AHEAD OF UTC  CHRISTMAS ISLAND
+KOREA               9 H  AHEAD OF UTC
+KOREA, REP OF       9 H  AHEAD OF UTC
+KOREA, REP OF      10 H  AHEAD OF UTC  MAY 8 - OCT 8
+KUWAIT              3 H  AHEAD OF UTC
+KUSAIE, PINGELAP   12 H  AHEAD OF UTC  INCLUDING MARSHALL IS.,
+KUSAIE, PINGELAP                       EXCLUDING KWAJALEIN)
+KWAJALEIN          12 H  BEHIND UTC
+LAOS                7 H  AHEAD OF UTC
+LEBANON             2 H  AHEAD OF UTC
+LEBANON             3 H  AHEAD OF UTC  JUN 1 - OCT 31
+LEEWARD ISLANDS     4 H  BEHIND UTC    ANTIGUA, DOMINICA,
+LEEWARD ISLANDS                        MONTSERRAT, ST.
+LEEWARD ISLAANDS                       CHRISTOPHER, ST. KITTS,
+LEEWARD ISLANDS                        NEVIS, ANGUILLA
+LESOTHO             2 H  AHEAD OF UTC
+LIBERIA             ON UTC
+LIBYAN ARAB         1 H  AHEAD OF UTC  JAMAHIRIYA/LIBYA
+LIBYAN ARAB         2 H  AHEAD OF UTC  APR 1 - SEP 30 JAMAHIRIYA/LIBYA
+LIECHTENSTEIN       1 H  AHEAD OF UTC
+LIECHTENSTEIN       2 H  AHEAD OF UTC  MAR 27 - SEP 24
+LUXEMBOURG          1 H  AHEAD OF UTC
+LUXEMBOURG          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MACAO               8 H  AHEAD OF UTC
+MADAGASCAR          3 H  AHEAD OF UTC
+MADEIRA             SEE PORTUGAL
+MALAWI              2 H  AHEAD OF UTC
+MALAYSIA            8 H  AHEAD OF UTC
+MALDIVES            5 H  AHEAD OF UTC
+MALI                ON UTC
+MALTA               1 H  AHEAD OF UTC
+MALTA               2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MARTINIQUE          4 H  BEHIND UTC
+MAURITANIA          ON UTC
+MAURITIUS           4 H  AHEAD OF UTC
+MARIANA ISLANDS    10 H  AHEAD OF UTC  EXCLUDING GUAM
+MEXICO BAJA CAL N   7 H  BEHIND UTC    BAJA CALIFORNIA SUR AND
+MEXICO BAJA CAL N                      N. PACIFIC COAST (STATES
+MEXICO BAJA CAL N                      OF SINALOA AND SONORA)
+MEXICO BAJA CAL N   8 H  BEHIND UTC    ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N                      - OCT 29
+MEXICO BAJA CAL N   7 H  BEHIND UTC    ABOVE 28TH PARALLAL APR 3
+MEXICO BAJA CAL N                      - 0CT 29
+MEXICO              6 H  BEHIND UTC    STATES OF DURANGO,
+MEXICO                                 COAHUILA, NUEVO LEON,
+MEXICO                                 TAMAULIPAS
+MEXICO              5 H  BEHIND UTC    STATES OF DURANGO,
+MEXICO                                 COAHUILA, NUEVO LEON,
+MEXICO                                 TAMAULIPAS  APR 3 - OCT 29
+MEXICO              6 H  BEHIND UTC    GENERAL MEXICO, STATES OF
+MEXICO                                 CAMPECHE, QUINTANA ROO AND
+MEXICO                                 YUCATAN
+MIDWAY ISLAND      11 H  BEHIND UTC
+MONACO              1 H  AHEAD OF UTC
+MONACO              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+MONGOLIA            8 H  AHEAD OF UTC
+MONGOLIA            9 H  AHEAD OF UTC  MAR 27 - SEP 24
+MONTSERRAT          4 H  BEHIND UTC
+MOROCCO             ON UTC
+MOZAMBIQUE          2 H  AHEAD OF UTC
+NAMIBIA             2 H  AHEAD OF UTC
+NAURU, REP OF      12 H  AHEAD OF UTC
+NEPAL              5H45M AHEAD OF UTC
+NETHERLANDS         1 H  AHEAD OF UTC
+NETHERLANDS         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+NETHERLANDS         4 H  BEHIND UTC    ANTILLES AND SOUTHERN ST.
+NETHERLANDS                            MAARTEN
+NEW CALEDONIA      11 H  AHEAD OF UTC
+NEW HEBRIDES        SEE VANUATU
+NEW ZEALAND        12 H  AHEAD OF UTC  (EXCLUDING CHATHAM ISLAND)
+NEW ZEALAND        13 H  AHEAD OF UTC  OCT 30, '88-MAR 4, '89
+NEW ZEALAND       12H45M AHEAD OF UTC  CHATHAM ISLAND
+NICARAGUA           6 H  BEHIND UTC
+NIGER               1 H  AHEAD OF UTC
+NIGERIA             1 H  AHEAD OF UTC
+NIUE ISLAND        11 H  BEHIND UTC
+NORFOLK ISLAND    11H30M AHEAD OF UTC
+NORTHERN IRELAND    ON UTC             WALES, SCOTLAND, N.I.,
+NORTHERN IRELAND                       CH.IS.
+NORTHERN IRELAND    1 H  AHEAD OF UTC  MAR 27 - OCT 22
+NORWAY              1 H  AHEAD OF UTC
+NORWAY              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+OMAN                4 H  AHEAD OF UTC
+PACIFIC ISLAND T.T.
+PALAU ISLANDS       9 H  AHEAD OF UTC
+PAKISTAN            5 H  AHEAD OF UTC
+PANAMA              5 H  BEHIND UTC
+PAPUA NEW GUINEA   10 H  AHEAD OF UTC  INCLUDING BOUGAINVILLE
+PAPUA NEW GUINEA                       ISLAND
+PARAGUAY            4 H  BEHIND UTC
+PARAGUAY            3 H  BEHIND UTC    OCT 1, '88-MAR 31, '89
+PERU                5 H  BEHIND UTC
+PHILIPPINES         8 H  AHEAD OF UTC
+PONAPE ISLAND      11 H  AHEAD OF UTC
+POLAND              1 H  AHEAD OF UTC
+POLAND              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+PORTUGAL MAINLAND   ON UTC
+PORTUGAL MAINLAND   1 H  AHEAD OF UTC  MAR 27 - SEP 24
+PORTUGAL AZORES     1 H  BEHIND UTC
+PORTUGAL AZORES     ON UTC             MAR 27 - SEP 24
+PORTUGAL MADEIRA    ON UTC
+PORTUGAL MADEIRA    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+PUERTO RICO         4 H  BEHIND UTC
+QATAR               3 H  AHEAD OF UTC
+ROMANIA             2 H  AHEAD OF UTC
+ROMANIA             3 H  AHEAD OF UTC  MAR 27 - SEP 24
+RUSSIA              SEE USSR
+RWANDA              2 H  AHEAD OF UTC
+SABA                4 H  BEHIND UTC    ALSO BONAIRE, CURACAO,
+SAMOA              11 H  BEHIND UTC
+SAN MARINO          1 H  AHEAD OF UTC
+SAN MARINO          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SAN SALVADOR        6 H  BEHIND UTC
+SAO TOME ISLAND     ON UTC             AND PRINCIPE ISLAND
+SAUDI ARABIA        3 H  AHEAD OF UTC
+SCOTLAND            SEE ENGLAND
+SENEGAL             ON UTC
+SEYCHELLES          4 H  AHEAD OF UTC
+SIERRA LEONE        ON UTC
+SINGAPORE           8 H  AHEAD OF UTC
+SOLOMON ISLANDS    11 H  AHEAD OF UTC  EXCLUDING BOUGAINVILLE
+SOLOMON ISLANDS                        ISLAND
+SOMALI              3 H  AHEAD OF UTC
+SOUTH AFRICA        2 H  AHEAD OF UTC
+SPAIN  CANARY IS    ON UTC
+SPAIN  CANARY IS    1 H  AHEAD OF UTC  MAR 27 - SEP 24
+SPAIN               1 H  AHEAD OF UTC  CONTINENTAL, BALEARIC AND
+SPAIN                                  MALLORCA ISLANDS
+SPAIN               2 H  AHEAD OF UTC  CONTINENTAL, BALEARIC AND
+SPAIN                                  MALLORCA ISLANDS  MAR 27 -
+SPAIN                                  SEP 24
+SPAIN  MAINLAND     1 H  AHEAD OF UTC  MELILLA
+SPAIN  MAINLAND     2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SRI LANKA          5H30M AHEAD OF UTC
+ST. MAARTEN
+ST. KITTS-NEVIS     4 H  BEHIND UTC
+ST. LUCIA           4 H  BEHIND UTC
+ST. PIERRE          3 H  BEHIND UTC    INCLUDING MIQUELON
+ST. PIERRE          2 H  BEHIND UTC    INLCUDING MIQUELON  APR 3
+ST. PIERRE                             - OCT 29
+ST. VINCENT         4 H  BEHIND UTC    INCLUDING THE GRENADINES
+ST. HELENA          ON UTC
+SUDAN               2 H  AHEAD OF UTC
+SURINAME            3 H  BEHIND UTC
+SWAZILAND           2 H  AHEAD OF UTC
+SWEDEN              1 H  AHEAD OF UTC
+SWEDEN              2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SWITZERLAND         1 H  AHEAD OF UTC
+SWITZERLAND         2 H  AHEAD OF UTC  MAR 27 - SEP 24
+SYRIA               2 H  AHEAD OF UTC
+SYRIA               3 H  AHEAD OF UTC  MAR 15 - OCT 30
+TAHITI             10 H  BEHIND UTC
+TAIWAN              8 H  AHEAD OF UTC
+TANZANIA            3 H  AHEAD OF UTC
+THAILAND            7 H  AHEAD OF UTC
+TOGO                ON UTC
+TRINIDAD / TOBAGO   4 H  BEHIND UTC
+TUNISIA             1 H  AHEAD OF UTC
+TUNISIA             2 H  AHEAD OF UTC  APR 10 - SEP 24
+TURKEY              2 H  AHEAD OF UTC
+TURKEY              3 H  AHEAD OF UTC  MAR 27 - SEP 24
+TURKS AND CAICOS    5 H  BEHIND UTC
+TURKS AND CAICOS    4 H  BEHIND UTC    APR 3 - OCT 29
+TUVALU             12 H  AHEAD OF UTC
+UGANDA              3 H  AHEAD OF UTC
+UNITED ARAB EMIR.   4 H  AHEAD OF UTC  ABU DHABI, DUBAI, SHARJAH,
+UNITED ARAB EMIR                       RAS AL KHAIMAH
+UNITED KINGDOM      ON UTC             WALES, SCOTLAND, N.I., CH.
+UNITED KINGDOM                         IS.
+UNITED KINGDOM      1 H  AHEAD OF UTC  MAR 27 - OCT 22
+UNITED STATES       SEE USA
+UPPER VOLTA         ON UTC
+URUGUAY             3 H  BEHIND UTC
+URUGUAY             2 H  BEHIND UTC    DEC 11, '88-FEB 25, '89
+URAGUAY                                (ESTIMATED)
+USA   EASTERN       5 H  BEHIND UTC    NEW YORK, WASHINGTON
+USA   EASTERN       4 H  BEHIND UTC    APR 3 - OCT 30
+USA   CENTRAL       6 H  BEHIND UTC    CHICAGO, HOUSTON
+USA   CENTRAL       5 H  BEHIND UTC    APR 3 - OCT 30
+USA   MOUNTAIN      7 H  BEHIND UTC    DENVER
+USA   MOUNTAIN      6 H  BEHIND UTC    APR 3 - OCT 30
+USA   PACIFIC       8 H  BEHIND UTC    L.A., SAN FRANCISCO
+USA   PACIFIC       7 H  BEHIND UTC    APR 3 - OCT 30
+USA   ALASKA STD    9 H  BEHIND UTC    MOST OF ALASKA     (AKST)
+USA   ALASKA STD    8 H  BEHIND UTC    APR 3 - OCT 30 (AKDT)
+USA   ALEUTIAN     10 H  BEHIND UTC    ISLANDS WEST OF 170W
+USA   - " -         9 H  BEHIND UTC    APR 3 - OCT 30
+USA   HAWAII       10 H  BEHIND UTC
+USA   BERING       11 H  BEHIND UTC    SAMOA, MIDWAY
+USA  FOR SPECIFIC INFO ON USA ZONES/TIMES CALL DOT 202-426-4520
+USSR WEST EUROP     3 H  AHEAD OF UTC  LENINGRAD, MOSCOW
+USSR WEST EUROP     4 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL EUR    4 H  AHEAD OF UTC  ROSTOV, BAKU
+USSR CENTRAL EUR    5 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST EUROP     5 H  AHEAD OF UTC  SVERDLOVSK
+USSR EAST EUROP     6 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST SIBERIAN  6 H  AHEAD OF UTC  TASHKENT, ALMA ATA
+USSR WEST SIBERIAN  7 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST-CENTRAL   7 H  AHEAD OF UTC  NOVOSIBIRSK
+USSR WEST-CENTRAL   8 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR WEST-CENTRAL   8 H  AHEAD OF UTC  IRKUTSK
+USSR WEST-CENTRAL   9 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL SIB    9 H  AHEAD OF UTC  YAKUTSK
+USSR CENTRAL SIB   10 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR CENTRAL SIB   10 H  AHEAD OF UTC  VLADIVOSTOK
+USSR CENTRAL SIB   11 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  11 H  AHEAD OF UTC  MAGADAN
+USSR EAST SIBERIA  12 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  12 H  AHEAD OF UTC  PETROPAVLOVSK
+USSR EAST SIBERIA  13 H  AHEAD OF UTC  APR 1 - SEP 30
+USSR EAST SIBERIA  13 H  AHEAD OF UTC  UELEN
+USSR EAST SIBERIA  14 H  AHEAD OF UTC  APR 1 - SEP 30
+VANUATU            11 H  AHEAD OF UTC  (NEW HEBRIDES)
+VANUATU            12 H  AHEAD OF UTC  SEP 25, '88-MAR 25, '89
+VANUATU                                (ESTIMATED)
+VATICAN             1 H  AHEAD OF UTC
+VATICAN             2 H  AHEAD OF UTC  MAR 27 - SEP 24
+VENEZUELA           4 H  BEHIND UTC
+VIETNAM             7 H  AHEAD OF UTC
+VIRGIN ISLANDS      4 H  BEHIND UTC    ST.CROIX, ST.THOMAS,
+VIRGIN ISLANDS                         ST.JOHN
+WAKE ISLAND        12 H  AHEAD OF UTC
+WALES               SEE ENGLAND
+WALLIS/FUTUNA IS.  12 H  AHEAD OF UTC
+WINDWARD ISLANDS    4 H  BEHIND UTC    GRENADA, ST. LUCIA
+YEMEN               3 H  AHEAD OF UTC  BOTH REPUBLICS
+YUGOSLAVIA          1 H  AHEAD OF UTC
+YUGOSLAVIA          2 H  AHEAD OF UTC  MAR 27 - SEP 24
+ZAIRE  EAST         1 H  AHEAD OF UTC  KINSHASA MBANDAKA
+ZAIRE  WEST         2 H  AHEAD OF UTC  LUBUMBASHI, KASAI, KIVU,
+ZAIRE  WEST                            HAUT-ZAIRE, SHABA
+ZAMBIA              2 H  AHEAD OF UTC
+ZIMBABWE            2 H  AHEAD OF UTC
diff --git a/commands/zoneinfo/usno1995 b/commands/zoneinfo/usno1995
new file mode 100644 (file)
index 0000000..ff114a6
--- /dev/null
@@ -0,0 +1,326 @@
+# @(#)usno1995 7.5
+#
+# From Arthur David Olson (1995-12-21):
+#
+# Here's time zone information from the United States Naval Observatory
+# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
+World Time Zones
+For selected countries, the local standard time offset from UTC is given,
+with daylight savings time where observed.
+Time: Thu Dec 21 17:43:00 utc 1995
+Afghanistan: +4.5 hours
+Albania: +1 hours (Local summer +2 hours)
+Algeria: +1 hours (Local summer +2 hours)
+American Samoa: -11 hours
+Andorra: +1 hours (Local summer +2 hours)
+Angola: +1 hours
+Anguilla: -4 hours
+Antarctica: -2 hours (Local summer -3 hours)
+Antigua: -4 hours
+Argentina: -3 hours
+Argentina western prov: -4 hours
+Armenia: +4 hours (Local summer +5 hours)
+Aruba: -4 hours
+Ascension: 0 hours
+Australia Northern Territory: +9.5 hours
+Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
+Australia New South Wales: +10 hours (Local summer +11 hours)
+Australia Queensland: +10 hours
+Australia Victoria: +10 hours (Local summer +11 hours)
+Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
+Australia South: +9.5 hours (Local summer +10.5 hours)
+Australia Tasmania: +10 hours (Local summer +11 hours)
+Australia Western: +8 hours
+Austria: +1 hours (Local summer +2 hours)
+Azerbajian: +3 hours
+Azores: -1 hours (Local summer 0 hours)
+Bahamas: -5 hours (Local summer -4 hours)
+Bahrain: +3 hours
+Balearic Islands: +1 hours (Local summer +2 hours)
+Bangladesh: +6 hours
+Barbados: -4 hours
+Belarus: +2 hours (Local summer +3 hours)
+Belgium: +1 hours (Local summer +2 hours)
+Belize: -6 hours
+Benin: +1 hours
+Bermuda: -4 hours (Local summer -3 hours)
+Bhutan: +6 hours
+Bolivia: -4 hours
+Bonaire: -4 hours
+Bosnia Hercegovina: +1 hours (Local summer +2 hours)
+Botswana: +2 hours
+Brazil Acre: -4 hours (Local summer -5 hours)
+Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
+Brazil East: -3 hours (Local summer -1 hours)
+Brazil West: -4 hours (Local summer -3 hours)
+British Virgin Islands: -4 hours
+Brunei: +8 hours
+Bulgaria: +2 hours (Local summer +3 hours)
+Burkina Faso: 0 hours
+Burundi: +2 hours
+Cambodia: +7 hours
+Cameroon: +1 hours
+Canada Central: -6 hours (Local summer -5 hours)
+Canada Eastern: -5 hours (Local summer -4 hours)
+Canada Mountain: -7 hours (Local summer -6 hours)
+Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
+Canada Atlantic: -4 hours (Local summer -3 hours)
+Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
+Canary Islands: 0 hours (Local summer +1 hours)
+Canton Enderbury Islands: -11 hours
+Cape Verde: -1 hours
+Caroline Island: +11 hours
+Cayman Islands: -5 hours
+Central African Rep: +1 hours
+Chad: +1 hours
+Channel Islands: 0 hours (Local summer +1 hours)
+Chatham Island: +12.75 hours (Local summer +13.75 hours)
+Chile: -4 hours (Local summer -3 hours)
+China People's Rep: +8 hours
+Christmas Islands: -10 hours
+Cocos (Keeling) Islands: ( hours (Local summer ) hours)
+Colombia: -5 hours
+Congo: +1 hours
+Cook Islands: -10 hours
+Costa Rica: -6 hours
+Cote d'Ivoire: 0 hours
+Croatia: +1 hours (Local summer +2 hours)
+Cuba: -5 hours (Local summer -4 hours)
+Curacao: -4 hours
+Cyprus: +2 hours (Local summer +3 hours)
+Czech Republic: +1 hours (Local summer +2 hours)
+Dahomey: +1 hours
+Denmark: +1 hours (Local summer +2 hours)
+Djibouti: +3 hours
+Dominica: -4 hours
+Dominican Republic: -4 hours
+Easter Island: -6 hours (Local summer -5 hours)
+Ecuador: -5 hours
+Egypt: +2 hours (Local summer +3 hours)
+El Salvador: -6 hours
+England: 0 hours (Local summer +1 hours)
+Equitorial Guinea: +1 hours
+Eritrea: +3 hours
+Estonia: +2 hours (Local summer +3 hours)
+Ethiopia: +3 hours
+Falkland Islands: -4 hours (Local summer -3 hours)
+Faroe Island: 0 hours (Local summer +1 hours)
+Fiji: +12 hours
+Finland: +2 hours (Local summer +3 hours)
+France: +1 hours (Local summer +2 hours)
+French Guiana: -3 hours
+French Polynesia: -10 hours
+Gabon: +1 hours
+Galapagos Islands: -6 hours
+Gambia: 0 hours
+Gambier Island: -9 hours
+Georgia: +4 hours
+Germany: +1 hours (Local summer +2 hours)
+Ghana: 0 hours
+Gibraltar: +1 hours (Local summer +2 hours)
+Greece: +2 hours (Local summer +3 hours)
+Greenland: -3 hours (Local summer -2 hours)
+Greenland Thule: -4 hours (Local summer -3 hours)
+Greenland Scoresbysun: -1 hours (Local summer 0 hours)
+Grenada: -4 hours
+Grenadines: -4 hours
+Guadeloupe: -4 hours
+Guam: +10 hours
+Guatemala: -6 hours
+Guinea: 0 hours
+Guinea Bissau: - hours (Local summer 0 hours)
+Guyana: -3 hours
+Haiti: -5 hours (Local summer -4 hours)
+Honduras: -6 hours
+Hong kong: +8 hours
+Hungary: +1 hours (Local summer +2 hours)
+Iceland: 0 hours
+India: +5.5 hours
+Indonesia Central: +8 hours
+Indonesia East: +9 hours
+Indonesia West: +7 hours
+Iran: +3.5 hours
+Iraq: +3 hours (Local summer +4 hours)
+Ireland Republic of: 0 hours (Local summer +1 hours)
+Israel: +2 hours (Local summer +3 hours)
+Italy: +1 hours (Local summer +2 hours)
+Jamaica: -5 hours
+Japan: +9 hours
+Johnston Island: -10 hours
+Jordan: +2 hours (Local summer +3 hours)
+Kazakhstan: +6 hours (Local summer +7 hours)
+Kenya: +3 hours
+Kiribati: +12 hours
+Korea Dem Republic of: +9 hours
+Korea Republic of: +9 hours
+Kusaie: +12 hours
+Kuwait: +3 hours
+Kwajalein: -12 hours
+Kyrgyzstan: +5 hours (Local summer +6 hours)
+Laos: +7 hours
+Latvia: +2 hours (Local summer +3 hours)
+Lebanon: +2 hours (Local summer +3 hours)
+Leeward Islands: -4 hours
+Lesotho: +2 hours
+Liberia: 0 hours
+Libya: +2 hours
+Lithuania: +2 hours (Local summer +3 hours)
+Luxembourg: +1 hours (Local summer +2 hours)
+Macedonia: +1 hours (Local summer +2 hours)
+Madagascar: +3 hours
+Madeira: 0 hours (Local summer +1 hours)
+Malawi: +2 hours
+Malaysia: +8 hours
+Maldives: +5 hours
+Mali: 0 hours
+Mallorca Islands: +1 hours (Local summer +2 hours)
+Malta: +1 hours (Local summer +2 hours)
+Mariana Island: +10 hours
+Marquesas Islands: -9.5 hours
+Marshall Islands: +12 hours
+Martinique: -4 hours
+Mauritania: 0 hours
+Mauritius: +4 hours
+Mayotte: +3 hours
+Melilla: +1 hours (Local summer +2 hours)
+Mexico: -6 hours
+Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
+Mexico Nayarit: -7 hours
+Mexico Sinaloa: -7 hours
+Mexico Sonora: -7 hours
+Midway Island: -11 hours
+Moldova: +2 hours (Local summer +3 hours)
+Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
+Monaco: +1 hours (Local summer +2 hours)
+Mongolia: +8 hours
+Morocco: 0 hours
+Mozambique: +2 hours
+Myanmar: +6.5 hours
+Namibia: +1 hours (Local summer +2 hours)
+Nauru Republic of: +12 hours
+Nepal: +5.75 hours
+Netherlands: +1 hours (Local summer +2 hours)
+Netherlands Antilles: -4 hours
+Nevis Montserrat: -4 hours
+New Caledonia: +11 hours
+New Hebrides: +11 hours
+New Zealand: +12 hours (Local summer +13 hours)
+Nicaragua: -6 hours (Local summer -5 hours)
+Niger: +1 hours
+Nigeria: +1 hours
+Niue Island: -11 hours
+Norfolk Island: +11.5 hours
+Northern Ireland: 0 hours (Local summer +1 hours)
+Northern Mariana Islands: +10 hours
+Norway: +1 hours (Local summer +2 hours)
+Oman: +4 hours
+Pakistan: +5 hours
+Palau: +9 hours
+Panama: -5 hours
+Papua New Guinea: +10 hours
+Paraguay: -4 hours (Local summer -3 hours)
+Peru: -5 hours
+Philippines: +8 hours
+Pingelap: +12 hours
+Poland: +1 hours (Local summer +2 hours)
+Ponape Island: +11 hours
+Portugal: +1 hours (Local summer +2 hours)
+Principe Island: 0 hours
+Puerto Rico: -4 hours
+Qatar: +3 hours
+Reunion: +4 hours
+Romania: +2 hours (Local summer +3 hours)
+Russian Federation zone eight: +9 hours (Local summer +10 hours)
+Russian Federation zone eleven: +12 hours (Local summer +13 hours)
+Russian Federation zone five: +6 hours (Local summer +7 hours)
+Russian Federation zone four: +5 hours (Local summer +6 hours)
+Russian Federation zone nine: +10 hours (Local summer +11 hours)
+Russian Federation zone one: +2 hours (Local summer +3 hours)
+Russian Federation zone seven: +8 hours (Local summer +9 hours)
+Russian Federation zone six: +7 hours (Local summer +8 hours)
+Russian Federation zone ten: +11 hours (Local summer +12 hours)
+Russian Federation zone three: +4 hours (Local summer +5 hours)
+Russian Federation zone two: +4 hours (Local summer +5 hours)
+Rwanda: +2 hours
+Saba: -4 hours
+Samoa: -11 hours
+San Marino: +1 hours (Local summer +2 hours)
+Sao Tome e Principe: 0 hours
+Saudi Arabia: +3 hours
+Scotland: 0 hours
+Senegal: 0 hours
+Seychelles: +4 hours
+Sierra Leone: 0 hours
+Singapore: +8 hours
+Slovakia: +1 hours (Local summer +2 hours)
+Slovenia: +1 hours (Local summer +2 hours)
+Society Island: -10 hours
+Solomon Islands: +11 hours
+Somalia: +3 hours
+South Africa: +2 hours
+Spain: +1 hours (Local summer +2 hours)
+Sri Lanka: +5.5 hours
+St Christopher: -4 hours
+St Croix: -4 hours
+St Helena: 0 hours
+St John: -4 hours
+St Kitts Nevis: -4 hours
+St Lucia: -4 hours
+St Maarten: -4 hours
+St Pierre & Miquelon: -3 hours (Local summer -2 hours)
+St Thomas: -4 hours
+St Vincent: -4 hours
+Sudan: +2 hours
+Suriname: -3 hours
+Swaziland: +2 hours
+Sweden: +1 hours (Local summer +2 hours)
+Switzerland: +1 hours (Local summer +2 hours)
+Syria: +2 hours (Local summer +3 hours)
+Tahiti: -10 hours
+Taiwan: +8 hours
+Tajikistan: +6 hours
+Tanzania: +3 hours
+Thailand: +7 hours
+Togo: 0 hours
+Tonga: +13 hours
+Trinidad and Tobago: -4 hours
+Tuamotu Island: -10 hours
+Tubuai Island: -10 hours
+Tunisia: +1 hours
+Turkey: +2 hours (Local summer +3 hours)
+Turkmenistan: +5 hours
+Turks and Caicos Islands: -5 hours (Local summer -4 hours)
+Tuvalu: +12 hours
+Uganda: +3 hours
+Ukraine: +2 hours (Local summer +3 hours)
+United Arab Emirates: +4 hours
+United Kingdom: 0 hours (Local summer +1 hours)
+USA Central: -6 hours (Local summer -5 hours)
+USA Eastern: -5 hours (Local summer -4 hours)
+USA Mountain: -7 hours (Local summer -6 hours)
+USA Arizona: -7 hours
+USA Indiana East: -5 hours
+USA Pacific: -8 hours (Local summer -7 hours)
+USA Alaska: -9 hours (Local summer -8 hours)
+USA Hawaii Aleutian: - hours (Local summer -10 hours)
+Uruguay: -3 hours
+Uzbekistan: +5 hours
+Vanuatu: +11 hours (Local summer +12 hours)
+Vatican City: +1 hours (Local summer +2 hours)
+Venezuela: -4 hours
+Vietnam: +7 hours
+Virgin Islands: -4 hours
+Wake Island: +12 hours
+Wales: 0 hours (Local summer +1 hours)
+Wallis and Futuna Islands: +12 hours
+Windward Islands: -4 hours
+Yemen: +3 hours
+Yugoslavia: +1 hours (Local summer +2 hours)
+Zaire Kasai: +2 hours
+Zaire Kinshasa Mbandaka: +1 hours
+Zaire Haut Zaire: +2 hours
+Zaire Kivu: +2 hours
+Zaire Shaba: +2 hours
+Zambia: +2 hours
+Zimbabwe: +2 hours
+All timezone information is non-authoritative...
diff --git a/commands/zoneinfo/usno1997 b/commands/zoneinfo/usno1997
new file mode 100644 (file)
index 0000000..fa47d6a
--- /dev/null
@@ -0,0 +1,327 @@
+# @(#)usno1997 7.7
+#
+# From Arthur David Olson (1997-03-07):
+#
+# Here's time zone information from the United States Naval Observatory
+# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
+Unofficial Time Zone Information
+World Time Zones
+For selected countries, the local standard time offset from UTC is given, with  daylight savings time where observed.
+Time:  Fri Mar  7 22:38:58 UTC 1997
+Afghanistan: +4.5 hours
+Albania: +1 hours (Local summer +2 hours)
+Algeria: +1 hours (Local summer +2 hours)
+American Samoa: -11 hours
+Andorra: +1 hours (Local summer +2 hours)
+Angola: +1 hours
+Anguilla: -4 hours
+Antarctica: -2 hours (Local summer -3 hours)
+Antigua: -4 hours
+Argentina: -3 hours
+Argentina western prov: -4 hours
+Armenia: +4 hours (Local summer +5 hours)
+Aruba: -4 hours
+Ascension: 0 hours
+Australia Northern Territory: +9.5 hours
+Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
+Australia New South Wales: +10 hours (Local summer +11 hours)
+Australia Queensland: +10 hours
+Australia Victoria: +10 hours (Local summer +11 hours)
+Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
+Australia South: +9.5 hours (Local summer +10.5 hours)
+Australia Tasmania: +10 hours (Local summer +11 hours)
+Australia Western: +8 hours
+Austria: +1 hours (Local summer +2 hours)
+Azerbajian: +3 hours
+Azores: -1 hours (Local summer 0 hours)
+Bahamas: -5 hours (Local summer -4 hours)
+Bahrain: +3 hours
+Balearic Islands: +1 hours (Local summer +2 hours)
+Bangladesh: +6 hours
+Barbados: -4 hours
+Belarus: +2 hours (Local summer +3 hours)
+Belgium: +1 hours (Local summer +2 hours)
+Belize: -6 hours
+Benin: +1 hours
+Bermuda: -4 hours (Local summer -3 hours)
+Bhutan: +6 hours
+Bolivia: -4 hours
+Bonaire: -4 hours
+Bosnia Hercegovina: +1 hours (Local summer +2 hours)
+Botswana: +2 hours
+Brazil Acre: -4 hours (Local summer -5 hours)
+Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
+Brazil East: -3 hours (Local summer -1 hours)
+Brazil West: -4 hours (Local summer -3 hours)
+British Virgin Islands: -4 hours
+Brunei: +8 hours
+Bulgaria: +2 hours (Local summer +3 hours)
+Burkina Faso: 0 hours
+Burundi: +2 hours
+Cambodia: +7 hours
+Cameroon: +1 hours
+Canada Central: -6 hours (Local summer -5 hours)
+Canada Eastern: -5 hours (Local summer -4 hours)
+Canada Mountain: -7 hours (Local summer -6 hours)
+Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
+Canada Atlantic: -4 hours (Local summer -3 hours)
+Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
+Canary Islands: 0 hours (Local summer +1 hours)
+Canton Enderbury Islands: -11 hours
+Cape Verde: -1 hours
+Caroline Island: +11 hours
+Cayman Islands: -5 hours
+Central African Rep: +1 hours
+Chad: +1 hours
+Channel Islands: 0 hours (Local summer +1 hours)
+Chatham Island: +12.75 hours (Local summer +13.75 hours)
+Chile: -4 hours (Local summer -3 hours)
+China People's Rep: +8 hours
+Christmas Islands: -10 hours
+Cocos (Keeling) Islands: ( hours (Local summer ) hours)
+Colombia: -5 hours
+Congo: +1 hours
+Cook Islands: -10 hours
+Costa Rica: -6 hours
+Cote d'Ivoire: 0 hours
+Croatia: +1 hours (Local summer +2 hours)
+Cuba: -5 hours (Local summer -4 hours)
+Curacao: -4 hours
+Cyprus: +2 hours (Local summer +3 hours)
+Czech Republic: +1 hours (Local summer +2 hours)
+Dahomey: +1 hours
+Denmark: +1 hours (Local summer +2 hours)
+Djibouti: +3 hours
+Dominica: -4 hours
+Dominican Republic: -4 hours
+Easter Island: -6 hours (Local summer -5 hours)
+Ecuador: -5 hours
+Egypt: +2 hours (Local summer +3 hours)
+El Salvador: -6 hours
+England: 0 hours (Local summer +1 hours)
+Equitorial Guinea: +1 hours
+Eritrea: +3 hours
+Estonia: +2 hours (Local summer +3 hours)
+Ethiopia: +3 hours
+Falkland Islands: -4 hours (Local summer -3 hours)
+Faroe Island: 0 hours (Local summer +1 hours)
+Fiji: +12 hours
+Finland: +2 hours (Local summer +3 hours)
+France: +1 hours (Local summer +2 hours)
+French Guiana: -3 hours
+French Polynesia: -10 hours
+Gabon: +1 hours
+Galapagos Islands: -5 hours
+Gambia: 0 hours
+Gambier Island: -9 hours
+Georgia: +4 hours
+Germany: +1 hours (Local summer +2 hours)
+Ghana: 0 hours
+Gibraltar: +1 hours (Local summer +2 hours)
+Greece: +2 hours (Local summer +3 hours)
+Greenland: -3 hours (Local summer -2 hours)
+Greenland Thule: -4 hours (Local summer -3 hours)
+Greenland Scoresbysun: -1 hours (Local summer 0 hours)
+Grenada: -4 hours
+Grenadines: -4 hours
+Guadeloupe: -4 hours
+Guam: +10 hours
+Guatemala: -6 hours
+Guinea: 0 hours
+Guinea Bissau: - hours (Local summer 0 hours)
+Guyana: -3 hours
+Haiti: -5 hours (Local summer -4 hours)
+Honduras: -6 hours
+Hong kong: +8 hours
+Hungary: +1 hours (Local summer +2 hours)
+Iceland: 0 hours
+India: +5.5 hours
+Indonesia Central: +8 hours
+Indonesia East: +9 hours
+Indonesia West: +7 hours
+Iran: +3.5 hours
+Iraq: +3 hours (Local summer +4 hours)
+Ireland Republic of: 0 hours (Local summer +1 hours)
+Israel: +2 hours (Local summer +3 hours)
+Italy: +1 hours (Local summer +2 hours)
+Jamaica: -5 hours
+Japan: +9 hours
+Johnston Island: -10 hours
+Jordan: +2 hours (Local summer +3 hours)
+Kazakhstan: +6 hours (Local summer +7 hours)
+Kenya: +3 hours
+Kiribati: +12 hours
+Korea Dem Republic of: +9 hours
+Korea Republic of: +9 hours
+Kusaie: +12 hours
+Kuwait: +3 hours
+Kwajalein: -12 hours
+Kyrgyzstan: +5 hours (Local summer +6 hours)
+Laos: +7 hours
+Latvia: +2 hours (Local summer +3 hours)
+Lebanon: +2 hours (Local summer +3 hours)
+Leeward Islands: -4 hours
+Lesotho: +2 hours
+Liberia: 0 hours
+Libya: +2 hours
+Lithuania: +2 hours (Local summer +3 hours)
+Luxembourg: +1 hours (Local summer +2 hours)
+Macedonia: +1 hours (Local summer +2 hours)
+Madagascar: +3 hours
+Madeira: 0 hours (Local summer +1 hours)
+Malawi: +2 hours
+Malaysia: +8 hours
+Maldives: +5 hours
+Mali: 0 hours
+Mallorca Islands: +1 hours (Local summer +2 hours)
+Malta: +1 hours (Local summer +2 hours)
+Mariana Island: +10 hours
+Marquesas Islands: -9.5 hours
+Marshall Islands: +12 hours
+Martinique: -4 hours
+Mauritania: 0 hours
+Mauritius: +4 hours
+Mayotte: +3 hours
+Melilla: +1 hours (Local summer +2 hours)
+Mexico: -6 hours
+Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
+Mexico Nayarit: -7 hours
+Mexico Sinaloa: -7 hours
+Mexico Sonora: -7 hours
+Midway Island: -11 hours
+Moldova: +2 hours (Local summer +3 hours)
+Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
+Monaco: +1 hours (Local summer +2 hours)
+Mongolia: +8 hours
+Morocco: 0 hours
+Mozambique: +2 hours
+Myanmar: +6.5 hours
+Namibia: +1 hours (Local summer +2 hours)
+Nauru Republic of: +12 hours
+Nepal: +5.75 hours
+Netherlands: +1 hours (Local summer +2 hours)
+Netherlands Antilles: -4 hours
+Nevis Montserrat: -4 hours
+New Caledonia: +11 hours
+New Hebrides: +11 hours
+New Zealand: +12 hours (Local summer +13 hours)
+Nicaragua: -6 hours (Local summer -5 hours)
+Niger: +1 hours
+Nigeria: +1 hours
+Niue Island: -11 hours
+Norfolk Island: +11.5 hours
+Northern Ireland: 0 hours (Local summer +1 hours)
+Northern Mariana Islands: +10 hours
+Norway: +1 hours (Local summer +2 hours)
+Oman: +4 hours
+Pakistan: +5 hours
+Palau: +9 hours
+Panama: -5 hours
+Papua New Guinea: +10 hours
+Paraguay: -4 hours (Local summer -3 hours)
+Peru: -5 hours
+Philippines: +8 hours
+Pingelap: +12 hours
+Poland: +1 hours (Local summer +2 hours)
+Ponape Island: +11 hours
+Portugal: +1 hours (Local summer +2 hours)
+Principe Island: 0 hours
+Puerto Rico: -4 hours
+Qatar: +3 hours
+Reunion: +4 hours
+Romania: +2 hours (Local summer +3 hours)
+Russian Federation zone eight: +9 hours (Local summer +10 hours)
+Russian Federation zone eleven: +12 hours (Local summer +13 hours)
+Russian Federation zone five: +6 hours (Local summer +7 hours)
+Russian Federation zone four: +5 hours (Local summer +6 hours)
+Russian Federation zone nine: +10 hours (Local summer +11 hours)
+Russian Federation zone one: +2 hours (Local summer +3 hours)
+Russian Federation zone seven: +8 hours (Local summer +9 hours)
+Russian Federation zone six: +7 hours (Local summer +8 hours)
+Russian Federation zone ten: +11 hours (Local summer +12 hours)
+Russian Federation zone three: +4 hours (Local summer +5 hours)
+Russian Federation zone two: +4 hours (Local summer +5 hours)
+Rwanda: +2 hours
+Saba: -4 hours
+Samoa: -11 hours
+San Marino: +1 hours (Local summer +2 hours)
+Sao Tome e Principe: 0 hours
+Saudi Arabia: +3 hours
+Scotland: 0 hours (Local summer +1 hours)
+Senegal: 0 hours
+Seychelles: +4 hours
+Sierra Leone: 0 hours
+Singapore: +8 hours
+Slovakia: +1 hours (Local summer +2 hours)
+Slovenia: +1 hours (Local summer +2 hours)
+Society Island: -10 hours
+Solomon Islands: +11 hours
+Somalia: +3 hours
+South Africa: +2 hours
+Spain: +1 hours (Local summer +2 hours)
+Sri Lanka: +5.5 hours
+St Christopher: -4 hours
+St Croix: -4 hours
+St Helena: 0 hours
+St John: -4 hours
+St Kitts Nevis: -4 hours
+St Lucia: -4 hours
+St Maarten: -4 hours
+St Pierre & Miquelon: -3 hours (Local summer -2 hours)
+St Thomas: -4 hours
+St Vincent: -4 hours
+Sudan: +2 hours
+Suriname: -3 hours
+Swaziland: +2 hours
+Sweden: +1 hours (Local summer +2 hours)
+Switzerland: +1 hours (Local summer +2 hours)
+Syria: +2 hours (Local summer +3 hours)
+Tahiti: -10 hours
+Taiwan: +8 hours
+Tajikistan: +6 hours
+Tanzania: +3 hours
+Thailand: +7 hours
+Togo: 0 hours
+Tonga: +13 hours
+Trinidad and Tobago: -4 hours
+Tuamotu Island: -10 hours
+Tubuai Island: -10 hours
+Tunisia: +1 hours
+Turkey: +2 hours (Local summer +3 hours)
+Turkmenistan: +5 hours
+Turks and Caicos Islands: -5 hours (Local summer -4 hours)
+Tuvalu: +12 hours
+Uganda: +3 hours
+Ukraine: +2 hours (Local summer +3 hours)
+United Arab Emirates: +4 hours
+United Kingdom: 0 hours (Local summer +1 hours)
+USA Central: -6 hours (Local summer -5 hours)
+USA Eastern: -5 hours (Local summer -4 hours)
+USA Mountain: -7 hours (Local summer -6 hours)
+USA Arizona: -7 hours
+USA Indiana East: -5 hours
+USA Pacific: -8 hours (Local summer -7 hours)
+USA Alaska: -9 hours (Local summer -8 hours)
+USA Aleutian: -10 hours
+USA Hawaii: -10 hours
+Uruguay: -3 hours
+Uzbekistan: +5 hours
+Vanuatu: +11 hours (Local summer +12 hours)
+Vatican City: +1 hours (Local summer +2 hours)
+Venezuela: -4 hours
+Vietnam: +7 hours
+Virgin Islands: -4 hours
+Wake Island: +12 hours
+Wales: 0 hours (Local summer +1 hours)
+Wallis and Futuna Islands: +12 hours
+Windward Islands: -4 hours
+Yemen: +3 hours
+Yugoslavia: +1 hours (Local summer +2 hours)
+Zaire Kasai: +2 hours
+Zaire Kinshasa Mbandaka: +1 hours
+Zaire Haut Zaire: +2 hours
+Zaire Kivu: +2 hours
+Zaire Shaba: +2 hours
+Zambia: +2 hours
+Zimbabwe: +2 hours
+All timezone information is non-authoritative...
diff --git a/commands/zoneinfo/usno1998 b/commands/zoneinfo/usno1998
new file mode 100644 (file)
index 0000000..ac70bc8
--- /dev/null
@@ -0,0 +1,327 @@
+# @(#)usno1998 7.4
+#
+# From Arthur David Olson (1998-05-26):
+#
+# Here's time zone information from the United States Naval Observatory
+# via http://tycho.usno.navy.mil/tzones.html. See USNO's note at the end.
+Unofficial Time Zone Information
+World Time Zones
+For selected countries, the local standard time offset from UTC is given, with  daylight savings time where observed.
+Time:  Mon May 25 21:14:24 UTC 1998
+Afghanistan: +4.5 hours
+Albania: +1 hours (Local summer +2 hours)
+Algeria: +1 hours (Local summer +2 hours)
+American Samoa: -11 hours
+Andorra: +1 hours (Local summer +2 hours)
+Angola: +1 hours
+Anguilla: -4 hours
+Antarctica: -2 hours (Local summer -3 hours)
+Antigua: -4 hours
+Argentina: -3 hours
+Argentina western prov: -4 hours
+Armenia: +4 hours (Local summer +5 hours)
+Aruba: -4 hours
+Ascension: 0 hours
+Australia Northern Territory: +9.5 hours
+Australia Lord Howe Island: +10.5 hours (Local summer +11 hours)
+Australia New South Wales: +10 hours (Local summer +11 hours)
+Australia Queensland: +10 hours
+Australia Victoria: +10 hours (Local summer +11 hours)
+Australia Australian Captial Territory: +10 hours (Local summer +11 hours)
+Australia South: +9.5 hours (Local summer +10.5 hours)
+Australia Tasmania: +10 hours (Local summer +11 hours)
+Australia Western: +8 hours
+Austria: +1 hours (Local summer +2 hours)
+Azerbajian: +3 hours
+Azores: -1 hours (Local summer 0 hours)
+Bahamas: -5 hours (Local summer -4 hours)
+Bahrain: +3 hours
+Balearic Islands: +1 hours (Local summer +2 hours)
+Bangladesh: +6 hours
+Barbados: -4 hours
+Belarus: +2 hours (Local summer +3 hours)
+Belgium: +1 hours (Local summer +2 hours)
+Belize: -6 hours
+Benin: +1 hours
+Bermuda: -4 hours (Local summer -3 hours)
+Bhutan: +6 hours
+Bolivia: -4 hours
+Bonaire: -4 hours
+Bosnia Hercegovina: +1 hours (Local summer +2 hours)
+Botswana: +2 hours
+Brazil Acre: -4 hours (Local summer -5 hours)
+Brazil Atlantic Islands: -1 hours (Local summer -2 hours)
+Brazil East: -3 hours (Local summer -1 hours)
+Brazil West: -4 hours (Local summer -3 hours)
+British Virgin Islands: -4 hours
+Brunei: +8 hours
+Bulgaria: +2 hours (Local summer +3 hours)
+Burkina Faso: 0 hours
+Burundi: +2 hours
+Cambodia: +7 hours
+Cameroon: +1 hours
+Canada Central: -6 hours (Local summer -5 hours)
+Canada Eastern: -5 hours (Local summer -4 hours)
+Canada Mountain: -7 hours (Local summer -6 hours)
+Canada Yukon & Pacific: -8 hours (Local summer -7 hours)
+Canada Atlantic: -4 hours (Local summer -3 hours)
+Canada Newfoundland: -3.5 hours (Local summer -2.5 hours)
+Canary Islands: 0 hours (Local summer +1 hours)
+Canton Enderbury Islands: -11 hours
+Cape Verde: -1 hours
+Caroline Island: +11 hours
+Cayman Islands: -5 hours
+Central African Rep: +1 hours
+Chad: +1 hours
+Channel Islands: 0 hours (Local summer +1 hours)
+Chatham Island: +12.75 hours (Local summer +13.75 hours)
+Chile: -4 hours (Local summer -3 hours)
+China People's Rep: +8 hours
+Christmas Islands: -10 hours
+Cocos (Keeling) Islands: ( hours (Local summer ) hours)
+Colombia: -5 hours
+Congo: +1 hours
+Cook Islands: -10 hours
+Costa Rica: -6 hours
+Cote d'Ivoire: 0 hours
+Croatia: +1 hours (Local summer +2 hours)
+Cuba: -5 hours (Local summer -4 hours)
+Curacao: -4 hours
+Cyprus: +2 hours (Local summer +3 hours)
+Czech Republic: +1 hours (Local summer +2 hours)
+Dahomey: +1 hours
+Denmark: +1 hours (Local summer +2 hours)
+Djibouti: +3 hours
+Dominica: -4 hours
+Dominican Republic: -4 hours
+Easter Island: -6 hours (Local summer -5 hours)
+Ecuador: -5 hours
+Egypt: +2 hours (Local summer +3 hours)
+El Salvador: -6 hours
+England: 0 hours (Local summer +1 hours)
+Equitorial Guinea: +1 hours
+Eritrea: +3 hours
+Estonia: +2 hours (Local summer +3 hours)
+Ethiopia: +3 hours
+Falkland Islands: -4 hours (Local summer -3 hours)
+Faroe Island: 0 hours (Local summer +1 hours)
+Fiji: +12 hours
+Finland: +2 hours (Local summer +3 hours)
+France: +1 hours (Local summer +2 hours)
+French Guiana: -3 hours
+French Polynesia: -10 hours
+Gabon: +1 hours
+Galapagos Islands: -5 hours
+Gambia: 0 hours
+Gambier Island: -9 hours
+Georgia: +4 hours
+Germany: +1 hours (Local summer +2 hours)
+Ghana: 0 hours
+Gibraltar: +1 hours (Local summer +2 hours)
+Greece: +2 hours (Local summer +3 hours)
+Greenland: -3 hours (Local summer -2 hours)
+Greenland Thule: -4 hours (Local summer -3 hours)
+Greenland Scoresbysun: -1 hours (Local summer 0 hours)
+Grenada: -4 hours
+Grenadines: -4 hours
+Guadeloupe: -4 hours
+Guam: +10 hours
+Guatemala: -6 hours
+Guinea: 0 hours
+Guinea Bissau: - hours (Local summer 0 hours)
+Guyana: -3 hours
+Haiti: -5 hours (Local summer -4 hours)
+Honduras: -6 hours
+Hong kong: +8 hours
+Hungary: +1 hours (Local summer +2 hours)
+Iceland: 0 hours
+India: +5.5 hours
+Indonesia Central: +8 hours
+Indonesia East: +9 hours
+Indonesia West: +7 hours
+Iran: +3.5 hours
+Iraq: +3 hours (Local summer +4 hours)
+Ireland Republic of: 0 hours (Local summer +1 hours)
+Israel: +2 hours (Local summer +3 hours)
+Italy: +1 hours (Local summer +2 hours)
+Jamaica: -5 hours
+Japan: +9 hours
+Johnston Island: -10 hours
+Jordan: +2 hours (Local summer +3 hours)
+Kazakhstan: +6 hours (Local summer +7 hours)
+Kenya: +3 hours
+Kiribati: +12 hours
+Korea Dem Republic of: +9 hours
+Korea Republic of: +9 hours
+Kusaie: +12 hours
+Kuwait: +3 hours
+Kwajalein: -12 hours
+Kyrgyzstan: +5 hours (Local summer +6 hours)
+Laos: +7 hours
+Latvia: +2 hours (Local summer +3 hours)
+Lebanon: +2 hours (Local summer +3 hours)
+Leeward Islands: -4 hours
+Lesotho: +2 hours
+Liberia: 0 hours
+Libya: +2 hours
+Lithuania: +2 hours (Local summer +3 hours)
+Luxembourg: +1 hours (Local summer +2 hours)
+Macedonia: +1 hours (Local summer +2 hours)
+Madagascar: +3 hours
+Madeira: 0 hours (Local summer +1 hours)
+Malawi: +2 hours
+Malaysia: +8 hours
+Maldives: +5 hours
+Mali: 0 hours
+Mallorca Islands: +1 hours (Local summer +2 hours)
+Malta: +1 hours (Local summer +2 hours)
+Mariana Island: +10 hours
+Marquesas Islands: -9.5 hours
+Marshall Islands: +12 hours
+Martinique: -4 hours
+Mauritania: 0 hours
+Mauritius: +4 hours
+Mayotte: +3 hours
+Melilla: +1 hours (Local summer +2 hours)
+Mexico: -6 hours
+Mexico Baja Calif Norte: -8 hours (Local summer -7 hours)
+Mexico Nayarit: -7 hours
+Mexico Sinaloa: -7 hours
+Mexico Sonora: -7 hours
+Midway Island: -11 hours
+Moldova: +2 hours (Local summer +3 hours)
+Moldovian Rep Pridnestrovye: +2 hours (Local summer +3 hours)
+Monaco: +1 hours (Local summer +2 hours)
+Mongolia: +8 hours
+Morocco: 0 hours
+Mozambique: +2 hours
+Myanmar: +6.5 hours
+Namibia: +1 hours (Local summer +2 hours)
+Nauru Republic of: +12 hours
+Nepal: +5.75 hours
+Netherlands: +1 hours (Local summer +2 hours)
+Netherlands Antilles: -4 hours
+Nevis Montserrat: -4 hours
+New Caledonia: +11 hours
+New Hebrides: +11 hours
+New Zealand: +12 hours (Local summer +13 hours)
+Nicaragua: -6 hours (Local summer -5 hours)
+Niger: +1 hours
+Nigeria: +1 hours
+Niue Island: -11 hours
+Norfolk Island: +11.5 hours
+Northern Ireland: 0 hours (Local summer +1 hours)
+Northern Mariana Islands: +10 hours
+Norway: +1 hours (Local summer +2 hours)
+Oman: +4 hours
+Pakistan: +5 hours
+Palau: +9 hours
+Panama: -5 hours
+Papua New Guinea: +10 hours
+Paraguay: -4 hours (Local summer -3 hours)
+Peru: -5 hours
+Philippines: +8 hours
+Pingelap: +12 hours
+Poland: +1 hours (Local summer +2 hours)
+Ponape Island: +11 hours
+Portugal: +1 hours (Local summer +2 hours)
+Principe Island: 0 hours
+Puerto Rico: -4 hours
+Qatar: +3 hours
+Reunion: +4 hours
+Romania: +2 hours (Local summer +3 hours)
+Russian Federation zone eight: +9 hours (Local summer +10 hours)
+Russian Federation zone eleven: +12 hours (Local summer +13 hours)
+Russian Federation zone five: +6 hours (Local summer +7 hours)
+Russian Federation zone four: +5 hours (Local summer +6 hours)
+Russian Federation zone nine: +10 hours (Local summer +11 hours)
+Russian Federation zone one: +2 hours (Local summer +3 hours)
+Russian Federation zone seven: +8 hours (Local summer +9 hours)
+Russian Federation zone six: +7 hours (Local summer +8 hours)
+Russian Federation zone ten: +11 hours (Local summer +12 hours)
+Russian Federation zone three: +4 hours (Local summer +5 hours)
+Russian Federation zone two: +4 hours (Local summer +5 hours)
+Rwanda: +2 hours
+Saba: -4 hours
+Samoa: -11 hours
+San Marino: +1 hours (Local summer +2 hours)
+Sao Tome e Principe: 0 hours
+Saudi Arabia: +3 hours
+Scotland: 0 hours (Local summer +1 hours)
+Senegal: 0 hours
+Seychelles: +4 hours
+Sierra Leone: 0 hours
+Singapore: +8 hours
+Slovakia: +1 hours (Local summer +2 hours)
+Slovenia: +1 hours (Local summer +2 hours)
+Society Island: -10 hours
+Solomon Islands: +11 hours
+Somalia: +3 hours
+South Africa: +2 hours
+Spain: +1 hours (Local summer +2 hours)
+Sri Lanka: +5.5 hours
+St Christopher: -4 hours
+St Croix: -4 hours
+St Helena: 0 hours
+St John: -4 hours
+St Kitts Nevis: -4 hours
+St Lucia: -4 hours
+St Maarten: -4 hours
+St Pierre & Miquelon: -3 hours (Local summer -2 hours)
+St Thomas: -4 hours
+St Vincent: -4 hours
+Sudan: +2 hours
+Suriname: -3 hours
+Swaziland: +2 hours
+Sweden: +1 hours (Local summer +2 hours)
+Switzerland: +1 hours (Local summer +2 hours)
+Syria: +2 hours (Local summer +3 hours)
+Tahiti: -10 hours
+Taiwan: +8 hours
+Tajikistan: +6 hours
+Tanzania: +3 hours
+Thailand: +7 hours
+Togo: 0 hours
+Tonga: +13 hours
+Trinidad and Tobago: -4 hours
+Tuamotu Island: -10 hours
+Tubuai Island: -10 hours
+Tunisia: +1 hours
+Turkey: +2 hours (Local summer +3 hours)
+Turkmenistan: +5 hours
+Turks and Caicos Islands: -5 hours (Local summer -4 hours)
+Tuvalu: +12 hours
+Uganda: +3 hours
+Ukraine: +2 hours (Local summer +3 hours)
+United Arab Emirates: +4 hours
+United Kingdom: 0 hours (Local summer +1 hours)
+USA Central: -6 hours (Local summer -5 hours)
+USA Eastern: -5 hours (Local summer -4 hours)
+USA Mountain: -7 hours (Local summer -6 hours)
+USA Arizona: -7 hours
+USA Indiana East: -5 hours
+USA Pacific: -8 hours (Local summer -7 hours)
+USA Alaska: -9 hours (Local summer -8 hours)
+USA Aleutian: -10 hours
+USA Hawaii: -10 hours
+Uruguay: -3 hours
+Uzbekistan: +5 hours
+Vanuatu: +11 hours (Local summer +12 hours)
+Vatican City: +1 hours (Local summer +2 hours)
+Venezuela: -4 hours
+Vietnam: +7 hours
+Virgin Islands: -4 hours
+Wake Island: +12 hours
+Wales: 0 hours (Local summer +1 hours)
+Wallis and Futuna Islands: +12 hours
+Windward Islands: -4 hours
+Yemen: +3 hours
+Yugoslavia: +1 hours (Local summer +2 hours)
+Zaire Kasai: +2 hours
+Zaire Kinshasa Mbandaka: +1 hours
+Zaire Haut Zaire: +2 hours
+Zaire Kivu: +2 hours
+Zaire Shaba: +2 hours
+Zambia: +2 hours
+Zimbabwe: +2 hours
+All timezone information is non-authoritative...
diff --git a/commands/zoneinfo/workman.sh b/commands/zoneinfo/workman.sh
new file mode 100644 (file)
index 0000000..1ea32fc
--- /dev/null
@@ -0,0 +1,29 @@
+#! /bin/sh
+
+# @(#)workman.sh       1.8
+
+# Tell groff not to emit SGR escape sequences (ANSI color escapes).
+GROFF_NO_SGR=1
+export GROFF_NO_SGR
+
+echo ".am TH
+.hy 0
+.na
+..
+.rm }H
+.rm }F" | nroff -man - ${1+"$@"} | perl -ne '
+       chomp;
+       s/.\010//g;
+       s/\s*$//;
+       if (/^$/) {
+               $sawblank = 1;
+               next;
+       } else {
+               if ($sawblank && $didprint) {
+                       print "\n";
+                       $sawblank = 0;
+               }
+               print "$_\n";
+               $didprint = 1;
+       }
+'
diff --git a/commands/zoneinfo/yearistype.sh b/commands/zoneinfo/yearistype.sh
new file mode 100644 (file)
index 0000000..66dbf89
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+
+: 'This file is in the public domain, so clarified as of'
+: '2006-07-17 by Arthur David Olson.'
+
+: '@(#)yearistype.sh   8.2'
+
+case $#-$1 in
+       2-|2-0*|2-*[!0-9]*)
+               echo "$0: wild year - $1" >&2
+               exit 1 ;;
+esac
+
+case $#-$2 in
+       2-even)
+               case $1 in
+                       *[24680])                       exit 0 ;;
+                       *)                              exit 1 ;;
+               esac ;;
+       2-nonpres|2-nonuspres)
+               case $1 in
+                       *[02468][048]|*[13579][26])     exit 1 ;;
+                       *)                              exit 0 ;;
+               esac ;;
+       2-odd)
+               case $1 in
+                       *[13579])                       exit 0 ;;
+                       *)                              exit 1 ;;
+               esac ;;
+       2-uspres)
+               case $1 in
+                       *[02468][048]|*[13579][26])     exit 0 ;;
+                       *)                              exit 1 ;;
+               esac ;;
+       2-*)
+               echo "$0: wild type - $2" >&2 ;;
+esac
+
+echo "$0: usage is $0 year even|odd|uspres|nonpres|nonuspres" >&2
+exit 1
diff --git a/commands/zoneinfo/zdump.8 b/commands/zoneinfo/zdump.8
new file mode 100644 (file)
index 0000000..b22a129
--- /dev/null
@@ -0,0 +1,57 @@
+.TH ZDUMP 8
+.SH NAME
+zdump \- time zone dumper
+.SH SYNOPSIS
+.B zdump
+[
+.B \-\-version
+]
+[
+.B \-v
+] [
+.B \-c
+[loyear,]hiyear ] [ zonename ... ]
+.SH DESCRIPTION
+.I Zdump
+prints the current time in each
+.I zonename
+named on the command line.
+.PP
+These options are available:
+.TP
+.BI "\-\-version"
+Output version information and exit.
+.TP
+.B \-v
+For each
+.I zonename
+on the command line,
+print the time at the lowest possible time value,
+the time one day after the lowest possible time value,
+the times both one second before and exactly at
+each detected time discontinuity,
+the time at one day less than the highest possible time value,
+and the time at the highest possible time value,
+Each line ends with
+.B isdst=1
+if the given time is Daylight Saving Time or
+.B isdst=0
+otherwise.
+.TP
+.BI "\-c " [loyear,]hiyear
+Cut off verbose output near the start of the given year(s).
+By default,
+the program cuts off verbose output near the starts of the years -500 and 2500.
+.SH LIMITATIONS
+The
+.B \-v
+option may not be used on systems with floating-point time_t values
+that are neither float nor double.
+.PP
+Time discontinuities are found by sampling the results returned by localtime
+at twelve-hour intervals.
+This works in all real-world cases;
+one can construct artificial time zones for which this fails.
+.SH "SEE ALSO"
+newctime(3), tzfile(5), zic(8)
+.\" @(#)zdump.8        7.7
diff --git a/commands/zoneinfo/zdump.8.txt b/commands/zoneinfo/zdump.8.txt
new file mode 100644 (file)
index 0000000..78c647f
--- /dev/null
@@ -0,0 +1,43 @@
+NAME
+
+     zdump - time zone dumper
+
+SYNOPSIS
+     zdump [ --version ] [ -v ] [ -c [loyear,]hiyear ] [ zonename
+     ... ]
+
+DESCRIPTION
+     Zdump prints the current time in each zonename named on the
+     command line.
+
+     These options are available:
+
+     --version
+          Output version information and exit.
+
+     -v   For each zonename on the command line, print the time
+          at the lowest possible time value, the time one day
+          after the lowest possible time value, the times both
+          one second before and exactly at each detected time
+          discontinuity, the time at one day less than the
+          highest possible time value, and the time at the
+          highest possible time value, Each line ends with
+          isdst=1 if the given time is Daylight Saving Time or
+          isdst=0 otherwise.
+
+     -c [loyear,]hiyear
+          Cut off verbose output near the start of the given
+          year(s).  By default, the program cuts off verbose
+          output near the starts of the years -500 and 2500.
+
+LIMITATIONS
+     The -v option may not be used on systems with floating-point
+     time_t values that are neither float nor double.
+
+     Time discontinuities are found by sampling the results
+     returned by localtime at twelve-hour intervals.  This works
+     in all real-world cases; one can construct artificial time
+     zones for which this fails.
+
+SEE ALSO
+     newctime(3), tzfile(5), zic(8)
diff --git a/commands/zoneinfo/zdump.c b/commands/zoneinfo/zdump.c
new file mode 100644 (file)
index 0000000..8768b49
--- /dev/null
@@ -0,0 +1,686 @@
+static char    elsieid[] = "@(#)zdump.c        7.77";
+
+/*
+** This code has been made independent of the rest of the time
+** conversion package to increase confidence in the verification it provides.
+** You can use this code to help in verifying other implementations.
+*/
+
+#include "stdio.h"     /* for stdout, stderr, perror */
+#include "string.h"    /* for strcpy */
+#include "sys/types.h" /* for time_t */
+#include "time.h"      /* for struct tm */
+#include "stdlib.h"    /* for exit, malloc, atoi */
+#include "float.h"     /* for FLT_MAX and DBL_MAX */
+#include "ctype.h"     /* for isalpha et al. */
+#ifndef isascii
+#define isascii(x) 1
+#endif /* !defined isascii */
+
+#ifndef ZDUMP_LO_YEAR
+#define ZDUMP_LO_YEAR  (-500)
+#endif /* !defined ZDUMP_LO_YEAR */
+
+#ifndef ZDUMP_HI_YEAR
+#define ZDUMP_HI_YEAR  2500
+#endif /* !defined ZDUMP_HI_YEAR */
+
+#ifndef MAX_STRING_LENGTH
+#define MAX_STRING_LENGTH      1024
+#endif /* !defined MAX_STRING_LENGTH */
+
+#ifndef TRUE
+#define TRUE           1
+#endif /* !defined TRUE */
+
+#ifndef FALSE
+#define FALSE          0
+#endif /* !defined FALSE */
+
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS   0
+#endif /* !defined EXIT_SUCCESS */
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE   1
+#endif /* !defined EXIT_FAILURE */
+
+#ifndef SECSPERMIN
+#define SECSPERMIN     60
+#endif /* !defined SECSPERMIN */
+
+#ifndef MINSPERHOUR
+#define MINSPERHOUR    60
+#endif /* !defined MINSPERHOUR */
+
+#ifndef SECSPERHOUR
+#define SECSPERHOUR    (SECSPERMIN * MINSPERHOUR)
+#endif /* !defined SECSPERHOUR */
+
+#ifndef HOURSPERDAY
+#define HOURSPERDAY    24
+#endif /* !defined HOURSPERDAY */
+
+#ifndef EPOCH_YEAR
+#define EPOCH_YEAR     1970
+#endif /* !defined EPOCH_YEAR */
+
+#ifndef TM_YEAR_BASE
+#define TM_YEAR_BASE   1900
+#endif /* !defined TM_YEAR_BASE */
+
+#ifndef DAYSPERNYEAR
+#define DAYSPERNYEAR   365
+#endif /* !defined DAYSPERNYEAR */
+
+#ifndef isleap
+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+#endif /* !defined isleap */
+
+#ifndef isleap_sum
+/*
+** See tzfile.h for details on isleap_sum.
+*/
+#define isleap_sum(a, b)       isleap((a) % 400 + (b) % 400)
+#endif /* !defined isleap_sum */
+
+#define SECSPERDAY     ((long) SECSPERHOUR * HOURSPERDAY)
+#define SECSPERNYEAR   (SECSPERDAY * DAYSPERNYEAR)
+#define SECSPERLYEAR   (SECSPERNYEAR + SECSPERDAY)
+
+#if HAVE_GETTEXT
+#include "locale.h"    /* for setlocale */
+#include "libintl.h"
+#endif /* HAVE_GETTEXT */
+
+#ifndef GNUC_or_lint
+#ifdef lint
+#define GNUC_or_lint
+#else /* !defined lint */
+#ifdef __GNUC__
+#define GNUC_or_lint
+#endif /* defined __GNUC__ */
+#endif /* !defined lint */
+#endif /* !defined GNUC_or_lint */
+
+#ifndef INITIALIZE
+#ifdef GNUC_or_lint
+#define INITIALIZE(x)  ((x) = 0)
+#else /* !defined GNUC_or_lint */
+#define INITIALIZE(x)
+#endif /* !defined GNUC_or_lint */
+#endif /* !defined INITIALIZE */
+
+/*
+** For the benefit of GNU folk...
+** `_(MSGID)' uses the current locale's message library string for MSGID.
+** The default is to use gettext if available, and use MSGID otherwise.
+*/
+
+#ifndef _
+#if HAVE_GETTEXT
+#define _(msgid) gettext(msgid)
+#else /* !HAVE_GETTEXT */
+#define _(msgid) msgid
+#endif /* !HAVE_GETTEXT */
+#endif /* !defined _ */
+
+#ifndef TZ_DOMAIN
+#define TZ_DOMAIN "tz"
+#endif /* !defined TZ_DOMAIN */
+
+#ifndef P
+#if __STDC__
+#define P(x)   x
+#else /* !__STDC__ */
+#define P(x)   ()
+#endif /* !__STDC__ */
+#endif /* !defined P */
+
+extern char ** environ;
+extern int     getopt P((int argc, char * const argv[],
+                       const char * options));
+extern char *  optarg;
+extern int     optind;
+extern char *  tzname[2];
+
+static time_t  absolute_min_time;
+static time_t  absolute_max_time;
+static size_t  longest;
+static char *  progname;
+static int     warned;
+
+static char *  abbr P((struct tm * tmp));
+static void    abbrok P((const char * abbrp, const char * zone));
+static long    delta P((struct tm * newp, struct tm * oldp));
+static void    dumptime P((const struct tm * tmp));
+static time_t  hunt P((char * name, time_t lot, time_t hit));
+static void    setabsolutes P((void));
+static void    show P((char * zone, time_t t, int v));
+static const char *    tformat P((void));
+static time_t  yeartot P((long y));
+
+#ifndef TYPECHECK
+#define my_localtime   localtime
+#else /* !defined TYPECHECK */
+static struct tm *
+my_localtime(tp)
+time_t *       tp;
+{
+       register struct tm *    tmp;
+
+       tmp = localtime(tp);
+       if (tp != NULL && tmp != NULL) {
+               struct tm       tm;
+               register time_t t;
+
+               tm = *tmp;
+               t = mktime(&tm);
+               if (t - *tp >= 1 || *tp - t >= 1) {
+                       (void) fflush(stdout);
+                       (void) fprintf(stderr, "\n%s: ", progname);
+                       (void) fprintf(stderr, tformat(), *tp);
+                       (void) fprintf(stderr, " ->");
+                       (void) fprintf(stderr, " year=%d", tmp->tm_year);
+                       (void) fprintf(stderr, " mon=%d", tmp->tm_mon);
+                       (void) fprintf(stderr, " mday=%d", tmp->tm_mday);
+                       (void) fprintf(stderr, " hour=%d", tmp->tm_hour);
+                       (void) fprintf(stderr, " min=%d", tmp->tm_min);
+                       (void) fprintf(stderr, " sec=%d", tmp->tm_sec);
+                       (void) fprintf(stderr, " isdst=%d", tmp->tm_isdst);
+                       (void) fprintf(stderr, " -> ");
+                       (void) fprintf(stderr, tformat(), t);
+                       (void) fprintf(stderr, "\n");
+               }
+       }
+       return tmp;
+}
+#endif /* !defined TYPECHECK */
+
+static void
+abbrok(abbrp, zone)
+const char * const     abbrp;
+const char * const     zone;
+{
+       register const char *   cp;
+       register char *         wp;
+
+       if (warned)
+               return;
+       cp = abbrp;
+       wp = NULL;
+       while (isascii((unsigned char) *cp) && isalpha((unsigned char) *cp))
+               ++cp;
+       if (cp - abbrp == 0)
+               wp = _("lacks alphabetic at start");
+       else if (cp - abbrp < 3)
+               wp = _("has fewer than 3 alphabetics");
+       else if (cp - abbrp > 6)
+               wp = _("has more than 6 alphabetics");
+       if (wp == NULL && (*cp == '+' || *cp == '-')) {
+               ++cp;
+               if (isascii((unsigned char) *cp) &&
+                       isdigit((unsigned char) *cp))
+                               if (*cp++ == '1' && *cp >= '0' && *cp <= '4')
+                                       ++cp;
+               if (*cp != '\0')
+                       wp = _("differs from POSIX standard");
+       }
+       if (wp == NULL)
+               return;
+       (void) fflush(stdout);
+       (void) fprintf(stderr,
+               _("%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"),
+               progname, zone, abbrp, wp);
+       warned = TRUE;
+}
+
+int
+main(argc, argv)
+int    argc;
+char * argv[];
+{
+       register int            i;
+       register int            c;
+       register int            vflag;
+       register char *         cutarg;
+       register long           cutloyear = ZDUMP_LO_YEAR;
+       register long           cuthiyear = ZDUMP_HI_YEAR;
+       register time_t         cutlotime;
+       register time_t         cuthitime;
+       register char **        fakeenv;
+       time_t                  now;
+       time_t                  t;
+       time_t                  newt;
+       struct tm               tm;
+       struct tm               newtm;
+       register struct tm *    tmp;
+       register struct tm *    newtmp;
+
+       INITIALIZE(cutlotime);
+       INITIALIZE(cuthitime);
+#if HAVE_GETTEXT
+       (void) setlocale(LC_ALL, "");
+#ifdef TZ_DOMAINDIR
+       (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined TEXTDOMAINDIR */
+       (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT */
+       progname = argv[0];
+       for (i = 1; i < argc; ++i)
+               if (strcmp(argv[i], "--version") == 0) {
+                       (void) printf("%s\n", elsieid);
+                       exit(EXIT_SUCCESS);
+               }
+       vflag = 0;
+       cutarg = NULL;
+       while ((c = getopt(argc, argv, "c:v")) == 'c' || c == 'v')
+               if (c == 'v')
+                       vflag = 1;
+               else    cutarg = optarg;
+       if ((c != EOF && c != -1) ||
+               (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) {
+                       (void) fprintf(stderr,
+_("%s: usage is %s [ --version ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"),
+                               progname, progname);
+                       exit(EXIT_FAILURE);
+       }
+       if (vflag) {
+               if (cutarg != NULL) {
+                       long    lo;
+                       long    hi;
+                       char    dummy;
+
+                       if (sscanf(cutarg, "%ld%c", &hi, &dummy) == 1) {
+                               cuthiyear = hi;
+                       } else if (sscanf(cutarg, "%ld,%ld%c",
+                               &lo, &hi, &dummy) == 2) {
+                                       cutloyear = lo;
+                                       cuthiyear = hi;
+                       } else {
+(void) fprintf(stderr, _("%s: wild -c argument %s\n"),
+                                       progname, cutarg);
+                               exit(EXIT_FAILURE);
+                       }
+               }
+               setabsolutes();
+               cutlotime = yeartot(cutloyear);
+               cuthitime = yeartot(cuthiyear);
+       }
+       (void) time(&now);
+       longest = 0;
+       for (i = optind; i < argc; ++i)
+               if (strlen(argv[i]) > longest)
+                       longest = strlen(argv[i]);
+       {
+               register int    from;
+               register int    to;
+
+               for (i = 0; environ[i] != NULL; ++i)
+                       continue;
+               fakeenv = (char **) malloc((size_t) ((i + 2) *
+                       sizeof *fakeenv));
+               if (fakeenv == NULL ||
+                       (fakeenv[0] = (char *) malloc(longest + 4)) == NULL) {
+                                       (void) perror(progname);
+                                       exit(EXIT_FAILURE);
+               }
+               to = 0;
+               (void) strcpy(fakeenv[to++], "TZ=");
+               for (from = 0; environ[from] != NULL; ++from)
+                       if (strncmp(environ[from], "TZ=", 3) != 0)
+                               fakeenv[to++] = environ[from];
+               fakeenv[to] = NULL;
+               environ = fakeenv;
+       }
+       for (i = optind; i < argc; ++i) {
+               static char     buf[MAX_STRING_LENGTH];
+
+               (void) strcpy(&fakeenv[0][3], argv[i]);
+               if (!vflag) {
+                       show(argv[i], now, FALSE);
+                       continue;
+               }
+               warned = FALSE;
+               t = absolute_min_time;
+               show(argv[i], t, TRUE);
+               t += SECSPERHOUR * HOURSPERDAY;
+               show(argv[i], t, TRUE);
+               if (t < cutlotime)
+                       t = cutlotime;
+               tmp = my_localtime(&t);
+               if (tmp != NULL) {
+                       tm = *tmp;
+                       (void) strncpy(buf, abbr(&tm), (sizeof buf) - 1);
+               }
+               for ( ; ; ) {
+                       if (t >= cuthitime)
+                               break;
+                       newt = t + SECSPERHOUR * 12;
+                       if (newt >= cuthitime)
+                               break;
+                       if (newt <= t)
+                               break;
+                       newtmp = localtime(&newt);
+                       if (newtmp != NULL)
+                               newtm = *newtmp;
+                       if ((tmp == NULL || newtmp == NULL) ? (tmp != newtmp) :
+                               (delta(&newtm, &tm) != (newt - t) ||
+                               newtm.tm_isdst != tm.tm_isdst ||
+                               strcmp(abbr(&newtm), buf) != 0)) {
+                                       newt = hunt(argv[i], t, newt);
+                                       newtmp = localtime(&newt);
+                                       if (newtmp != NULL) {
+                                               newtm = *newtmp;
+                                               (void) strncpy(buf,
+                                                       abbr(&newtm),
+                                                       (sizeof buf) - 1);
+                                       }
+                       }
+                       t = newt;
+                       tm = newtm;
+                       tmp = newtmp;
+               }
+               t = absolute_max_time;
+               t -= SECSPERHOUR * HOURSPERDAY;
+               show(argv[i], t, TRUE);
+               t += SECSPERHOUR * HOURSPERDAY;
+               show(argv[i], t, TRUE);
+       }
+       if (fflush(stdout) || ferror(stdout)) {
+               (void) fprintf(stderr, "%s: ", progname);
+               (void) perror(_("Error writing standard output"));
+               exit(EXIT_FAILURE);
+       }
+       exit(EXIT_SUCCESS);
+       /* If exit fails to exit... */
+       return EXIT_FAILURE;
+}
+
+static void
+setabsolutes()
+{
+       if (0.5 == (time_t) 0.5) {
+               /*
+               ** time_t is floating.
+               */
+               if (sizeof (time_t) == sizeof (float)) {
+                       absolute_min_time = (time_t) -FLT_MAX;
+                       absolute_max_time = (time_t) FLT_MAX;
+               } else if (sizeof (time_t) == sizeof (double)) {
+                       absolute_min_time = (time_t) -DBL_MAX;
+                       absolute_max_time = (time_t) DBL_MAX;
+               } else {
+                       (void) fprintf(stderr,
+_("%s: use of -v on system with floating time_t other than float or double\n"),
+                               progname);
+                       exit(EXIT_FAILURE);
+               }
+       } else if (0 > (time_t) -1) {
+               /*
+               ** time_t is signed.  Assume overflow wraps around.
+               */
+               time_t t = 0;
+               time_t t1 = 1;
+
+               while (t < t1) {
+                       t = t1;
+                       t1 = 2 * t1 + 1;
+               }
+                 
+               absolute_max_time = t;
+               t = -t;
+               absolute_min_time = t - 1;
+               if (t < absolute_min_time)
+                       absolute_min_time = t;
+       } else {
+               /*
+               ** time_t is unsigned.
+               */
+               absolute_min_time = 0;
+               absolute_max_time = absolute_min_time - 1;
+       }
+}
+
+static time_t
+yeartot(y)
+const long     y;
+{
+       register long   myy;
+       register long   seconds;
+       register time_t t;
+
+       myy = EPOCH_YEAR;
+       t = 0;
+       while (myy != y) {
+               if (myy < y) {
+                       seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+                       ++myy;
+                       if (t > absolute_max_time - seconds) {
+                               t = absolute_max_time;
+                               break;
+                       }
+                       t += seconds;
+               } else {
+                       --myy;
+                       seconds = isleap(myy) ? SECSPERLYEAR : SECSPERNYEAR;
+                       if (t < absolute_min_time + seconds) {
+                               t = absolute_min_time;
+                               break;
+                       }
+                       t -= seconds;
+               }
+       }
+       return t;
+}
+
+static time_t
+#if __STDC__
+hunt(char *name, time_t lot, time_t hit)
+#else /* !__STDC__ */
+hunt(name, lot, hit)
+char * name;
+time_t lot;
+time_t hit;
+#endif /* !__STDC__ */
+{
+       time_t                  t;
+       long                    diff;
+       struct tm               lotm;
+       register struct tm *    lotmp;
+       struct tm               tm;
+       register struct tm *    tmp;
+       char                    loab[MAX_STRING_LENGTH];
+
+       lotmp = my_localtime(&lot);
+       if (lotmp != NULL) {
+               lotm = *lotmp;
+               (void) strncpy(loab, abbr(&lotm), (sizeof loab) - 1);
+       }
+       for ( ; ; ) {
+               diff = (long) (hit - lot);
+               if (diff < 2)
+                       break;
+               t = lot;
+               t += diff / 2;
+               if (t <= lot)
+                       ++t;
+               else if (t >= hit)
+                       --t;
+               tmp = my_localtime(&t);
+               if (tmp != NULL)
+                       tm = *tmp;
+               if ((lotmp == NULL || tmp == NULL) ? (lotmp == tmp) :
+                       (delta(&tm, &lotm) == (t - lot) &&
+                       tm.tm_isdst == lotm.tm_isdst &&
+                       strcmp(abbr(&tm), loab) == 0)) {
+                               lot = t;
+                               lotm = tm;
+                               lotmp = tmp;
+               } else  hit = t;
+       }
+       show(name, lot, TRUE);
+       show(name, hit, TRUE);
+       return hit;
+}
+
+/*
+** Thanks to Paul Eggert for logic used in delta.
+*/
+
+static long
+delta(newp, oldp)
+struct tm *    newp;
+struct tm *    oldp;
+{
+       register long   result;
+       register int    tmy;
+
+       if (newp->tm_year < oldp->tm_year)
+               return -delta(oldp, newp);
+       result = 0;
+       for (tmy = oldp->tm_year; tmy < newp->tm_year; ++tmy)
+               result += DAYSPERNYEAR + isleap_sum(tmy, TM_YEAR_BASE);
+       result += newp->tm_yday - oldp->tm_yday;
+       result *= HOURSPERDAY;
+       result += newp->tm_hour - oldp->tm_hour;
+       result *= MINSPERHOUR;
+       result += newp->tm_min - oldp->tm_min;
+       result *= SECSPERMIN;
+       result += newp->tm_sec - oldp->tm_sec;
+       return result;
+}
+
+static void
+#if __STDC__
+show(char *zone, time_t t, int v)
+#else /* !__STDC__ */
+show(zone, t, v)
+char * zone;
+time_t t;
+int    v;
+#endif /* !__STDC__ */
+{
+       register struct tm *    tmp;
+
+       (void) printf("%-*s  ", (int) longest, zone);
+       if (v) {
+               tmp = gmtime(&t);
+               if (tmp == NULL) {
+                       (void) printf(tformat(), t);
+               } else {
+                       dumptime(tmp);
+                       (void) printf(" UTC");
+               }
+               (void) printf(" = ");
+       }
+       tmp = my_localtime(&t);
+       dumptime(tmp);
+       if (tmp != NULL) {
+               if (*abbr(tmp) != '\0')
+                       (void) printf(" %s", abbr(tmp));
+               if (v) {
+                       (void) printf(" isdst=%d", tmp->tm_isdst);
+#ifdef TM_GMTOFF
+                       (void) printf(" gmtoff=%ld", tmp->TM_GMTOFF);
+#endif /* defined TM_GMTOFF */
+               }
+       }
+       (void) printf("\n");
+       if (tmp != NULL && *abbr(tmp) != '\0')
+               abbrok(abbr(tmp), zone);
+}
+
+static char *
+abbr(tmp)
+struct tm *    tmp;
+{
+       register char * result;
+       static char     nada;
+
+       if (tmp->tm_isdst != 0 && tmp->tm_isdst != 1)
+               return &nada;
+       result = tzname[tmp->tm_isdst];
+       return (result == NULL) ? &nada : result;
+}
+
+/*
+** The code below can fail on certain theoretical systems;
+** it works on all known real-world systems as of 2004-12-30.
+*/
+
+static const char *
+tformat()
+{
+       if (0.5 == (time_t) 0.5) {      /* floating */
+               if (sizeof (time_t) > sizeof (double))
+                       return "%Lg";
+               return "%g";
+       }
+       if (0 > (time_t) -1) {          /* signed */
+               if (sizeof (time_t) > sizeof (long))
+                       return "%lld";
+               if (sizeof (time_t) > sizeof (int))
+                       return "%ld";
+               return "%d";
+       }
+       if (sizeof (time_t) > sizeof (unsigned long))
+               return "%llu";
+       if (sizeof (time_t) > sizeof (unsigned int))
+               return "%lu";
+       return "%u";
+}
+
+static void
+dumptime(timeptr)
+register const struct tm *     timeptr;
+{
+       static const char       wday_name[][3] = {
+               "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+       };
+       static const char       mon_name[][3] = {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+       };
+       register const char *   wn;
+       register const char *   mn;
+       register int            lead;
+       register int            trail;
+
+       if (timeptr == NULL) {
+               (void) printf("NULL");
+               return;
+       }
+       /*
+       ** The packaged versions of localtime and gmtime never put out-of-range
+       ** values in tm_wday or tm_mon, but since this code might be compiled
+       ** with other (perhaps experimental) versions, paranoia is in order.
+       */
+       if (timeptr->tm_wday < 0 || timeptr->tm_wday >=
+               (int) (sizeof wday_name / sizeof wday_name[0]))
+                       wn = "???";
+       else            wn = wday_name[timeptr->tm_wday];
+       if (timeptr->tm_mon < 0 || timeptr->tm_mon >=
+               (int) (sizeof mon_name / sizeof mon_name[0]))
+                       mn = "???";
+       else            mn = mon_name[timeptr->tm_mon];
+       (void) printf("%.3s %.3s%3d %.2d:%.2d:%.2d ",
+               wn, mn,
+               timeptr->tm_mday, timeptr->tm_hour,
+               timeptr->tm_min, timeptr->tm_sec);
+#define DIVISOR        10
+       trail = timeptr->tm_year % DIVISOR + TM_YEAR_BASE % DIVISOR;
+       lead = timeptr->tm_year / DIVISOR + TM_YEAR_BASE / DIVISOR +
+               trail / DIVISOR;
+       trail %= DIVISOR;
+       if (trail < 0 && lead > 0) {
+               trail += DIVISOR;
+               --lead;
+       } else if (lead < 0 && trail > 0) {
+               trail -= DIVISOR;
+               ++lead;
+       }
+       if (lead == 0)
+               (void) printf("%d", trail);
+       else    (void) printf("%d%d", lead, ((trail < 0) ? -trail : trail));
+}
diff --git a/commands/zoneinfo/zic.8 b/commands/zoneinfo/zic.8
new file mode 100644 (file)
index 0000000..a99da49
--- /dev/null
@@ -0,0 +1,436 @@
+.TH ZIC 8
+.SH NAME
+zic \- time zone compiler
+.SH SYNOPSIS
+.B zic
+[
+.B \-\-version
+]
+[
+.B \-v
+] [
+.B \-d
+.I directory
+] [
+.B \-l
+.I localtime
+] [
+.B \-p
+.I posixrules
+] [
+.B \-L
+.I leapsecondfilename
+] [
+.B \-s
+] [
+.B \-y
+.I command
+] [
+.I filename
+\&... ]
+.SH DESCRIPTION
+.if t .ds lq ``
+.if t .ds rq ''
+.if n .ds lq \&"\"
+.if n .ds rq \&"\"
+.de q
+\\$3\*(lq\\$1\*(rq\\$2
+..
+.I Zic
+reads text from the file(s) named on the command line
+and creates the time conversion information files specified in this input.
+If a
+.I filename
+is
+.BR \- ,
+the standard input is read.
+.PP
+These options are available:
+.TP
+.BI "\-\-version"
+Output version information and exit.
+.TP
+.BI "\-d " directory
+Create time conversion information files in the named directory rather than
+in the standard directory named below.
+.TP
+.BI "\-l " timezone
+Use the given time zone as local time.
+.I Zic
+will act as if the input contained a link line of the form
+.sp
+.ti +.5i
+Link   \fItimezone\fP          localtime
+.TP
+.BI "\-p " timezone
+Use the given time zone's rules when handling POSIX-format
+time zone environment variables.
+.I Zic
+will act as if the input contained a link line of the form
+.sp
+.ti +.5i
+Link   \fItimezone\fP          posixrules
+.TP
+.BI "\-L " leapsecondfilename
+Read leap second information from the file with the given name.
+If this option is not used,
+no leap second information appears in output files.
+.TP
+.B \-v
+Complain if a year that appears in a data file is outside the range
+of years representable by
+.IR time (2)
+values.
+Also complain if a time of 24:00
+(which cannot be handled by pre-1998 versions of
+.IR zic )
+appears in the input.
+.TP
+.B \-s
+Limit time values stored in output files to values that are the same
+whether they're taken to be signed or unsigned.
+You can use this option to generate SVVS-compatible files.
+.TP
+.BI "\-y " command
+Use the given
+.I command
+rather than
+.B yearistype
+when checking year types (see below).
+.PP
+Input lines are made up of fields.
+Fields are separated from one another by any number of white space characters.
+Leading and trailing white space on input lines is ignored.
+An unquoted sharp character (#) in the input introduces a comment which extends
+to the end of the line the sharp character appears on.
+White space characters and sharp characters may be enclosed in double quotes
+(") if they're to be used as part of a field.
+Any line that is blank (after comment stripping) is ignored.
+Non-blank lines are expected to be of one of three types:
+rule lines, zone lines, and link lines.
+.PP
+A rule line has the form
+.nf
+.ti +.5i
+.ta \w'Rule\0\0'u +\w'NAME\0\0'u +\w'FROM\0\0'u +\w'1973\0\0'u +\w'TYPE\0\0'u +\w'Apr\0\0'u +\w'lastSun\0\0'u +\w'2:00\0\0'u +\w'SAVE\0\0'u
+.sp
+Rule   NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+.sp
+For example:
+.ti +.5i
+.sp
+Rule   US      1967    1973    \-      Apr     lastSun 2:00    1:00    D
+.sp
+.fi
+The fields that make up a rule line are:
+.TP "\w'LETTER/S'u"
+.B NAME
+Gives the (arbitrary) name of the set of rules this rule is part of.
+.TP
+.B FROM
+Gives the first year in which the rule applies.
+Any integer year can be supplied; the Gregorian calendar is assumed.
+The word
+.B minimum
+(or an abbreviation) means the minimum year representable as an integer.
+The word
+.B maximum
+(or an abbreviation) means the maximum year representable as an integer.
+Rules can describe times that are not representable as time values,
+with the unrepresentable times ignored; this allows rules to be portable
+among hosts with differing time value types.
+.TP
+.B TO
+Gives the final year in which the rule applies.
+In addition to
+.B minimum
+and
+.B maximum
+(as above),
+the word
+.B only
+(or an abbreviation)
+may be used to repeat the value of the
+.B FROM
+field.
+.TP
+.B TYPE
+Gives the type of year in which the rule applies.
+If
+.B TYPE
+is
+.B \-
+then the rule applies in all years between
+.B FROM
+and
+.B TO
+inclusive.
+If
+.B TYPE
+is something else, then
+.I zic
+executes the command
+.ti +.5i
+\fByearistype\fP \fIyear\fP \fItype\fP
+.br
+to check the type of a year:
+an exit status of zero is taken to mean that the year is of the given type;
+an exit status of one is taken to mean that the year is not of the given type.
+.TP
+.B IN
+Names the month in which the rule takes effect.
+Month names may be abbreviated.
+.TP
+.B ON
+Gives the day on which the rule takes effect.
+Recognized forms include:
+.nf
+.in +.5i
+.sp
+.ta \w'Sun<=25\0\0'u
+5      the fifth of the month
+lastSun        the last Sunday in the month
+lastMon        the last Monday in the month
+Sun>=8 first Sunday on or after the eighth
+Sun<=25        last Sunday on or before the 25th
+.fi
+.in -.5i
+.sp
+Names of days of the week may be abbreviated or spelled out in full.
+Note that there must be no spaces within the
+.B ON
+field.
+.TP
+.B AT
+Gives the time of day at which the rule takes effect.
+Recognized forms include:
+.nf
+.in +.5i
+.sp
+.ta \w'1:28:13\0\0'u
+2      time in hours
+2:00   time in hours and minutes
+15:00  24-hour format time (for times after noon)
+1:28:14        time in hours, minutes, and seconds
+\-     equivalent to 0
+.fi
+.in -.5i
+.sp
+where hour 0 is midnight at the start of the day,
+and hour 24 is midnight at the end of the day.
+Any of these forms may be followed by the letter
+.B w
+if the given time is local
+.q "wall clock"
+time,
+.B s
+if the given time is local
+.q standard
+time, or
+.B u
+(or
+.B g
+or
+.BR z )
+if the given time is universal time;
+in the absence of an indicator,
+wall clock time is assumed.
+.TP
+.B SAVE
+Gives the amount of time to be added to local standard time when the rule is in
+effect.
+This field has the same format as the
+.B AT
+field
+(although, of course, the
+.B w
+and
+.B s
+suffixes are not used).
+.TP
+.B LETTER/S
+Gives the
+.q "variable part"
+(for example, the
+.q S
+or
+.q D
+in
+.q EST
+or
+.q EDT )
+of time zone abbreviations to be used when this rule is in effect.
+If this field is
+.BR \- ,
+the variable part is null.
+.PP
+A zone line has the form
+.sp
+.nf
+.ti +.5i
+.ta \w'Zone\0\0'u +\w'Australia/Adelaide\0\0'u +\w'GMTOFF\0\0'u +\w'RULES/SAVE\0\0'u +\w'FORMAT\0\0'u
+Zone   NAME    GMTOFF  RULES/SAVE      FORMAT  [UNTIL]
+.sp
+For example:
+.sp
+.ti +.5i
+Zone   Australia/Adelaide      9:30    Aus     CST     1971 Oct 31 2:00
+.sp
+.fi
+The fields that make up a zone line are:
+.TP "\w'GMTOFF'u"
+.B NAME
+The name of the time zone.
+This is the name used in creating the time conversion information file for the
+zone.
+.TP
+.B GMTOFF
+The amount of time to add to UTC to get standard time in this zone.
+This field has the same format as the
+.B AT
+and
+.B SAVE
+fields of rule lines;
+begin the field with a minus sign if time must be subtracted from UTC.
+.TP
+.B RULES/SAVE
+The name of the rule(s) that apply in the time zone or,
+alternately, an amount of time to add to local standard time.
+If this field is
+.B \-
+then standard time always applies in the time zone.
+.TP
+.B FORMAT
+The format for time zone abbreviations in this time zone.
+The pair of characters
+.B %s
+is used to show where the
+.q "variable part"
+of the time zone abbreviation goes.
+Alternately,
+a slash (/)
+separates standard and daylight abbreviations.
+.TP
+.B UNTIL
+The time at which the UTC offset or the rule(s) change for a location.
+It is specified as a year, a month, a day, and a time of day.
+If this is specified,
+the time zone information is generated from the given UTC offset
+and rule change until the time specified.
+The month, day, and time of day have the same format as the IN, ON, and AT
+columns of a rule; trailing columns can be omitted, and default to the
+earliest possible value for the missing columns.
+.IP
+The next line must be a
+.q continuation
+line; this has the same form as a zone line except that the
+string
+.q Zone
+and the name are omitted, as the continuation line will
+place information starting at the time specified as the
+.B UNTIL
+field in the previous line in the file used by the previous line.
+Continuation lines may contain an
+.B UNTIL
+field, just as zone lines do, indicating that the next line is a further
+continuation.
+.PP
+A link line has the form
+.sp
+.nf
+.ti +.5i
+.ta \w'Link\0\0'u +\w'Europe/Istanbul\0\0'u
+Link   LINK-FROM       LINK-TO
+.sp
+For example:
+.sp
+.ti +.5i
+Link   Europe/Istanbul Asia/Istanbul
+.sp
+.fi
+The
+.B LINK-FROM
+field should appear as the
+.B NAME
+field in some zone line;
+the
+.B LINK-TO
+field is used as an alternate name for that zone.
+.PP
+Except for continuation lines,
+lines may appear in any order in the input.
+.PP
+Lines in the file that describes leap seconds have the following form:
+.nf
+.ti +.5i
+.ta \w'Leap\0\0'u +\w'YEAR\0\0'u +\w'MONTH\0\0'u +\w'DAY\0\0'u +\w'HH:MM:SS\0\0'u +\w'CORR\0\0'u
+.sp
+Leap   YEAR    MONTH   DAY     HH:MM:SS        CORR    R/S
+.sp
+For example:
+.ti +.5i
+.sp
+Leap   1974    Dec     31      23:59:60        +       S
+.sp
+.fi
+The
+.BR YEAR ,
+.BR MONTH ,
+.BR DAY ,
+and
+.B HH:MM:SS
+fields tell when the leap second happened.
+The
+.B CORR
+field
+should be
+.q +
+if a second was added
+or
+.q -
+if a second was skipped.
+.\" There's no need to document the following, since it's impossible for more
+.\" than one leap second to be inserted or deleted at a time.
+.\" The C Standard is in error in suggesting the possibility.
+.\" See Terry J Quinn, The BIPM and the accurate measure of time,
+.\" Proc IEEE 79, 7 (July 1991), 894-905.
+.\"    or
+.\"    .q ++
+.\"    if two seconds were added
+.\"    or
+.\"    .q --
+.\"    if two seconds were skipped.
+The
+.B R/S
+field
+should be (an abbreviation of)
+.q Stationary
+if the leap second time given by the other fields should be interpreted as UTC
+or
+(an abbreviation of)
+.q Rolling
+if the leap second time given by the other fields should be interpreted as
+local wall clock time.
+.SH NOTES
+For areas with more than two types of local time,
+you may need to use local standard time in the
+.B AT
+field of the earliest transition time's rule to ensure that
+the earliest transition time recorded in the compiled file is correct.
+.PP
+If,
+for a particular zone,
+a clock advance caused by the start of daylight saving
+coincides with and is equal to
+a clock retreat caused by a change in UTC offset,
+.IR zic
+produces a single transition to daylight saving at the new UTC offset 
+(without any change in wall clock time).
+To get separate transitions
+use multiple zone continuation lines
+specifying transition instants using universal time.
+.SH FILE
+/usr/local/etc/zoneinfo        standard directory used for created files
+.SH "SEE ALSO"
+newctime(3), tzfile(5), zdump(8)
+.\" @(#)zic.8  7.24
diff --git a/commands/zoneinfo/zic.8.txt b/commands/zoneinfo/zic.8.txt
new file mode 100644 (file)
index 0000000..45c4d30
--- /dev/null
@@ -0,0 +1,259 @@
+NAME
+
+     zic - time zone compiler
+
+SYNOPSIS
+     zic [ --version ] [ -v ] [ -d directory ] [ -l localtime ] [
+     -p posixrules ] [ -L leapsecondfilename ] [ -s ] [ -y
+     command ] [ filename ... ]
+
+DESCRIPTION
+     Zic reads text from the file(s) named on the command line
+     and creates the time conversion information files specified
+     in this input.  If a filename is -, the standard input is
+     read.
+
+     These options are available:
+
+     --version
+          Output version information and exit.
+
+     -d directory
+          Create time conversion information files in the named
+          directory rather than in the standard directory named
+          below.
+
+     -l timezone
+          Use the given time zone as local time.  Zic will act as
+          if the input contained a link line of the form
+
+               Link timezone       localtime
+
+     -p timezone
+          Use the given time zone's rules when handling POSIX-
+          format time zone environment variables.  Zic will act
+          as if the input contained a link line of the form
+
+               Link timezone       posixrules
+
+     -L leapsecondfilename
+          Read leap second information from the file with the
+          given name.  If this option is not used, no leap second
+          information appears in output files.
+
+     -v   Complain if a year that appears in a data file is
+          outside the range of years representable by time(2)
+          values.  Also complain if a time of 24:00 (which cannot
+          be handled by pre-1998 versions of zic) appears in the
+          input.
+
+     -s   Limit time values stored in output files to values that
+          are the same whether they're taken to be signed or
+          unsigned.  You can use this option to generate SVVS-
+          compatible files.
+
+     -y command
+          Use the given command rather than yearistype when
+          checking year types (see below).
+
+     Input lines are made up of fields.  Fields are separated
+     from one another by any number of white space characters.
+     Leading and trailing white space on input lines is ignored.
+     An unquoted sharp character (#) in the input introduces a
+     comment which extends to the end of the line the sharp
+     character appears on.  White space characters and sharp
+     characters may be enclosed in double quotes (") if they're
+     to be used as part of a field.  Any line that is blank
+     (after comment stripping) is ignored.  Non-blank lines are
+     expected to be of one of three types:  rule lines, zone
+     lines, and link lines.
+
+     A rule line has the form
+
+          Rule  NAME  FROM  TO    TYPE  IN   ON       AT    SAVE  LETTER/S
+
+     For example:
+
+          Rule  US    1967  1973  -     Apr  lastSun  2:00  1:00  D
+
+     The fields that make up a rule line are:
+
+     NAME    Gives the (arbitrary) name of the set of rules this
+             rule is part of.
+
+     FROM    Gives the first year in which the rule applies.  Any
+             integer year can be supplied; the Gregorian calendar
+             is assumed.  The word minimum (or an abbreviation)
+             means the minimum year representable as an integer.
+             The word maximum (or an abbreviation) means the
+             maximum year representable as an integer.  Rules can
+             describe times that are not representable as time
+             values, with the unrepresentable times ignored; this
+             allows rules to be portable among hosts with
+             differing time value types.
+
+     TO      Gives the final year in which the rule applies.  In
+             addition to minimum and maximum (as above), the word
+             only (or an abbreviation) may be used to repeat the
+             value of the FROM field.
+
+     TYPE    Gives the type of year in which the rule applies.
+             If TYPE is - then the rule applies in all years
+             between FROM and TO inclusive.  If TYPE is something
+             else, then zic executes the command
+                  yearistype year type
+             to check the type of a year:  an exit status of zero
+             is taken to mean that the year is of the given type;
+             an exit status of one is taken to mean that the year
+             is not of the given type.
+
+     IN      Names the month in which the rule takes effect.
+             Month names may be abbreviated.
+
+     ON      Gives the day on which the rule takes effect.
+             Recognized forms include:
+
+                  5        the fifth of the month
+                  lastSun  the last Sunday in the month
+                  lastMon  the last Monday in the month
+                  Sun>=8   first Sunday on or after the eighth
+                  Sun<=25  last Sunday on or before the 25th
+
+             Names of days of the week may be abbreviated or
+             spelled out in full.  Note that there must be no
+             spaces within the ON field.
+
+     AT      Gives the time of day at which the rule takes
+             effect.  Recognized forms include:
+
+                  2        time in hours
+                  2:00     time in hours and minutes
+                  15:00    24-hour format time (for times after noon)
+                  1:28:14  time in hours, minutes, and seconds
+                  -        equivalent to 0
+
+             where hour 0 is midnight at the start of the day,
+             and hour 24 is midnight at the end of the day.  Any
+             of these forms may be followed by the letter w if
+             the given time is local "wall clock" time, s if the
+             given time is local "standard" time, or u (or g or
+             z) if the given time is universal time; in the
+             absence of an indicator, wall clock time is assumed.
+
+     SAVE    Gives the amount of time to be added to local
+             standard time when the rule is in effect.  This
+             field has the same format as the AT field (although,
+             of course, the w and s suffixes are not used).
+
+     LETTER/S
+             Gives the "variable part" (for example, the "S" or
+             "D" in "EST" or "EDT") of time zone abbreviations to
+             be used when this rule is in effect.  If this field
+             is -, the variable part is null.
+
+     A zone line has the form
+
+          Zone  NAME                GMTOFF  RULES/SAVE  FORMAT  [UNTIL]
+
+     For example:
+
+          Zone  Australia/Adelaide  9:30    Aus         CST     1971 Oct 31 2:00
+
+     The fields that make up a zone line are:
+
+     NAME  The name of the time zone.  This is the name used in
+           creating the time conversion information file for the
+           zone.
+
+     GMTOFF
+           The amount of time to add to UTC to get standard time
+           in this zone.  This field has the same format as the
+           AT and SAVE fields of rule lines; begin the field with
+           a minus sign if time must be subtracted from UTC.
+
+     RULES/SAVE
+           The name of the rule(s) that apply in the time zone
+           or, alternately, an amount of time to add to local
+           standard time.  If this field is - then standard time
+           always applies in the time zone.
+
+     FORMAT
+           The format for time zone abbreviations in this time
+           zone.  The pair of characters %s is used to show where
+           the "variable part" of the time zone abbreviation
+           goes.  Alternately, a slash (/) separates standard and
+           daylight abbreviations.
+
+     UNTIL The time at which the UTC offset or the rule(s) change
+           for a location.  It is specified as a year, a month, a
+           day, and a time of day.  If this is specified, the
+           time zone information is generated from the given UTC
+           offset and rule change until the time specified.  The
+           month, day, and time of day have the same format as
+           the IN, ON, and AT columns of a rule; trailing columns
+           can be omitted, and default to the earliest possible
+           value for the missing columns.
+
+           The next line must be a "continuation" line; this has
+           the same form as a zone line except that the string
+           "Zone" and the name are omitted, as the continuation
+           line will place information starting at the time
+           specified as the UNTIL field in the previous line in
+           the file used by the previous line.  Continuation
+           lines may contain an UNTIL field, just as zone lines
+           do, indicating that the next line is a further
+           continuation.
+
+     A link line has the form
+
+          Link  LINK-FROM        LINK-TO
+
+     For example:
+
+          Link  Europe/Istanbul  Asia/Istanbul
+
+     The LINK-FROM field should appear as the NAME field in some
+     zone line; the LINK-TO field is used as an alternate name
+     for that zone.
+
+     Except for continuation lines, lines may appear in any order
+     in the input.
+
+     Lines in the file that describes leap seconds have the
+     following form:
+
+          Leap  YEAR  MONTH  DAY  HH:MM:SS  CORR  R/S
+
+     For example:
+
+          Leap  1974  Dec    31   23:59:60  +     S
+
+     The YEAR, MONTH, DAY, and HH:MM:SS fields tell when the leap
+     second happened.  The CORR field should be "+" if a second
+     was added or "-" if a second was skipped.  The R/S field
+     should be (an abbreviation of) "Stationary" if the leap
+     second time given by the other fields should be interpreted
+     as UTC or (an abbreviation of) "Rolling" if the leap second
+     time given by the other fields should be interpreted as
+     local wall clock time.
+
+NOTES
+     For areas with more than two types of local time, you may
+     need to use local standard time in the AT field of the
+     earliest transition time's rule to ensure that the earliest
+     transition time recorded in the compiled file is correct.
+
+     If, for a particular zone, a clock advance caused by the
+     start of daylight saving coincides with and is equal to a
+     clock retreat caused by a change in UTC offset, zic produces
+     a single transition to daylight saving at the new UTC offset
+     (without any change in wall clock time).  To get separate
+     transitions use multiple zone continuation lines specifying
+     transition instants using universal time.
+
+FILE
+     /usr/local/etc/zoneinfo standard directory used for created
+     files
+
+SEE ALSO
+     newctime(3), tzfile(5), zdump(8)
diff --git a/commands/zoneinfo/zic.c b/commands/zoneinfo/zic.c
new file mode 100644 (file)
index 0000000..128bf10
--- /dev/null
@@ -0,0 +1,2316 @@
+static char    elsieid[] = "@(#)zic.c  7.128";
+
+/*
+** Regardless of the type of time_t, we do our work using this type.
+*/
+
+typedef int    zic_t;
+
+#include "private.h"
+#include "locale.h"
+#include "tzfile.h"
+
+#ifndef ZIC_MAX_ABBR_LEN_WO_WARN
+#define ZIC_MAX_ABBR_LEN_WO_WARN       6
+#endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
+
+#if HAVE_SYS_STAT_H
+#include "sys/stat.h"
+#endif
+#ifdef S_IRUSR
+#define MKDIR_UMASK (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
+#else
+#define MKDIR_UMASK 0755
+#endif
+
+/*
+** On some ancient hosts, predicates like `isspace(C)' are defined
+** only if isascii(C) || C == EOF. Modern hosts obey the C Standard,
+** which says they are defined only if C == ((unsigned char) C) || C == EOF.
+** Neither the C Standard nor Posix require that `isascii' exist.
+** For portability, we check both ancient and modern requirements.
+** If isascii is not defined, the isascii check succeeds trivially.
+*/
+#include "ctype.h"
+#ifndef isascii
+#define isascii(x) 1
+#endif
+
+struct rule {
+       const char *    r_filename;
+       int             r_linenum;
+       const char *    r_name;
+
+       int             r_loyear;       /* for example, 1986 */
+       int             r_hiyear;       /* for example, 1986 */
+       const char *    r_yrtype;
+
+       int             r_month;        /* 0..11 */
+
+       int             r_dycode;       /* see below */
+       int             r_dayofmonth;
+       int             r_wday;
+
+       long            r_tod;          /* time from midnight */
+       int             r_todisstd;     /* above is standard time if TRUE */
+                                       /* or wall clock time if FALSE */
+       int             r_todisgmt;     /* above is GMT if TRUE */
+                                       /* or local time if FALSE */
+       long            r_stdoff;       /* offset from standard time */
+       const char *    r_abbrvar;      /* variable part of abbreviation */
+
+       int             r_todo;         /* a rule to do (used in outzone) */
+       zic_t           r_temp;         /* used in outzone */
+};
+
+/*
+**     r_dycode                r_dayofmonth    r_wday
+*/
+
+#define DC_DOM         0       /* 1..31 */     /* unused */
+#define DC_DOWGEQ      1       /* 1..31 */     /* 0..6 (Sun..Sat) */
+#define DC_DOWLEQ      2       /* 1..31 */     /* 0..6 (Sun..Sat) */
+
+struct zone {
+       const char *    z_filename;
+       int             z_linenum;
+
+       const char *    z_name;
+       long            z_gmtoff;
+       const char *    z_rule;
+       const char *    z_format;
+
+       long            z_stdoff;
+
+       struct rule *   z_rules;
+       int             z_nrules;
+
+       struct rule     z_untilrule;
+       zic_t           z_untiltime;
+};
+
+extern int     getopt P((int argc, char * const argv[],
+                       const char * options));
+extern int     link P((const char * fromname, const char * toname));
+extern char *  optarg;
+extern int     optind;
+
+static void    addtt P((zic_t starttime, int type));
+static int     addtype P((long gmtoff, const char * abbr, int isdst,
+                               int ttisstd, int ttisgmt));
+static void    leapadd P((zic_t t, int positive, int rolling, int count));
+static void    adjleap P((void));
+static void    associate P((void));
+static int     ciequal P((const char * ap, const char * bp));
+static void    convert P((long val, char * buf));
+static void    dolink P((const char * fromfile, const char * tofile));
+static void    doabbr P((char * abbr, const char * format,
+                       const char * letters, int isdst));
+static void    eat P((const char * name, int num));
+static void    eats P((const char * name, int num,
+                       const char * rname, int rnum));
+static long    eitol P((int i));
+static void    error P((const char * message));
+static char ** getfields P((char * buf));
+static long    gethms P((const char * string, const char * errstrng,
+                       int signable));
+static void    infile P((const char * filename));
+static void    inleap P((char ** fields, int nfields));
+static void    inlink P((char ** fields, int nfields));
+static void    inrule P((char ** fields, int nfields));
+static int     inzcont P((char ** fields, int nfields));
+static int     inzone P((char ** fields, int nfields));
+static int     inzsub P((char ** fields, int nfields, int iscont));
+static int     itsabbr P((const char * abbr, const char * word));
+static int     itsdir P((const char * name));
+static int     lowerit P((int c));
+static char *  memcheck P((char * tocheck));
+static int     mkdirs P((char * filename));
+static void    newabbr P((const char * abbr));
+static long    oadd P((long t1, long t2));
+static void    outzone P((const struct zone * zp, int ntzones));
+static void    puttzcode P((long code, FILE * fp));
+static int     rcomp P((const void * leftp, const void * rightp));
+static zic_t   rpytime P((const struct rule * rp, int wantedy));
+static void    rulesub P((struct rule * rp,
+                       const char * loyearp, const char * hiyearp,
+                       const char * typep, const char * monthp,
+                       const char * dayp, const char * timep));
+static void    setboundaries P((void));
+static zic_t   tadd P((zic_t t1, long t2));
+static void    usage P((void));
+static void    writezone P((const char * name));
+static int     yearistype P((int year, const char * type));
+
+#if !HAVE_STRERROR
+static char *  strerror P((int));
+#endif /* !HAVE_STRERROR */
+
+static int             charcnt;
+static int             errors;
+static const char *    filename;
+static int             leapcnt;
+static int             linenum;
+static zic_t           max_time;
+static int             max_year;
+static int             max_year_representable;
+static zic_t           min_time;
+static int             min_year;
+static int             min_year_representable;
+static int             noise;
+static const char *    rfilename;
+static int             rlinenum;
+static const char *    progname;
+static int             timecnt;
+static int             typecnt;
+
+/*
+** Line codes.
+*/
+
+#define LC_RULE                0
+#define LC_ZONE                1
+#define LC_LINK                2
+#define LC_LEAP                3
+
+/*
+** Which fields are which on a Zone line.
+*/
+
+#define ZF_NAME                1
+#define ZF_GMTOFF      2
+#define ZF_RULE                3
+#define ZF_FORMAT      4
+#define ZF_TILYEAR     5
+#define ZF_TILMONTH    6
+#define ZF_TILDAY      7
+#define ZF_TILTIME     8
+#define ZONE_MINFIELDS 5
+#define ZONE_MAXFIELDS 9
+
+/*
+** Which fields are which on a Zone continuation line.
+*/
+
+#define ZFC_GMTOFF     0
+#define ZFC_RULE       1
+#define ZFC_FORMAT     2
+#define ZFC_TILYEAR    3
+#define ZFC_TILMONTH   4
+#define ZFC_TILDAY     5
+#define ZFC_TILTIME    6
+#define ZONEC_MINFIELDS        3
+#define ZONEC_MAXFIELDS        7
+
+/*
+** Which files are which on a Rule line.
+*/
+
+#define RF_NAME                1
+#define RF_LOYEAR      2
+#define RF_HIYEAR      3
+#define RF_COMMAND     4
+#define RF_MONTH       5
+#define RF_DAY         6
+#define RF_TOD         7
+#define RF_STDOFF      8
+#define RF_ABBRVAR     9
+#define RULE_FIELDS    10
+
+/*
+** Which fields are which on a Link line.
+*/
+
+#define LF_FROM                1
+#define LF_TO          2
+#define LINK_FIELDS    3
+
+/*
+** Which fields are which on a Leap line.
+*/
+
+#define LP_YEAR                1
+#define LP_MONTH       2
+#define LP_DAY         3
+#define LP_TIME                4
+#define LP_CORR                5
+#define LP_ROLL                6
+#define LEAP_FIELDS    7
+
+/*
+** Year synonyms.
+*/
+
+#define YR_MINIMUM     0
+#define YR_MAXIMUM     1
+#define YR_ONLY                2
+
+static struct rule *   rules;
+static int             nrules; /* number of rules */
+
+static struct zone *   zones;
+static int             nzones; /* number of zones */
+
+struct link {
+       const char *    l_filename;
+       int             l_linenum;
+       const char *    l_from;
+       const char *    l_to;
+};
+
+static struct link *   links;
+static int             nlinks;
+
+struct lookup {
+       const char *    l_word;
+       const int       l_value;
+};
+
+static struct lookup const *   byword P((const char * string,
+                                       const struct lookup * lp));
+
+static struct lookup const     line_codes[] = {
+       { "Rule",       LC_RULE },
+       { "Zone",       LC_ZONE },
+       { "Link",       LC_LINK },
+       { "Leap",       LC_LEAP },
+       { NULL,         0}
+};
+
+static struct lookup const     mon_names[] = {
+       { "January",    TM_JANUARY },
+       { "February",   TM_FEBRUARY },
+       { "March",      TM_MARCH },
+       { "April",      TM_APRIL },
+       { "May",        TM_MAY },
+       { "June",       TM_JUNE },
+       { "July",       TM_JULY },
+       { "August",     TM_AUGUST },
+       { "September",  TM_SEPTEMBER },
+       { "October",    TM_OCTOBER },
+       { "November",   TM_NOVEMBER },
+       { "December",   TM_DECEMBER },
+       { NULL,         0 }
+};
+
+static struct lookup const     wday_names[] = {
+       { "Sunday",     TM_SUNDAY },
+       { "Monday",     TM_MONDAY },
+       { "Tuesday",    TM_TUESDAY },
+       { "Wednesday",  TM_WEDNESDAY },
+       { "Thursday",   TM_THURSDAY },
+       { "Friday",     TM_FRIDAY },
+       { "Saturday",   TM_SATURDAY },
+       { NULL,         0 }
+};
+
+static struct lookup const     lasts[] = {
+       { "last-Sunday",        TM_SUNDAY },
+       { "last-Monday",        TM_MONDAY },
+       { "last-Tuesday",       TM_TUESDAY },
+       { "last-Wednesday",     TM_WEDNESDAY },
+       { "last-Thursday",      TM_THURSDAY },
+       { "last-Friday",        TM_FRIDAY },
+       { "last-Saturday",      TM_SATURDAY },
+       { NULL,                 0 }
+};
+
+static struct lookup const     begin_years[] = {
+       { "minimum",    YR_MINIMUM },
+       { "maximum",    YR_MAXIMUM },
+       { NULL,         0 }
+};
+
+static struct lookup const     end_years[] = {
+       { "minimum",    YR_MINIMUM },
+       { "maximum",    YR_MAXIMUM },
+       { "only",       YR_ONLY },
+       { NULL,         0 }
+};
+
+static struct lookup const     leap_types[] = {
+       { "Rolling",    TRUE },
+       { "Stationary", FALSE },
+       { NULL,         0 }
+};
+
+static const int       len_months[2][MONSPERYEAR] = {
+       { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
+       { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
+};
+
+static const int       len_years[2] = {
+       DAYSPERNYEAR, DAYSPERLYEAR
+};
+
+static struct attype {
+       zic_t           at;
+       unsigned char   type;
+}                      attypes[TZ_MAX_TIMES];
+static long            gmtoffs[TZ_MAX_TYPES];
+static char            isdsts[TZ_MAX_TYPES];
+static unsigned char   abbrinds[TZ_MAX_TYPES];
+static char            ttisstds[TZ_MAX_TYPES];
+static char            ttisgmts[TZ_MAX_TYPES];
+static char            chars[TZ_MAX_CHARS];
+static zic_t           trans[TZ_MAX_LEAPS];
+static long            corr[TZ_MAX_LEAPS];
+static char            roll[TZ_MAX_LEAPS];
+
+/*
+** Memory allocation.
+*/
+
+static char *
+memcheck(ptr)
+char * const   ptr;
+{
+       if (ptr == NULL) {
+               const char *e = strerror(errno);
+
+               (void) fprintf(stderr, _("%s: Memory exhausted: %s\n"),
+                       progname, e);
+               exit(EXIT_FAILURE);
+       }
+       return ptr;
+}
+
+#define emalloc(size)          memcheck(imalloc(size))
+#define erealloc(ptr, size)    memcheck(irealloc((ptr), (size)))
+#define ecpyalloc(ptr)         memcheck(icpyalloc(ptr))
+#define ecatalloc(oldp, newp)  memcheck(icatalloc((oldp), (newp)))
+
+/*
+** Error handling.
+*/
+
+#if !HAVE_STRERROR
+static char *
+strerror(errnum)
+int    errnum;
+{
+       extern char *   sys_errlist[];
+       extern int      sys_nerr;
+
+       return (errnum > 0 && errnum <= sys_nerr) ?
+               sys_errlist[errnum] : _("Unknown system error");
+}
+#endif /* !HAVE_STRERROR */
+
+static void
+eats(name, num, rname, rnum)
+const char * const     name;
+const int              num;
+const char * const     rname;
+const int              rnum;
+{
+       filename = name;
+       linenum = num;
+       rfilename = rname;
+       rlinenum = rnum;
+}
+
+static void
+eat(name, num)
+const char * const     name;
+const int              num;
+{
+       eats(name, num, (char *) NULL, -1);
+}
+
+static void
+error(string)
+const char * const     string;
+{
+       /*
+       ** Match the format of "cc" to allow sh users to
+       **      zic ... 2>&1 | error -t "*" -v
+       ** on BSD systems.
+       */
+       (void) fprintf(stderr, _("\"%s\", line %d: %s"),
+               filename, linenum, string);
+       if (rfilename != NULL)
+               (void) fprintf(stderr, _(" (rule from \"%s\", line %d)"),
+                       rfilename, rlinenum);
+       (void) fprintf(stderr, "\n");
+       ++errors;
+}
+
+static void
+warning(string)
+const char * const     string;
+{
+       char *  cp;
+
+       cp = ecpyalloc(_("warning: "));
+       cp = ecatalloc(cp, string);
+       error(cp);
+       ifree(cp);
+       --errors;
+}
+
+static void
+usage P((void))
+{
+       (void) fprintf(stderr, _("%s: usage is %s \
+[ --version ] [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n\
+\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"),
+               progname, progname);
+       exit(EXIT_FAILURE);
+}
+
+static const char *    psxrules;
+static const char *    lcltime;
+static const char *    directory;
+static const char *    leapsec;
+static const char *    yitcommand;
+static int             sflag = FALSE;
+
+int
+main(argc, argv)
+int    argc;
+char * argv[];
+{
+       register int    i;
+       register int    j;
+       register int    c;
+
+#ifdef unix
+       (void) umask(umask(S_IWGRP | S_IWOTH) | (S_IWGRP | S_IWOTH));
+#endif /* defined unix */
+#if HAVE_GETTEXT
+       (void) setlocale(LC_ALL, "");
+#ifdef TZ_DOMAINDIR
+       (void) bindtextdomain(TZ_DOMAIN, TZ_DOMAINDIR);
+#endif /* defined TEXTDOMAINDIR */
+       (void) textdomain(TZ_DOMAIN);
+#endif /* HAVE_GETTEXT */
+       progname = argv[0];
+       for (i = 1; i < argc; ++i)
+               if (strcmp(argv[i], "--version") == 0) {
+                       (void) printf("%s\n", elsieid);
+                       exit(EXIT_SUCCESS);
+               }
+       while ((c = getopt(argc, argv, "d:l:p:L:vsy:")) != EOF && c != -1)
+               switch (c) {
+                       default:
+                               usage();
+                       case 'd':
+                               if (directory == NULL)
+                                       directory = optarg;
+                               else {
+                                       (void) fprintf(stderr,
+_("%s: More than one -d option specified\n"),
+                                               progname);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
+                       case 'l':
+                               if (lcltime == NULL)
+                                       lcltime = optarg;
+                               else {
+                                       (void) fprintf(stderr,
+_("%s: More than one -l option specified\n"),
+                                               progname);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
+                       case 'p':
+                               if (psxrules == NULL)
+                                       psxrules = optarg;
+                               else {
+                                       (void) fprintf(stderr,
+_("%s: More than one -p option specified\n"),
+                                               progname);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
+                       case 'y':
+                               if (yitcommand == NULL)
+                                       yitcommand = optarg;
+                               else {
+                                       (void) fprintf(stderr,
+_("%s: More than one -y option specified\n"),
+                                               progname);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
+                       case 'L':
+                               if (leapsec == NULL)
+                                       leapsec = optarg;
+                               else {
+                                       (void) fprintf(stderr,
+_("%s: More than one -L option specified\n"),
+                                               progname);
+                                       exit(EXIT_FAILURE);
+                               }
+                               break;
+                       case 'v':
+                               noise = TRUE;
+                               break;
+                       case 's':
+                               sflag = TRUE;
+                               break;
+               }
+       if (optind == argc - 1 && strcmp(argv[optind], "=") == 0)
+               usage();        /* usage message by request */
+       if (directory == NULL)
+               directory = TZDIR;
+       if (yitcommand == NULL)
+               yitcommand = "yearistype";
+
+       setboundaries();
+
+       if (optind < argc && leapsec != NULL) {
+               infile(leapsec);
+               adjleap();
+       }
+
+       for (i = optind; i < argc; ++i)
+               infile(argv[i]);
+       if (errors)
+               exit(EXIT_FAILURE);
+       associate();
+       for (i = 0; i < nzones; i = j) {
+               /*
+               ** Find the next non-continuation zone entry.
+               */
+               for (j = i + 1; j < nzones && zones[j].z_name == NULL; ++j)
+                       continue;
+               outzone(&zones[i], j - i);
+       }
+       /*
+       ** Make links.
+       */
+       for (i = 0; i < nlinks; ++i) {
+               eat(links[i].l_filename, links[i].l_linenum);
+               dolink(links[i].l_from, links[i].l_to);
+               if (noise)
+                       for (j = 0; j < nlinks; ++j)
+                               if (strcmp(links[i].l_to,
+                                       links[j].l_from) == 0)
+                                               warning(_("link to link"));
+       }
+       if (lcltime != NULL) {
+               eat("command line", 1);
+               dolink(lcltime, TZDEFAULT);
+       }
+       if (psxrules != NULL) {
+               eat("command line", 1);
+               dolink(psxrules, TZDEFRULES);
+       }
+       return (errors == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+static void
+dolink(fromfile, tofile)
+const char * const     fromfile;
+const char * const     tofile;
+{
+       register char * fromname;
+       register char * toname;
+
+       if (fromfile[0] == '/')
+               fromname = ecpyalloc(fromfile);
+       else {
+               fromname = ecpyalloc(directory);
+               fromname = ecatalloc(fromname, "/");
+               fromname = ecatalloc(fromname, fromfile);
+       }
+       if (tofile[0] == '/')
+               toname = ecpyalloc(tofile);
+       else {
+               toname = ecpyalloc(directory);
+               toname = ecatalloc(toname, "/");
+               toname = ecatalloc(toname, tofile);
+       }
+       /*
+       ** We get to be careful here since
+       ** there's a fair chance of root running us.
+       */
+       if (!itsdir(toname))
+               (void) remove(toname);
+       if (link(fromname, toname) != 0) {
+               int     result;
+
+               if (mkdirs(toname) != 0)
+                       exit(EXIT_FAILURE);
+
+               result = link(fromname, toname);
+#if HAVE_SYMLINK
+               if (result != 0 &&
+                       access(fromname, F_OK) == 0 &&
+                       !itsdir(fromname)) {
+                               const char *s = tofile;
+                               register char * symlinkcontents = NULL;
+
+                               while ((s = strchr(s+1, '/')) != NULL)
+                                       symlinkcontents =
+                                               ecatalloc(symlinkcontents,
+                                               "../");
+                               symlinkcontents =
+                                       ecatalloc(symlinkcontents,
+                                       fromfile);
+                               result = symlink(symlinkcontents,
+                                       toname);
+                               if (result == 0)
+warning(_("hard link failed, symbolic link used"));
+                               ifree(symlinkcontents);
+               }
+#endif /* HAVE_SYMLINK */
+               if (result != 0) {
+                       const char *e = strerror(errno);
+
+                       (void) fprintf(stderr,
+                               _("%s: Can't link from %s to %s: %s\n"),
+                               progname, fromname, toname, e);
+                       exit(EXIT_FAILURE);
+               }
+       }
+       ifree(fromname);
+       ifree(toname);
+}
+
+#ifndef INT_MAX
+#define INT_MAX        ((int) (((unsigned)~0)>>1))
+#endif /* !defined INT_MAX */
+
+#ifndef INT_MIN
+#define INT_MIN        ((int) ~(((unsigned)~0)>>1))
+#endif /* !defined INT_MIN */
+
+/*
+** The tz file format currently allows at most 32-bit quantities.
+** This restriction should be removed before signed 32-bit values
+** wrap around in 2038, but unfortunately this will require a
+** change to the tz file format.
+*/
+
+#define MAX_BITS_IN_FILE       32
+#define TIME_T_BITS_IN_FILE    ((TYPE_BIT(zic_t) < MAX_BITS_IN_FILE) ? \
+                                       TYPE_BIT(zic_t) : MAX_BITS_IN_FILE)
+
+static void
+setboundaries P((void))
+{
+       register int    i;
+
+       if (TYPE_SIGNED(zic_t)) {
+               min_time = -1;
+               for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+                       min_time *= 2;
+               max_time = -(min_time + 1);
+               if (sflag)
+                       min_time = 0;
+       } else {
+               min_time = 0;
+               max_time = 2 - sflag;
+               for (i = 0; i < TIME_T_BITS_IN_FILE - 1; ++i)
+                       max_time *= 2;
+               --max_time;
+       }
+       {
+               time_t  t;
+
+               t = (time_t) min_time;
+               min_year = TM_YEAR_BASE + gmtime(&t)->tm_year;
+               t = (time_t) max_time;
+               max_year = TM_YEAR_BASE + gmtime(&t)->tm_year;
+       }
+       min_year_representable = min_year;
+       max_year_representable = max_year;
+}
+
+static int
+itsdir(name)
+const char * const     name;
+{
+       register char * myname;
+       register int    accres;
+
+       myname = ecpyalloc(name);
+       myname = ecatalloc(myname, "/.");
+       accres = access(myname, F_OK);
+       ifree(myname);
+       return accres == 0;
+}
+
+/*
+** Associate sets of rules with zones.
+*/
+
+/*
+** Sort by rule name.
+*/
+
+static int
+rcomp(cp1, cp2)
+const void *   cp1;
+const void *   cp2;
+{
+       return strcmp(((const struct rule *) cp1)->r_name,
+               ((const struct rule *) cp2)->r_name);
+}
+
+static void
+associate P((void))
+{
+       register struct zone *  zp;
+       register struct rule *  rp;
+       register int            base, out;
+       register int            i, j;
+
+       if (nrules != 0) {
+               (void) qsort((void *) rules, (size_t) nrules,
+                       (size_t) sizeof *rules, rcomp);
+               for (i = 0; i < nrules - 1; ++i) {
+                       if (strcmp(rules[i].r_name,
+                               rules[i + 1].r_name) != 0)
+                                       continue;
+                       if (strcmp(rules[i].r_filename,
+                               rules[i + 1].r_filename) == 0)
+                                       continue;
+                       eat(rules[i].r_filename, rules[i].r_linenum);
+                       warning(_("same rule name in multiple files"));
+                       eat(rules[i + 1].r_filename, rules[i + 1].r_linenum);
+                       warning(_("same rule name in multiple files"));
+                       for (j = i + 2; j < nrules; ++j) {
+                               if (strcmp(rules[i].r_name,
+                                       rules[j].r_name) != 0)
+                                               break;
+                               if (strcmp(rules[i].r_filename,
+                                       rules[j].r_filename) == 0)
+                                               continue;
+                               if (strcmp(rules[i + 1].r_filename,
+                                       rules[j].r_filename) == 0)
+                                               continue;
+                               break;
+                       }
+                       i = j - 1;
+               }
+       }
+       for (i = 0; i < nzones; ++i) {
+               zp = &zones[i];
+               zp->z_rules = NULL;
+               zp->z_nrules = 0;
+       }
+       for (base = 0; base < nrules; base = out) {
+               rp = &rules[base];
+               for (out = base + 1; out < nrules; ++out)
+                       if (strcmp(rp->r_name, rules[out].r_name) != 0)
+                               break;
+               for (i = 0; i < nzones; ++i) {
+                       zp = &zones[i];
+                       if (strcmp(zp->z_rule, rp->r_name) != 0)
+                               continue;
+                       zp->z_rules = rp;
+                       zp->z_nrules = out - base;
+               }
+       }
+       for (i = 0; i < nzones; ++i) {
+               zp = &zones[i];
+               if (zp->z_nrules == 0) {
+                       /*
+                       ** Maybe we have a local standard time offset.
+                       */
+                       eat(zp->z_filename, zp->z_linenum);
+                       zp->z_stdoff = gethms(zp->z_rule, _("unruly zone"),
+                               TRUE);
+                       /*
+                       ** Note, though, that if there's no rule,
+                       ** a '%s' in the format is a bad thing.
+                       */
+                       if (strchr(zp->z_format, '%') != 0)
+                               error(_("%s in ruleless zone"));
+               }
+       }
+       if (errors)
+               exit(EXIT_FAILURE);
+}
+
+static void
+infile(name)
+const char *   name;
+{
+       register FILE *                 fp;
+       register char **                fields;
+       register char *                 cp;
+       register const struct lookup *  lp;
+       register int                    nfields;
+       register int                    wantcont;
+       register int                    num;
+       char                            buf[BUFSIZ];
+
+       if (strcmp(name, "-") == 0) {
+               name = _("standard input");
+               fp = stdin;
+       } else if ((fp = fopen(name, "r")) == NULL) {
+               const char *e = strerror(errno);
+
+               (void) fprintf(stderr, _("%s: Can't open %s: %s\n"),
+                       progname, name, e);
+               exit(EXIT_FAILURE);
+       }
+       wantcont = FALSE;
+       for (num = 1; ; ++num) {
+               eat(name, num);
+               if (fgets(buf, (int) sizeof buf, fp) != buf)
+                       break;
+               cp = strchr(buf, '\n');
+               if (cp == NULL) {
+                       error(_("line too long"));
+                       exit(EXIT_FAILURE);
+               }
+               *cp = '\0';
+               fields = getfields(buf);
+               nfields = 0;
+               while (fields[nfields] != NULL) {
+                       static char     nada;
+
+                       if (strcmp(fields[nfields], "-") == 0)
+                               fields[nfields] = &nada;
+                       ++nfields;
+               }
+               if (nfields == 0) {
+                       /* nothing to do */
+               } else if (wantcont) {
+                       wantcont = inzcont(fields, nfields);
+               } else {
+                       lp = byword(fields[0], line_codes);
+                       if (lp == NULL)
+                               error(_("input line of unknown type"));
+                       else switch ((int) (lp->l_value)) {
+                               case LC_RULE:
+                                       inrule(fields, nfields);
+                                       wantcont = FALSE;
+                                       break;
+                               case LC_ZONE:
+                                       wantcont = inzone(fields, nfields);
+                                       break;
+                               case LC_LINK:
+                                       inlink(fields, nfields);
+                                       wantcont = FALSE;
+                                       break;
+                               case LC_LEAP:
+                                       if (name != leapsec)
+                                               (void) fprintf(stderr,
+_("%s: Leap line in non leap seconds file %s\n"),
+                                                       progname, name);
+                                       else    inleap(fields, nfields);
+                                       wantcont = FALSE;
+                                       break;
+                               default:        /* "cannot happen" */
+                                       (void) fprintf(stderr,
+_("%s: panic: Invalid l_value %d\n"),
+                                               progname, lp->l_value);
+                                       exit(EXIT_FAILURE);
+                       }
+               }
+               ifree((char *) fields);
+       }
+       if (ferror(fp)) {
+               (void) fprintf(stderr, _("%s: Error reading %s\n"),
+                       progname, filename);
+               exit(EXIT_FAILURE);
+       }
+       if (fp != stdin && fclose(fp)) {
+               const char *e = strerror(errno);
+
+               (void) fprintf(stderr, _("%s: Error closing %s: %s\n"),
+                       progname, filename, e);
+               exit(EXIT_FAILURE);
+       }
+       if (wantcont)
+               error(_("expected continuation line not found"));
+}
+
+/*
+** Convert a string of one of the forms
+**     h       -h      hh:mm   -hh:mm  hh:mm:ss        -hh:mm:ss
+** into a number of seconds.
+** A null string maps to zero.
+** Call error with errstring and return zero on errors.
+*/
+
+static long
+gethms(string, errstring, signable)
+const char *           string;
+const char * const     errstring;
+const int              signable;
+{
+       int     hh, mm, ss, sign;
+
+       if (string == NULL || *string == '\0')
+               return 0;
+       if (!signable)
+               sign = 1;
+       else if (*string == '-') {
+               sign = -1;
+               ++string;
+       } else  sign = 1;
+       if (sscanf(string, scheck(string, "%d"), &hh) == 1)
+               mm = ss = 0;
+       else if (sscanf(string, scheck(string, "%d:%d"), &hh, &mm) == 2)
+               ss = 0;
+       else if (sscanf(string, scheck(string, "%d:%d:%d"),
+               &hh, &mm, &ss) != 3) {
+                       error(errstring);
+                       return 0;
+       }
+       if ((hh < 0 || hh >= HOURSPERDAY ||
+               mm < 0 || mm >= MINSPERHOUR ||
+               ss < 0 || ss > SECSPERMIN) &&
+               !(hh == HOURSPERDAY && mm == 0 && ss == 0)) {
+                       error(errstring);
+                       return 0;
+       }
+       if (noise && hh == HOURSPERDAY)
+               warning(_("24:00 not handled by pre-1998 versions of zic"));
+       return eitol(sign) *
+               (eitol(hh * MINSPERHOUR + mm) *
+               eitol(SECSPERMIN) + eitol(ss));
+}
+
+static void
+inrule(fields, nfields)
+register char ** const fields;
+const int              nfields;
+{
+       static struct rule      r;
+
+       if (nfields != RULE_FIELDS) {
+               error(_("wrong number of fields on Rule line"));
+               return;
+       }
+       if (*fields[RF_NAME] == '\0') {
+               error(_("nameless rule"));
+               return;
+       }
+       r.r_filename = filename;
+       r.r_linenum = linenum;
+       r.r_stdoff = gethms(fields[RF_STDOFF], _("invalid saved time"), TRUE);
+       rulesub(&r, fields[RF_LOYEAR], fields[RF_HIYEAR], fields[RF_COMMAND],
+               fields[RF_MONTH], fields[RF_DAY], fields[RF_TOD]);
+       r.r_name = ecpyalloc(fields[RF_NAME]);
+       r.r_abbrvar = ecpyalloc(fields[RF_ABBRVAR]);
+       rules = (struct rule *) (void *) erealloc((char *) rules,
+               (int) ((nrules + 1) * sizeof *rules));
+       rules[nrules++] = r;
+}
+
+static int
+inzone(fields, nfields)
+register char ** const fields;
+const int              nfields;
+{
+       register int    i;
+       static char *   buf;
+
+       if (nfields < ZONE_MINFIELDS || nfields > ZONE_MAXFIELDS) {
+               error(_("wrong number of fields on Zone line"));
+               return FALSE;
+       }
+       if (strcmp(fields[ZF_NAME], TZDEFAULT) == 0 && lcltime != NULL) {
+               buf = erealloc(buf, (int) (132 + strlen(TZDEFAULT)));
+               (void) sprintf(buf,
+_("\"Zone %s\" line and -l option are mutually exclusive"),
+                       TZDEFAULT);
+               error(buf);
+               return FALSE;
+       }
+       if (strcmp(fields[ZF_NAME], TZDEFRULES) == 0 && psxrules != NULL) {
+               buf = erealloc(buf, (int) (132 + strlen(TZDEFRULES)));
+               (void) sprintf(buf,
+_("\"Zone %s\" line and -p option are mutually exclusive"),
+                       TZDEFRULES);
+               error(buf);
+               return FALSE;
+       }
+       for (i = 0; i < nzones; ++i)
+               if (zones[i].z_name != NULL &&
+                       strcmp(zones[i].z_name, fields[ZF_NAME]) == 0) {
+                               buf = erealloc(buf, (int) (132 +
+                                       strlen(fields[ZF_NAME]) +
+                                       strlen(zones[i].z_filename)));
+                               (void) sprintf(buf,
+_("duplicate zone name %s (file \"%s\", line %d)"),
+                                       fields[ZF_NAME],
+                                       zones[i].z_filename,
+                                       zones[i].z_linenum);
+                               error(buf);
+                               return FALSE;
+               }
+       return inzsub(fields, nfields, FALSE);
+}
+
+static int
+inzcont(fields, nfields)
+register char ** const fields;
+const int              nfields;
+{
+       if (nfields < ZONEC_MINFIELDS || nfields > ZONEC_MAXFIELDS) {
+               error(_("wrong number of fields on Zone continuation line"));
+               return FALSE;
+       }
+       return inzsub(fields, nfields, TRUE);
+}
+
+static int
+inzsub(fields, nfields, iscont)
+register char ** const fields;
+const int              nfields;
+const int              iscont;
+{
+       register char *         cp;
+       static struct zone      z;
+       register int            i_gmtoff, i_rule, i_format;
+       register int            i_untilyear, i_untilmonth;
+       register int            i_untilday, i_untiltime;
+       register int            hasuntil;
+
+       if (iscont) {
+               i_gmtoff = ZFC_GMTOFF;
+               i_rule = ZFC_RULE;
+               i_format = ZFC_FORMAT;
+               i_untilyear = ZFC_TILYEAR;
+               i_untilmonth = ZFC_TILMONTH;
+               i_untilday = ZFC_TILDAY;
+               i_untiltime = ZFC_TILTIME;
+               z.z_name = NULL;
+       } else {
+               i_gmtoff = ZF_GMTOFF;
+               i_rule = ZF_RULE;
+               i_format = ZF_FORMAT;
+               i_untilyear = ZF_TILYEAR;
+               i_untilmonth = ZF_TILMONTH;
+               i_untilday = ZF_TILDAY;
+               i_untiltime = ZF_TILTIME;
+               z.z_name = ecpyalloc(fields[ZF_NAME]);
+       }
+       z.z_filename = filename;
+       z.z_linenum = linenum;
+       z.z_gmtoff = gethms(fields[i_gmtoff], _("invalid UTC offset"), TRUE);
+       if ((cp = strchr(fields[i_format], '%')) != 0) {
+               if (*++cp != 's' || strchr(cp, '%') != 0) {
+                       error(_("invalid abbreviation format"));
+                       return FALSE;
+               }
+       }
+       z.z_rule = ecpyalloc(fields[i_rule]);
+       z.z_format = ecpyalloc(fields[i_format]);
+       hasuntil = nfields > i_untilyear;
+       if (hasuntil) {
+               z.z_untilrule.r_filename = filename;
+               z.z_untilrule.r_linenum = linenum;
+               rulesub(&z.z_untilrule,
+                       fields[i_untilyear],
+                       "only",
+                       "",
+                       (nfields > i_untilmonth) ?
+                       fields[i_untilmonth] : "Jan",
+                       (nfields > i_untilday) ? fields[i_untilday] : "1",
+                       (nfields > i_untiltime) ? fields[i_untiltime] : "0");
+               z.z_untiltime = rpytime(&z.z_untilrule,
+                       z.z_untilrule.r_loyear);
+               if (iscont && nzones > 0 &&
+                       z.z_untiltime > min_time &&
+                       z.z_untiltime < max_time &&
+                       zones[nzones - 1].z_untiltime > min_time &&
+                       zones[nzones - 1].z_untiltime < max_time &&
+                       zones[nzones - 1].z_untiltime >= z.z_untiltime) {
+                               error(_(
+"Zone continuation line end time is not after end time of previous line"
+                                       ));
+                               return FALSE;
+               }
+       }
+       zones = (struct zone *) (void *) erealloc((char *) zones,
+               (int) ((nzones + 1) * sizeof *zones));
+       zones[nzones++] = z;
+       /*
+       ** If there was an UNTIL field on this line,
+       ** there's more information about the zone on the next line.
+       */
+       return hasuntil;
+}
+
+static void
+inleap(fields, nfields)
+register char ** const fields;
+const int              nfields;
+{
+       register const char *           cp;
+       register const struct lookup *  lp;
+       register int                    i, j;
+       int                             year, month, day;
+       long                            dayoff, tod;
+       zic_t                           t;
+
+       if (nfields != LEAP_FIELDS) {
+               error(_("wrong number of fields on Leap line"));
+               return;
+       }
+       dayoff = 0;
+       cp = fields[LP_YEAR];
+       if (sscanf(cp, scheck(cp, "%d"), &year) != 1) {
+               /*
+               ** Leapin' Lizards!
+               */
+               error(_("invalid leaping year"));
+               return;
+       }
+       j = EPOCH_YEAR;
+       while (j != year) {
+               if (year > j) {
+                       i = len_years[isleap(j)];
+                       ++j;
+               } else {
+                       --j;
+                       i = -len_years[isleap(j)];
+               }
+               dayoff = oadd(dayoff, eitol(i));
+       }
+       if ((lp = byword(fields[LP_MONTH], mon_names)) == NULL) {
+               error(_("invalid month name"));
+               return;
+       }
+       month = lp->l_value;
+       j = TM_JANUARY;
+       while (j != month) {
+               i = len_months[isleap(year)][j];
+               dayoff = oadd(dayoff, eitol(i));
+               ++j;
+       }
+       cp = fields[LP_DAY];
+       if (sscanf(cp, scheck(cp, "%d"), &day) != 1 ||
+               day <= 0 || day > len_months[isleap(year)][month]) {
+                       error(_("invalid day of month"));
+                       return;
+       }
+       dayoff = oadd(dayoff, eitol(day - 1));
+       if (dayoff < 0 && !TYPE_SIGNED(zic_t)) {
+               error(_("time before zero"));
+               return;
+       }
+       if (dayoff < min_time / SECSPERDAY) {
+               error(_("time too small"));
+               return;
+       }
+       if (dayoff > max_time / SECSPERDAY) {
+               error(_("time too large"));
+               return;
+       }
+       t = (zic_t) dayoff * SECSPERDAY;
+       tod = gethms(fields[LP_TIME], _("invalid time of day"), FALSE);
+       cp = fields[LP_CORR];
+       {
+               register int    positive;
+               int             count;
+
+               if (strcmp(cp, "") == 0) { /* infile() turns "-" into "" */
+                       positive = FALSE;
+                       count = 1;
+               } else if (strcmp(cp, "--") == 0) {
+                       positive = FALSE;
+                       count = 2;
+               } else if (strcmp(cp, "+") == 0) {
+                       positive = TRUE;
+                       count = 1;
+               } else if (strcmp(cp, "++") == 0) {
+                       positive = TRUE;
+                       count = 2;
+               } else {
+                       error(_("illegal CORRECTION field on Leap line"));
+                       return;
+               }
+               if ((lp = byword(fields[LP_ROLL], leap_types)) == NULL) {
+                       error(_(
+                               "illegal Rolling/Stationary field on Leap line"
+                               ));
+                       return;
+               }
+               leapadd(tadd(t, tod), positive, lp->l_value, count);
+       }
+}
+
+static void
+inlink(fields, nfields)
+register char ** const fields;
+const int              nfields;
+{
+       struct link     l;
+
+       if (nfields != LINK_FIELDS) {
+               error(_("wrong number of fields on Link line"));
+               return;
+       }
+       if (*fields[LF_FROM] == '\0') {
+               error(_("blank FROM field on Link line"));
+               return;
+       }
+       if (*fields[LF_TO] == '\0') {
+               error(_("blank TO field on Link line"));
+               return;
+       }
+       l.l_filename = filename;
+       l.l_linenum = linenum;
+       l.l_from = ecpyalloc(fields[LF_FROM]);
+       l.l_to = ecpyalloc(fields[LF_TO]);
+       links = (struct link *) (void *) erealloc((char *) links,
+               (int) ((nlinks + 1) * sizeof *links));
+       links[nlinks++] = l;
+}
+
+static void
+rulesub(rp, loyearp, hiyearp, typep, monthp, dayp, timep)
+register struct rule * const   rp;
+const char * const             loyearp;
+const char * const             hiyearp;
+const char * const             typep;
+const char * const             monthp;
+const char * const             dayp;
+const char * const             timep;
+{
+       register const struct lookup *  lp;
+       register const char *           cp;
+       register char *                 dp;
+       register char *                 ep;
+
+       if ((lp = byword(monthp, mon_names)) == NULL) {
+               error(_("invalid month name"));
+               return;
+       }
+       rp->r_month = lp->l_value;
+       rp->r_todisstd = FALSE;
+       rp->r_todisgmt = FALSE;
+       dp = ecpyalloc(timep);
+       if (*dp != '\0') {
+               ep = dp + strlen(dp) - 1;
+               switch (lowerit(*ep)) {
+                       case 's':       /* Standard */
+                               rp->r_todisstd = TRUE;
+                               rp->r_todisgmt = FALSE;
+                               *ep = '\0';
+                               break;
+                       case 'w':       /* Wall */
+                               rp->r_todisstd = FALSE;
+                               rp->r_todisgmt = FALSE;
+                               *ep = '\0';
+                               break;
+                       case 'g':       /* Greenwich */
+                       case 'u':       /* Universal */
+                       case 'z':       /* Zulu */
+                               rp->r_todisstd = TRUE;
+                               rp->r_todisgmt = TRUE;
+                               *ep = '\0';
+                               break;
+               }
+       }
+       rp->r_tod = gethms(dp, _("invalid time of day"), FALSE);
+       ifree(dp);
+       /*
+       ** Year work.
+       */
+       cp = loyearp;
+       lp = byword(cp, begin_years);
+       if (lp != NULL) switch ((int) lp->l_value) {
+               case YR_MINIMUM:
+                       rp->r_loyear = INT_MIN;
+                       break;
+               case YR_MAXIMUM:
+                       rp->r_loyear = INT_MAX;
+                       break;
+               default:        /* "cannot happen" */
+                       (void) fprintf(stderr,
+                               _("%s: panic: Invalid l_value %d\n"),
+                               progname, lp->l_value);
+                       exit(EXIT_FAILURE);
+       } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_loyear) != 1) {
+               error(_("invalid starting year"));
+               return;
+       } else if (noise) {
+               if (rp->r_loyear < min_year_representable)
+                       warning(_("starting year too low to be represented"));
+               else if (rp->r_loyear > max_year_representable)
+                       warning(_("starting year too high to be represented"));
+       }
+       cp = hiyearp;
+       if ((lp = byword(cp, end_years)) != NULL) switch ((int) lp->l_value) {
+               case YR_MINIMUM:
+                       rp->r_hiyear = INT_MIN;
+                       break;
+               case YR_MAXIMUM:
+                       rp->r_hiyear = INT_MAX;
+                       break;
+               case YR_ONLY:
+                       rp->r_hiyear = rp->r_loyear;
+                       break;
+               default:        /* "cannot happen" */
+                       (void) fprintf(stderr,
+                               _("%s: panic: Invalid l_value %d\n"),
+                               progname, lp->l_value);
+                       exit(EXIT_FAILURE);
+       } else if (sscanf(cp, scheck(cp, "%d"), &rp->r_hiyear) != 1) {
+               error(_("invalid ending year"));
+               return;
+       } else if (noise) {
+               if (rp->r_loyear < min_year_representable)
+                       warning(_("ending year too low to be represented"));
+               else if (rp->r_loyear > max_year_representable)
+                       warning(_("ending year too high to be represented"));
+       }
+       if (rp->r_loyear > rp->r_hiyear) {
+               error(_("starting year greater than ending year"));
+               return;
+       }
+       if (*typep == '\0')
+               rp->r_yrtype = NULL;
+       else {
+               if (rp->r_loyear == rp->r_hiyear) {
+                       error(_("typed single year"));
+                       return;
+               }
+               rp->r_yrtype = ecpyalloc(typep);
+       }
+       if (rp->r_loyear < min_year && rp->r_loyear > 0)
+               min_year = rp->r_loyear;
+       /*
+       ** Day work.
+       ** Accept things such as:
+       **      1
+       **      last-Sunday
+       **      Sun<=20
+       **      Sun>=7
+       */
+       dp = ecpyalloc(dayp);
+       if ((lp = byword(dp, lasts)) != NULL) {
+               rp->r_dycode = DC_DOWLEQ;
+               rp->r_wday = lp->l_value;
+               rp->r_dayofmonth = len_months[1][rp->r_month];
+       } else {
+               if ((ep = strchr(dp, '<')) != 0)
+                       rp->r_dycode = DC_DOWLEQ;
+               else if ((ep = strchr(dp, '>')) != 0)
+                       rp->r_dycode = DC_DOWGEQ;
+               else {
+                       ep = dp;
+                       rp->r_dycode = DC_DOM;
+               }
+               if (rp->r_dycode != DC_DOM) {
+                       *ep++ = 0;
+                       if (*ep++ != '=') {
+                               error(_("invalid day of month"));
+                               ifree(dp);
+                               return;
+                       }
+                       if ((lp = byword(dp, wday_names)) == NULL) {
+                               error(_("invalid weekday name"));
+                               ifree(dp);
+                               return;
+                       }
+                       rp->r_wday = lp->l_value;
+               }
+               if (sscanf(ep, scheck(ep, "%d"), &rp->r_dayofmonth) != 1 ||
+                       rp->r_dayofmonth <= 0 ||
+                       (rp->r_dayofmonth > len_months[1][rp->r_month])) {
+                               error(_("invalid day of month"));
+                               ifree(dp);
+                               return;
+               }
+       }
+       ifree(dp);
+}
+
+static void
+convert(val, buf)
+const long     val;
+char * const   buf;
+{
+       register int    i;
+       register long   shift;
+
+       for (i = 0, shift = 24; i < 4; ++i, shift -= 8)
+               buf[i] = val >> shift;
+}
+
+static void
+puttzcode(val, fp)
+const long     val;
+FILE * const   fp;
+{
+       char    buf[4];
+
+       convert(val, buf);
+       (void) fwrite((void *) buf, (size_t) sizeof buf, (size_t) 1, fp);
+}
+
+static int
+atcomp(avp, bvp)
+void * avp;
+void * bvp;
+{
+       if (((struct attype *) avp)->at < ((struct attype *) bvp)->at)
+               return -1;
+       else if (((struct attype *) avp)->at > ((struct attype *) bvp)->at)
+               return 1;
+       else    return 0;
+}
+
+static void
+writezone(name)
+const char * const     name;
+{
+       register FILE *         fp;
+       register int            i, j;
+       static char *           fullname;
+       static struct tzhead    tzh;
+       zic_t                   ats[TZ_MAX_TIMES];
+       unsigned char           types[TZ_MAX_TIMES];
+
+       /*
+       ** Sort.
+       */
+       if (timecnt > 1)
+               (void) qsort((void *) attypes, (size_t) timecnt,
+                       (size_t) sizeof *attypes, atcomp);
+       /*
+       ** Optimize.
+       */
+       {
+               int     fromi;
+               int     toi;
+
+               toi = 0;
+               fromi = 0;
+               while (fromi < timecnt && attypes[fromi].at < min_time)
+                       ++fromi;
+               if (isdsts[0] == 0)
+                       while (fromi < timecnt && attypes[fromi].type == 0)
+                               ++fromi;        /* handled by default rule */
+               for ( ; fromi < timecnt; ++fromi) {
+                       if (toi != 0 && ((attypes[fromi].at +
+                               gmtoffs[attypes[toi - 1].type]) <=
+                               (attypes[toi - 1].at + gmtoffs[toi == 1 ? 0
+                               : attypes[toi - 2].type]))) {
+                                       attypes[toi - 1].type =
+                                               attypes[fromi].type;
+                                       continue;
+                       }
+                       if (toi == 0 ||
+                               attypes[toi - 1].type != attypes[fromi].type)
+                                       attypes[toi++] = attypes[fromi];
+               }
+               timecnt = toi;
+       }
+       /*
+       ** Transfer.
+       */
+       for (i = 0; i < timecnt; ++i) {
+               ats[i] = attypes[i].at;
+               types[i] = attypes[i].type;
+       }
+       fullname = erealloc(fullname,
+               (int) (strlen(directory) + 1 + strlen(name) + 1));
+       (void) sprintf(fullname, "%s/%s", directory, name);
+       /*
+       ** Remove old file, if any, to snap links.
+       */
+       if (!itsdir(fullname) && remove(fullname) != 0 && errno != ENOENT) {
+               const char *e = strerror(errno);
+
+               (void) fprintf(stderr, _("%s: Can't remove %s: %s\n"),
+                       progname, fullname, e);
+               exit(EXIT_FAILURE);
+       }
+       if ((fp = fopen(fullname, "wb")) == NULL) {
+               if (mkdirs(fullname) != 0)
+                       exit(EXIT_FAILURE);
+               if ((fp = fopen(fullname, "wb")) == NULL) {
+                       const char *e = strerror(errno);
+
+                       (void) fprintf(stderr, _("%s: Can't create %s: %s\n"),
+                               progname, fullname, e);
+                       exit(EXIT_FAILURE);
+               }
+       }
+       convert(eitol(typecnt), tzh.tzh_ttisgmtcnt);
+       convert(eitol(typecnt), tzh.tzh_ttisstdcnt);
+       convert(eitol(leapcnt), tzh.tzh_leapcnt);
+       convert(eitol(timecnt), tzh.tzh_timecnt);
+       convert(eitol(typecnt), tzh.tzh_typecnt);
+       convert(eitol(charcnt), tzh.tzh_charcnt);
+       (void) strncpy(tzh.tzh_magic, TZ_MAGIC, sizeof tzh.tzh_magic);
+#define DO(field)      (void) fwrite((void *) tzh.field, \
+                               (size_t) sizeof tzh.field, (size_t) 1, fp)
+       DO(tzh_magic);
+       DO(tzh_reserved);
+       DO(tzh_ttisgmtcnt);
+       DO(tzh_ttisstdcnt);
+       DO(tzh_leapcnt);
+       DO(tzh_timecnt);
+       DO(tzh_typecnt);
+       DO(tzh_charcnt);
+#undef DO
+       for (i = 0; i < timecnt; ++i) {
+               j = leapcnt;
+               while (--j >= 0)
+                       if (ats[i] >= trans[j]) {
+                               ats[i] = tadd(ats[i], corr[j]);
+                               break;
+                       }
+               puttzcode((long) ats[i], fp);
+       }
+       if (timecnt > 0)
+               (void) fwrite((void *) types, (size_t) sizeof types[0],
+                       (size_t) timecnt, fp);
+       for (i = 0; i < typecnt; ++i) {
+               puttzcode((long) gmtoffs[i], fp);
+               (void) putc(isdsts[i], fp);
+               (void) putc(abbrinds[i], fp);
+       }
+       if (charcnt != 0)
+               (void) fwrite((void *) chars, (size_t) sizeof chars[0],
+                       (size_t) charcnt, fp);
+       for (i = 0; i < leapcnt; ++i) {
+               if (roll[i]) {
+                       if (timecnt == 0 || trans[i] < ats[0]) {
+                               j = 0;
+                               while (isdsts[j])
+                                       if (++j >= typecnt) {
+                                               j = 0;
+                                               break;
+                                       }
+                       } else {
+                               j = 1;
+                               while (j < timecnt && trans[i] >= ats[j])
+                                       ++j;
+                               j = types[j - 1];
+                       }
+                       puttzcode((long) tadd(trans[i], -gmtoffs[j]), fp);
+               } else  puttzcode((long) trans[i], fp);
+               puttzcode((long) corr[i], fp);
+       }
+       for (i = 0; i < typecnt; ++i)
+               (void) putc(ttisstds[i], fp);
+       for (i = 0; i < typecnt; ++i)
+               (void) putc(ttisgmts[i], fp);
+       if (ferror(fp) || fclose(fp)) {
+               (void) fprintf(stderr, _("%s: Error writing %s\n"),
+                       progname, fullname);
+               exit(EXIT_FAILURE);
+       }
+}
+
+static void
+doabbr(abbr, format, letters, isdst)
+char * const           abbr;
+const char * const     format;
+const char * const     letters;
+const int              isdst;
+{
+       if (strchr(format, '/') == NULL) {
+               if (letters == NULL)
+                       (void) strcpy(abbr, format);
+               else    (void) sprintf(abbr, format, letters);
+       } else if (isdst)
+               (void) strcpy(abbr, strchr(format, '/') + 1);
+       else {
+               (void) strcpy(abbr, format);
+               *strchr(abbr, '/') = '\0';
+       }
+}
+
+static void
+outzone(zpfirst, zonecount)
+const struct zone * const      zpfirst;
+const int                      zonecount;
+{
+       register const struct zone *    zp;
+       register struct rule *          rp;
+       register int                    i, j;
+       register int                    usestart, useuntil;
+       register zic_t                  starttime, untiltime;
+       register long                   gmtoff;
+       register long                   stdoff;
+       register int                    year;
+       register long                   startoff;
+       register int                    startttisstd;
+       register int                    startttisgmt;
+       register int                    type;
+       char                            startbuf[BUFSIZ];
+
+       INITIALIZE(untiltime);
+       INITIALIZE(starttime);
+       /*
+       ** Now. . .finally. . .generate some useful data!
+       */
+       timecnt = 0;
+       typecnt = 0;
+       charcnt = 0;
+       /*
+       ** Thanks to Earl Chew
+       ** for noting the need to unconditionally initialize startttisstd.
+       */
+       startttisstd = FALSE;
+       startttisgmt = FALSE;
+       for (i = 0; i < zonecount; ++i) {
+               /*
+               ** A guess that may well be corrected later.
+               */
+               stdoff = 0;
+               zp = &zpfirst[i];
+               usestart = i > 0 && (zp - 1)->z_untiltime > min_time;
+               useuntil = i < (zonecount - 1);
+               if (useuntil && zp->z_untiltime <= min_time)
+                       continue;
+               gmtoff = zp->z_gmtoff;
+               eat(zp->z_filename, zp->z_linenum);
+               *startbuf = '\0';
+               startoff = zp->z_gmtoff;
+               if (zp->z_nrules == 0) {
+                       stdoff = zp->z_stdoff;
+                       doabbr(startbuf, zp->z_format,
+                               (char *) NULL, stdoff != 0);
+                       type = addtype(oadd(zp->z_gmtoff, stdoff),
+                               startbuf, stdoff != 0, startttisstd,
+                               startttisgmt);
+                       if (usestart) {
+                               addtt(starttime, type);
+                               usestart = FALSE;
+                       } else if (stdoff != 0)
+                               addtt(min_time, type);
+               } else for (year = min_year; year <= max_year; ++year) {
+                       if (useuntil && year > zp->z_untilrule.r_hiyear)
+                               break;
+                       /*
+                       ** Mark which rules to do in the current year.
+                       ** For those to do, calculate rpytime(rp, year);
+                       */
+                       for (j = 0; j < zp->z_nrules; ++j) {
+                               rp = &zp->z_rules[j];
+                               eats(zp->z_filename, zp->z_linenum,
+                                       rp->r_filename, rp->r_linenum);
+                               rp->r_todo = year >= rp->r_loyear &&
+                                               year <= rp->r_hiyear &&
+                                               yearistype(year, rp->r_yrtype);
+                               if (rp->r_todo)
+                                       rp->r_temp = rpytime(rp, year);
+                       }
+                       for ( ; ; ) {
+                               register int    k;
+                               register zic_t  jtime, ktime;
+                               register long   offset;
+                               char            buf[BUFSIZ];
+
+                               INITIALIZE(ktime);
+                               if (useuntil) {
+                                       /*
+                                       ** Turn untiltime into UTC
+                                       ** assuming the current gmtoff and
+                                       ** stdoff values.
+                                       */
+                                       untiltime = zp->z_untiltime;
+                                       if (!zp->z_untilrule.r_todisgmt)
+                                               untiltime = tadd(untiltime,
+                                                       -gmtoff);
+                                       if (!zp->z_untilrule.r_todisstd)
+                                               untiltime = tadd(untiltime,
+                                                       -stdoff);
+                               }
+                               /*
+                               ** Find the rule (of those to do, if any)
+                               ** that takes effect earliest in the year.
+                               */
+                               k = -1;
+                               for (j = 0; j < zp->z_nrules; ++j) {
+                                       rp = &zp->z_rules[j];
+                                       if (!rp->r_todo)
+                                               continue;
+                                       eats(zp->z_filename, zp->z_linenum,
+                                               rp->r_filename, rp->r_linenum);
+                                       offset = rp->r_todisgmt ? 0 : gmtoff;
+                                       if (!rp->r_todisstd)
+                                               offset = oadd(offset, stdoff);
+                                       jtime = rp->r_temp;
+                                       if (jtime == min_time ||
+                                               jtime == max_time)
+                                                       continue;
+                                       jtime = tadd(jtime, -offset);
+                                       if (k < 0 || jtime < ktime) {
+                                               k = j;
+                                               ktime = jtime;
+                                       }
+                               }
+                               if (k < 0)
+                                       break;  /* go on to next year */
+                               rp = &zp->z_rules[k];
+                               rp->r_todo = FALSE;
+                               if (useuntil && ktime >= untiltime)
+                                       break;
+                               stdoff = rp->r_stdoff;
+                               if (usestart && ktime == starttime)
+                                       usestart = FALSE;
+                               if (usestart) {
+                                       if (ktime < starttime) {
+                                               startoff = oadd(zp->z_gmtoff,
+                                                       stdoff);
+                                               doabbr(startbuf, zp->z_format,
+                                                       rp->r_abbrvar,
+                                                       rp->r_stdoff != 0);
+                                               continue;
+                                       }
+                                       if (*startbuf == '\0' &&
+                                               startoff == oadd(zp->z_gmtoff,
+                                               stdoff))
+                                                       doabbr(startbuf,
+                                                               zp->z_format,
+                                                               rp->r_abbrvar,
+                                                               rp->r_stdoff !=
+                                                               0);
+                               }
+                               eats(zp->z_filename, zp->z_linenum,
+                                       rp->r_filename, rp->r_linenum);
+                               doabbr(buf, zp->z_format, rp->r_abbrvar,
+                                       rp->r_stdoff != 0);
+                               offset = oadd(zp->z_gmtoff, rp->r_stdoff);
+                               type = addtype(offset, buf, rp->r_stdoff != 0,
+                                       rp->r_todisstd, rp->r_todisgmt);
+                               addtt(ktime, type);
+                       }
+               }
+               if (usestart) {
+                       if (*startbuf == '\0' &&
+                               zp->z_format != NULL &&
+                               strchr(zp->z_format, '%') == NULL &&
+                               strchr(zp->z_format, '/') == NULL)
+                                       (void) strcpy(startbuf, zp->z_format);
+                       eat(zp->z_filename, zp->z_linenum);
+                       if (*startbuf == '\0')
+error(_("can't determine time zone abbreviation to use just after until time"));
+                       else    addtt(starttime,
+                                       addtype(startoff, startbuf,
+                                               startoff != zp->z_gmtoff,
+                                               startttisstd,
+                                               startttisgmt));
+               }
+               /*
+               ** Now we may get to set starttime for the next zone line.
+               */
+               if (useuntil) {
+                       startttisstd = zp->z_untilrule.r_todisstd;
+                       startttisgmt = zp->z_untilrule.r_todisgmt;
+                       starttime = zp->z_untiltime;
+                       if (!startttisstd)
+                               starttime = tadd(starttime, -stdoff);
+                       if (!startttisgmt)
+                               starttime = tadd(starttime, -gmtoff);
+               }
+       }
+       writezone(zpfirst->z_name);
+}
+
+static void
+addtt(starttime, type)
+const zic_t    starttime;
+int            type;
+{
+       if (starttime <= min_time ||
+               (timecnt == 1 && attypes[0].at < min_time)) {
+               gmtoffs[0] = gmtoffs[type];
+               isdsts[0] = isdsts[type];
+               ttisstds[0] = ttisstds[type];
+               ttisgmts[0] = ttisgmts[type];
+               if (abbrinds[type] != 0)
+                       (void) strcpy(chars, &chars[abbrinds[type]]);
+               abbrinds[0] = 0;
+               charcnt = strlen(chars) + 1;
+               typecnt = 1;
+               timecnt = 0;
+               type = 0;
+       }
+       if (timecnt >= TZ_MAX_TIMES) {
+               error(_("too many transitions?!"));
+               exit(EXIT_FAILURE);
+       }
+       attypes[timecnt].at = starttime;
+       attypes[timecnt].type = type;
+       ++timecnt;
+}
+
+static int
+addtype(gmtoff, abbr, isdst, ttisstd, ttisgmt)
+const long             gmtoff;
+const char * const     abbr;
+const int              isdst;
+const int              ttisstd;
+const int              ttisgmt;
+{
+       register int    i, j;
+
+       if (isdst != TRUE && isdst != FALSE) {
+               error(_("internal error - addtype called with bad isdst"));
+               exit(EXIT_FAILURE);
+       }
+       if (ttisstd != TRUE && ttisstd != FALSE) {
+               error(_("internal error - addtype called with bad ttisstd"));
+               exit(EXIT_FAILURE);
+       }
+       if (ttisgmt != TRUE && ttisgmt != FALSE) {
+               error(_("internal error - addtype called with bad ttisgmt"));
+               exit(EXIT_FAILURE);
+       }
+       /*
+       ** See if there's already an entry for this zone type.
+       ** If so, just return its index.
+       */
+       for (i = 0; i < typecnt; ++i) {
+               if (gmtoff == gmtoffs[i] && isdst == isdsts[i] &&
+                       strcmp(abbr, &chars[abbrinds[i]]) == 0 &&
+                       ttisstd == ttisstds[i] &&
+                       ttisgmt == ttisgmts[i])
+                               return i;
+       }
+       /*
+       ** There isn't one; add a new one, unless there are already too
+       ** many.
+       */
+       if (typecnt >= TZ_MAX_TYPES) {
+               error(_("too many local time types"));
+               exit(EXIT_FAILURE);
+       }
+       gmtoffs[i] = gmtoff;
+       isdsts[i] = isdst;
+       ttisstds[i] = ttisstd;
+       ttisgmts[i] = ttisgmt;
+
+       for (j = 0; j < charcnt; ++j)
+               if (strcmp(&chars[j], abbr) == 0)
+                       break;
+       if (j == charcnt)
+               newabbr(abbr);
+       abbrinds[i] = j;
+       ++typecnt;
+       return i;
+}
+
+static void
+leapadd(t, positive, rolling, count)
+const zic_t    t;
+const int      positive;
+const int      rolling;
+int            count;
+{
+       register int    i, j;
+
+       if (leapcnt + (positive ? count : 1) > TZ_MAX_LEAPS) {
+               error(_("too many leap seconds"));
+               exit(EXIT_FAILURE);
+       }
+       for (i = 0; i < leapcnt; ++i)
+               if (t <= trans[i]) {
+                       if (t == trans[i]) {
+                               error(_("repeated leap second moment"));
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               }
+       do {
+               for (j = leapcnt; j > i; --j) {
+                       trans[j] = trans[j - 1];
+                       corr[j] = corr[j - 1];
+                       roll[j] = roll[j - 1];
+               }
+               trans[i] = t;
+               corr[i] = positive ? 1L : eitol(-count);
+               roll[i] = rolling;
+               ++leapcnt;
+       } while (positive && --count != 0);
+}
+
+static void
+adjleap P((void))
+{
+       register int    i;
+       register long   last = 0;
+
+       /*
+       ** propagate leap seconds forward
+       */
+       for (i = 0; i < leapcnt; ++i) {
+               trans[i] = tadd(trans[i], last);
+               last = corr[i] += last;
+       }
+}
+
+static int
+yearistype(year, type)
+const int              year;
+const char * const     type;
+{
+       static char *   buf;
+       int             result;
+
+       if (type == NULL || *type == '\0')
+               return TRUE;
+       buf = erealloc(buf, (int) (132 + strlen(yitcommand) + strlen(type)));
+       (void) sprintf(buf, "%s %d %s", yitcommand, year, type);
+       result = system(buf);
+       if (WIFEXITED(result)) switch (WEXITSTATUS(result)) {
+               case 0:
+                       return TRUE;
+               case 1:
+                       return FALSE;
+       }
+       error(_("Wild result from command execution"));
+       (void) fprintf(stderr, _("%s: command was '%s', result was %d\n"),
+               progname, buf, result);
+       for ( ; ; )
+               exit(EXIT_FAILURE);
+}
+
+static int
+lowerit(a)
+int    a;
+{
+       a = (unsigned char) a;
+       return (isascii(a) && isupper(a)) ? tolower(a) : a;
+}
+
+static int
+ciequal(ap, bp)                /* case-insensitive equality */
+register const char *  ap;
+register const char *  bp;
+{
+       while (lowerit(*ap) == lowerit(*bp++))
+               if (*ap++ == '\0')
+                       return TRUE;
+       return FALSE;
+}
+
+static int
+itsabbr(abbr, word)
+register const char *  abbr;
+register const char *  word;
+{
+       if (lowerit(*abbr) != lowerit(*word))
+               return FALSE;
+       ++word;
+       while (*++abbr != '\0')
+               do {
+                       if (*word == '\0')
+                               return FALSE;
+               } while (lowerit(*word++) != lowerit(*abbr));
+       return TRUE;
+}
+
+static const struct lookup *
+byword(word, table)
+register const char * const            word;
+register const struct lookup * const   table;
+{
+       register const struct lookup *  foundlp;
+       register const struct lookup *  lp;
+
+       if (word == NULL || table == NULL)
+               return NULL;
+       /*
+       ** Look for exact match.
+       */
+       for (lp = table; lp->l_word != NULL; ++lp)
+               if (ciequal(word, lp->l_word))
+                       return lp;
+       /*
+       ** Look for inexact match.
+       */
+       foundlp = NULL;
+       for (lp = table; lp->l_word != NULL; ++lp)
+               if (itsabbr(word, lp->l_word)) {
+                       if (foundlp == NULL)
+                               foundlp = lp;
+                       else    return NULL;    /* multiple inexact matches */
+               }
+       return foundlp;
+}
+
+static char **
+getfields(cp)
+register char *        cp;
+{
+       register char *         dp;
+       register char **        array;
+       register int            nsubs;
+
+       if (cp == NULL)
+               return NULL;
+       array = (char **) (void *)
+               emalloc((int) ((strlen(cp) + 1) * sizeof *array));
+       nsubs = 0;
+       for ( ; ; ) {
+               while (isascii((unsigned char) *cp) &&
+                       isspace((unsigned char) *cp))
+                               ++cp;
+               if (*cp == '\0' || *cp == '#')
+                       break;
+               array[nsubs++] = dp = cp;
+               do {
+                       if ((*dp = *cp++) != '"')
+                               ++dp;
+                       else while ((*dp = *cp++) != '"')
+                               if (*dp != '\0')
+                                       ++dp;
+                               else    error(_(
+                                               "Odd number of quotation marks"
+                                               ));
+               } while (*cp != '\0' && *cp != '#' &&
+                       (!isascii(*cp) || !isspace((unsigned char) *cp)));
+               if (isascii(*cp) && isspace((unsigned char) *cp))
+                       ++cp;
+               *dp = '\0';
+       }
+       array[nsubs] = NULL;
+       return array;
+}
+
+static long
+oadd(t1, t2)
+const long     t1;
+const long     t2;
+{
+       register long   t;
+
+       t = t1 + t2;
+       if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
+               error(_("time overflow"));
+               exit(EXIT_FAILURE);
+       }
+       return t;
+}
+
+static zic_t
+tadd(t1, t2)
+const zic_t    t1;
+const long     t2;
+{
+       register zic_t  t;
+
+       if (t1 == max_time && t2 > 0)
+               return max_time;
+       if (t1 == min_time && t2 < 0)
+               return min_time;
+       t = t1 + t2;
+       if ((t2 > 0 && t <= t1) || (t2 < 0 && t >= t1)) {
+               error(_("time overflow"));
+               exit(EXIT_FAILURE);
+       }
+       return t;
+}
+
+/*
+** Given a rule, and a year, compute the date - in seconds since January 1,
+** 1970, 00:00 LOCAL time - in that year that the rule refers to.
+*/
+
+static zic_t
+rpytime(rp, wantedy)
+register const struct rule * const     rp;
+register const int                     wantedy;
+{
+       register int    y, m, i;
+       register long   dayoff;                 /* with a nod to Margaret O. */
+       register zic_t  t;
+
+       if (wantedy == INT_MIN)
+               return min_time;
+       if (wantedy == INT_MAX)
+               return max_time;
+       dayoff = 0;
+       m = TM_JANUARY;
+       y = EPOCH_YEAR;
+       while (wantedy != y) {
+               if (wantedy > y) {
+                       i = len_years[isleap(y)];
+                       ++y;
+               } else {
+                       --y;
+                       i = -len_years[isleap(y)];
+               }
+               dayoff = oadd(dayoff, eitol(i));
+       }
+       while (m != rp->r_month) {
+               i = len_months[isleap(y)][m];
+               dayoff = oadd(dayoff, eitol(i));
+               ++m;
+       }
+       i = rp->r_dayofmonth;
+       if (m == TM_FEBRUARY && i == 29 && !isleap(y)) {
+               if (rp->r_dycode == DC_DOWLEQ)
+                       --i;
+               else {
+                       error(_("use of 2/29 in non leap-year"));
+                       exit(EXIT_FAILURE);
+               }
+       }
+       --i;
+       dayoff = oadd(dayoff, eitol(i));
+       if (rp->r_dycode == DC_DOWGEQ || rp->r_dycode == DC_DOWLEQ) {
+               register long   wday;
+
+#define LDAYSPERWEEK   ((long) DAYSPERWEEK)
+               wday = eitol(EPOCH_WDAY);
+               /*
+               ** Don't trust mod of negative numbers.
+               */
+               if (dayoff >= 0)
+                       wday = (wday + dayoff) % LDAYSPERWEEK;
+               else {
+                       wday -= ((-dayoff) % LDAYSPERWEEK);
+                       if (wday < 0)
+                               wday += LDAYSPERWEEK;
+               }
+               while (wday != eitol(rp->r_wday))
+                       if (rp->r_dycode == DC_DOWGEQ) {
+                               dayoff = oadd(dayoff, (long) 1);
+                               if (++wday >= LDAYSPERWEEK)
+                                       wday = 0;
+                               ++i;
+                       } else {
+                               dayoff = oadd(dayoff, (long) -1);
+                               if (--wday < 0)
+                                       wday = LDAYSPERWEEK - 1;
+                               --i;
+                       }
+               if (i < 0 || i >= len_months[isleap(y)][m]) {
+                       if (noise)
+                               warning(_("rule goes past start/end of month--\
+will not work with pre-2004 versions of zic"));
+               }
+       }
+       if (dayoff < 0 && !TYPE_SIGNED(zic_t))
+               return min_time;
+       if (dayoff < min_time / SECSPERDAY)
+               return min_time;
+       if (dayoff > max_time / SECSPERDAY)
+               return max_time;
+       t = (zic_t) dayoff * SECSPERDAY;
+       return tadd(t, rp->r_tod);
+}
+
+static void
+newabbr(string)
+const char * const     string;
+{
+       register int    i;
+
+       if (strcmp(string, GRANDPARENTED) != 0) {
+               register const char *   cp;
+               register char *         wp;
+
+               /*
+               ** Want one to ZIC_MAX_ABBR_LEN_WO_WARN alphabetics
+               ** optionally followed by a + or - and a number from 1 to 14.
+               */
+               cp = string;
+               wp = NULL;
+               while (isascii((unsigned char) *cp) &&
+                       isalpha((unsigned char) *cp))
+                               ++cp;
+               if (cp - string == 0)
+wp = _("time zone abbreviation lacks alphabetic at start");
+               if (noise && cp - string > 3)
+wp = _("time zone abbreviation has more than 3 alphabetics");
+               if (cp - string > ZIC_MAX_ABBR_LEN_WO_WARN)
+wp = _("time zone abbreviation has too many alphabetics");
+               if (wp == NULL && (*cp == '+' || *cp == '-')) {
+                       ++cp;
+                       if (isascii((unsigned char) *cp) &&
+                               isdigit((unsigned char) *cp))
+                                       if (*cp++ == '1' &&
+                                               *cp >= '0' && *cp <= '4')
+                                                       ++cp;
+               }
+               if (*cp != '\0')
+wp = _("time zone abbreviation differs from POSIX standard");
+               if (wp != NULL) {
+                       wp = ecpyalloc(wp);
+                       wp = ecatalloc(wp, " (");
+                       wp = ecatalloc(wp, string);
+                       wp = ecatalloc(wp, ")");
+                       warning(wp);
+                       ifree(wp);
+               }
+       }
+       i = strlen(string) + 1;
+       if (charcnt + i > TZ_MAX_CHARS) {
+               error(_("too many, or too long, time zone abbreviations"));
+               exit(EXIT_FAILURE);
+       }
+       (void) strcpy(&chars[charcnt], string);
+       charcnt += eitol(i);
+}
+
+static int
+mkdirs(argname)
+char * const   argname;
+{
+       register char * name;
+       register char * cp;
+
+       if (argname == NULL || *argname == '\0')
+               return 0;
+       cp = name = ecpyalloc(argname);
+       while ((cp = strchr(cp + 1, '/')) != 0) {
+               *cp = '\0';
+#ifndef unix
+               /*
+               ** DOS drive specifier?
+               */
+               if (isalpha((unsigned char) name[0]) &&
+                       name[1] == ':' && name[2] == '\0') {
+                               *cp = '/';
+                               continue;
+               }
+#endif /* !defined unix */
+               if (!itsdir(name)) {
+                       /*
+                       ** It doesn't seem to exist, so we try to create it.
+                       ** Creation may fail because of the directory being
+                       ** created by some other multiprocessor, so we get
+                       ** to do extra checking.
+                       */
+                       if (mkdir(name, MKDIR_UMASK) != 0) {
+                               const char *e = strerror(errno);
+
+                               if (errno != EEXIST || !itsdir(name)) {
+                                       (void) fprintf(stderr,
+_("%s: Can't create directory %s: %s\n"),
+                                               progname, name, e);
+                                       ifree(name);
+                                       return -1;
+                               }
+                       }
+               }
+               *cp = '/';
+       }
+       ifree(name);
+       return 0;
+}
+
+static long
+eitol(i)
+const int      i;
+{
+       long    l;
+
+       l = i;
+       if ((i < 0 && l >= 0) || (i == 0 && l != 0) || (i > 0 && l <= 0)) {
+               (void) fprintf(stderr,
+                       _("%s: %d did not sign extend correctly\n"),
+                       progname, i);
+               exit(EXIT_FAILURE);
+       }
+       return l;
+}
+
+/*
+** UNIX was a registered trademark of The Open Group in 2003.
+*/
diff --git a/commands/zoneinfo/zone.tab b/commands/zoneinfo/zone.tab
new file mode 100644 (file)
index 0000000..ace7b57
--- /dev/null
@@ -0,0 +1,420 @@
+# @(#)zone.tab 8.10
+#
+# TZ zone descriptions
+#
+# From Paul Eggert (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
+# 2.  Latitude and longitude of the zone's principal location
+#     in ISO 6709 sign-degrees-minutes-seconds format,
+#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+#     first latitude (+ is north), then longitude (+ is east).
+# 3.  Zone name used in value of TZ environment variable.
+# 4.  Comments; present if and only if the country has multiple rows.
+#
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code  coordinates     TZ                      comments
+AD     +4230+00131     Europe/Andorra
+AE     +2518+05518     Asia/Dubai
+AF     +3431+06912     Asia/Kabul
+AG     +1703-06148     America/Antigua
+AI     +1812-06304     America/Anguilla
+AL     +4120+01950     Europe/Tirane
+AM     +4011+04430     Asia/Yerevan
+AN     +1211-06900     America/Curacao
+AO     -0848+01314     Africa/Luanda
+AQ     -7750+16636     Antarctica/McMurdo      McMurdo Station, Ross Island
+AQ     -9000+00000     Antarctica/South_Pole   Amundsen-Scott Station, South Pole
+AQ     -6734-06808     Antarctica/Rothera      Rothera Station, Adelaide Island
+AQ     -6448-06406     Antarctica/Palmer       Palmer Station, Anvers Island
+AQ     -6736+06253     Antarctica/Mawson       Mawson Station, Holme Bay
+AQ     -6835+07758     Antarctica/Davis        Davis Station, Vestfold Hills
+AQ     -6617+11031     Antarctica/Casey        Casey Station, Bailey Peninsula
+AQ     -7824+10654     Antarctica/Vostok       Vostok Station, S Magnetic Pole
+AQ     -6640+14001     Antarctica/DumontDUrville       Dumont-d'Urville Base, Terre Adelie
+AQ     -690022+0393524 Antarctica/Syowa        Syowa Station, E Ongul I
+AR     -3436-05827     America/Argentina/Buenos_Aires  Buenos Aires (BA, CF)
+AR     -3124-06411     America/Argentina/Cordoba       most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL)
+AR     -2411-06518     America/Argentina/Jujuy Jujuy (JY)
+AR     -2649-06513     America/Argentina/Tucuman       Tucuman (TM)
+AR     -2828-06547     America/Argentina/Catamarca     Catamarca (CT), Chubut (CH)
+AR     -2926-06651     America/Argentina/La_Rioja      La Rioja (LR)
+AR     -3132-06831     America/Argentina/San_Juan      San Juan (SJ)
+AR     -3253-06849     America/Argentina/Mendoza       Mendoza (MZ)
+AR     -5138-06913     America/Argentina/Rio_Gallegos  Santa Cruz (SC)
+AR     -5448-06818     America/Argentina/Ushuaia       Tierra del Fuego (TF)
+AS     -1416-17042     Pacific/Pago_Pago
+AT     +4813+01620     Europe/Vienna
+AU     -3133+15905     Australia/Lord_Howe     Lord Howe Island
+AU     -4253+14719     Australia/Hobart        Tasmania - most locations
+AU     -3956+14352     Australia/Currie        Tasmania - King Island
+AU     -3749+14458     Australia/Melbourne     Victoria
+AU     -3352+15113     Australia/Sydney        New South Wales - most locations
+AU     -3157+14127     Australia/Broken_Hill   New South Wales - Yancowinna
+AU     -2728+15302     Australia/Brisbane      Queensland - most locations
+AU     -2016+14900     Australia/Lindeman      Queensland - Holiday Islands
+AU     -3455+13835     Australia/Adelaide      South Australia
+AU     -1228+13050     Australia/Darwin        Northern Territory
+AU     -3157+11551     Australia/Perth Western Australia - most locations
+AU     -3143+12852     Australia/Eucla Western Australia - Eucla area
+AW     +1230-06858     America/Aruba
+AX     +6006+01957     Europe/Mariehamn
+AZ     +4023+04951     Asia/Baku
+BA     +4352+01825     Europe/Sarajevo
+BB     +1306-05937     America/Barbados
+BD     +2343+09025     Asia/Dhaka
+BE     +5050+00420     Europe/Brussels
+BF     +1222-00131     Africa/Ouagadougou
+BG     +4241+02319     Europe/Sofia
+BH     +2623+05035     Asia/Bahrain
+BI     -0323+02922     Africa/Bujumbura
+BJ     +0629+00237     Africa/Porto-Novo
+BM     +3217-06446     Atlantic/Bermuda
+BN     +0456+11455     Asia/Brunei
+BO     -1630-06809     America/La_Paz
+BR     -0351-03225     America/Noronha Atlantic islands
+BR     -0127-04829     America/Belem   Amapa, E Para
+BR     -0343-03830     America/Fortaleza       NE Brazil (MA, PI, CE, RN, PB)
+BR     -0803-03454     America/Recife  Pernambuco
+BR     -0712-04812     America/Araguaina       Tocantins
+BR     -0940-03543     America/Maceio  Alagoas, Sergipe
+BR     -1259-03831     America/Bahia   Bahia
+BR     -2332-04637     America/Sao_Paulo       S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS)
+BR     -2027-05437     America/Campo_Grande    Mato Grosso do Sul
+BR     -1535-05605     America/Cuiaba  Mato Grosso
+BR     -0846-06354     America/Porto_Velho     W Para, Rondonia
+BR     +0249-06040     America/Boa_Vista       Roraima
+BR     -0308-06001     America/Manaus  E Amazonas
+BR     -0640-06952     America/Eirunepe        W Amazonas
+BR     -0958-06748     America/Rio_Branco      Acre
+BS     +2505-07721     America/Nassau
+BT     +2728+08939     Asia/Thimphu
+BW     -2545+02555     Africa/Gaborone
+BY     +5354+02734     Europe/Minsk
+BZ     +1730-08812     America/Belize
+CA     +4734-05243     America/St_Johns        Newfoundland Time, including SE Labrador
+CA     +4439-06336     America/Halifax Atlantic Time - Nova Scotia (most places), PEI
+CA     +4612-05957     America/Glace_Bay       Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA     +4606-06447     America/Moncton Atlantic Time - New Brunswick
+CA     +5320-06025     America/Goose_Bay       Atlantic Time - Labrador - most locations
+CA     +5125-05707     America/Blanc-Sablon    Atlantic Standard Time - Quebec - Lower North Shore
+CA     +4531-07334     America/Montreal        Eastern Time - Quebec - most locations
+CA     +4339-07923     America/Toronto Eastern Time - Ontario - most locations
+CA     +4901-08816     America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA     +4823-08915     America/Thunder_Bay     Eastern Time - Thunder Bay, Ontario
+CA     +6344-06828     America/Iqaluit Eastern Time - east Nunavut - most locations
+CA     +6608-06544     America/Pangnirtung     Eastern Time - Pangnirtung, Nunavut
+CA     +744144-0944945 America/Resolute        Eastern Time - Resolute, Nunavut
+CA     +484531-0913718 America/Atikokan        Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut
+CA     +624900-0920459 America/Rankin_Inlet    Central Time - central Nunavut
+CA     +4953-09709     America/Winnipeg        Central Time - Manitoba & west Ontario
+CA     +4843-09434     America/Rainy_River     Central Time - Rainy River & Fort Frances, Ontario
+CA     +6903-10505     America/Cambridge_Bay   Central Time - west Nunavut
+CA     +5024-10439     America/Regina  Central Standard Time - Saskatchewan - most locations
+CA     +5017-10750     America/Swift_Current   Central Standard Time - Saskatchewan - midwest
+CA     +5333-11328     America/Edmonton        Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA     +6227-11421     America/Yellowknife     Mountain Time - central Northwest Territories
+CA     +682059-1334300 America/Inuvik  Mountain Time - west Northwest Territories
+CA     +5946-12014     America/Dawson_Creek    Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA     +4916-12307     America/Vancouver       Pacific Time - west British Columbia
+CA     +6043-13503     America/Whitehorse      Pacific Time - south Yukon
+CA     +6404-13925     America/Dawson  Pacific Time - north Yukon
+CC     -1210+09655     Indian/Cocos
+CD     -0418+01518     Africa/Kinshasa west Dem. Rep. of Congo
+CD     -1140+02728     Africa/Lubumbashi       east Dem. Rep. of Congo
+CF     +0422+01835     Africa/Bangui
+CG     -0416+01517     Africa/Brazzaville
+CH     +4723+00832     Europe/Zurich
+CI     +0519-00402     Africa/Abidjan
+CK     -2114-15946     Pacific/Rarotonga
+CL     -3327-07040     America/Santiago        most locations
+CL     -2709-10926     Pacific/Easter  Easter Island & Sala y Gomez
+CM     +0403+00942     Africa/Douala
+CN     +3114+12128     Asia/Shanghai   east China - Beijing, Guangdong, Shanghai, etc.
+CN     +4545+12641     Asia/Harbin     Heilongjiang (except Mohe), Jilin
+CN     +2934+10635     Asia/Chongqing  central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
+CN     +4348+08735     Asia/Urumqi     most of Tibet & Xinjiang
+CN     +3929+07559     Asia/Kashgar    west Tibet & Xinjiang
+CO     +0436-07405     America/Bogota
+CR     +0956-08405     America/Costa_Rica
+CU     +2308-08222     America/Havana
+CV     +1455-02331     Atlantic/Cape_Verde
+CX     -1025+10543     Indian/Christmas
+CY     +3510+03322     Asia/Nicosia
+CZ     +5005+01426     Europe/Prague
+DE     +5230+01322     Europe/Berlin
+DJ     +1136+04309     Africa/Djibouti
+DK     +5540+01235     Europe/Copenhagen
+DM     +1518-06124     America/Dominica
+DO     +1828-06954     America/Santo_Domingo
+DZ     +3647+00303     Africa/Algiers
+EC     -0210-07950     America/Guayaquil       mainland
+EC     -0054-08936     Pacific/Galapagos       Galapagos Islands
+EE     +5925+02445     Europe/Tallinn
+EG     +3003+03115     Africa/Cairo
+EH     +2709-01312     Africa/El_Aaiun
+ER     +1520+03853     Africa/Asmara
+ES     +4024-00341     Europe/Madrid   mainland
+ES     +3553-00519     Africa/Ceuta    Ceuta & Melilla
+ES     +2806-01524     Atlantic/Canary Canary Islands
+ET     +0902+03842     Africa/Addis_Ababa
+FI     +6010+02458     Europe/Helsinki
+FJ     -1808+17825     Pacific/Fiji
+FK     -5142-05751     Atlantic/Stanley
+FM     +0725+15147     Pacific/Truk    Truk (Chuuk) and Yap
+FM     +0658+15813     Pacific/Ponape  Ponape (Pohnpei)
+FM     +0519+16259     Pacific/Kosrae  Kosrae
+FO     +6201-00646     Atlantic/Faroe
+FR     +4852+00220     Europe/Paris
+GA     +0023+00927     Africa/Libreville
+GB     +512830-0001845 Europe/London
+GD     +1203-06145     America/Grenada
+GE     +4143+04449     Asia/Tbilisi
+GF     +0456-05220     America/Cayenne
+GG     +4927-00232     Europe/Guernsey
+GH     +0533-00013     Africa/Accra
+GI     +3608-00521     Europe/Gibraltar
+GL     +6411-05144     America/Godthab most locations
+GL     +7646-01840     America/Danmarkshavn    east coast, north of Scoresbysund
+GL     +7029-02158     America/Scoresbysund    Scoresbysund / Ittoqqortoormiit
+GL     +7634-06847     America/Thule   Thule / Pituffik
+GM     +1328-01639     Africa/Banjul
+GN     +0931-01343     Africa/Conakry
+GP     +1614-06132     America/Guadeloupe
+GQ     +0345+00847     Africa/Malabo
+GR     +3758+02343     Europe/Athens
+GS     -5416-03632     Atlantic/South_Georgia
+GT     +1438-09031     America/Guatemala
+GU     +1328+14445     Pacific/Guam
+GW     +1151-01535     Africa/Bissau
+GY     +0648-05810     America/Guyana
+HK     +2217+11409     Asia/Hong_Kong
+HN     +1406-08713     America/Tegucigalpa
+HR     +4548+01558     Europe/Zagreb
+HT     +1832-07220     America/Port-au-Prince
+HU     +4730+01905     Europe/Budapest
+ID     -0610+10648     Asia/Jakarta    Java & Sumatra
+ID     -0002+10920     Asia/Pontianak  west & central Borneo
+ID     -0507+11924     Asia/Makassar   east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor
+ID     -0232+14042     Asia/Jayapura   Irian Jaya & the Moluccas
+IE     +5320-00615     Europe/Dublin
+IL     +3146+03514     Asia/Jerusalem
+IM     +5409-00428     Europe/Isle_of_Man
+IN     +2232+08822     Asia/Calcutta
+IO     -0720+07225     Indian/Chagos
+IQ     +3321+04425     Asia/Baghdad
+IR     +3540+05126     Asia/Tehran
+IS     +6409-02151     Atlantic/Reykjavik
+IT     +4154+01229     Europe/Rome
+JE     +4912-00207     Europe/Jersey
+JM     +1800-07648     America/Jamaica
+JO     +3157+03556     Asia/Amman
+JP     +353916+1394441 Asia/Tokyo
+KE     -0117+03649     Africa/Nairobi
+KG     +4254+07436     Asia/Bishkek
+KH     +1133+10455     Asia/Phnom_Penh
+KI     +0125+17300     Pacific/Tarawa  Gilbert Islands
+KI     -0308-17105     Pacific/Enderbury       Phoenix Islands
+KI     +0152-15720     Pacific/Kiritimati      Line Islands
+KM     -1141+04316     Indian/Comoro
+KN     +1718-06243     America/St_Kitts
+KP     +3901+12545     Asia/Pyongyang
+KR     +3733+12658     Asia/Seoul
+KW     +2920+04759     Asia/Kuwait
+KY     +1918-08123     America/Cayman
+KZ     +4315+07657     Asia/Almaty     most locations
+KZ     +4448+06528     Asia/Qyzylorda  Qyzylorda (Kyzylorda, Kzyl-Orda)
+KZ     +5017+05710     Asia/Aqtobe     Aqtobe (Aktobe)
+KZ     +4431+05016     Asia/Aqtau      Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau)
+KZ     +5113+05121     Asia/Oral       West Kazakhstan
+LA     +1758+10236     Asia/Vientiane
+LB     +3353+03530     Asia/Beirut
+LC     +1401-06100     America/St_Lucia
+LI     +4709+00931     Europe/Vaduz
+LK     +0656+07951     Asia/Colombo
+LR     +0618-01047     Africa/Monrovia
+LS     -2928+02730     Africa/Maseru
+LT     +5441+02519     Europe/Vilnius
+LU     +4936+00609     Europe/Luxembourg
+LV     +5657+02406     Europe/Riga
+LY     +3254+01311     Africa/Tripoli
+MA     +3339-00735     Africa/Casablanca
+MC     +4342+00723     Europe/Monaco
+MD     +4700+02850     Europe/Chisinau
+ME     +4226+01916     Europe/Podgorica
+MG     -1855+04731     Indian/Antananarivo
+MH     +0709+17112     Pacific/Majuro  most locations
+MH     +0905+16720     Pacific/Kwajalein       Kwajalein
+MK     +4159+02126     Europe/Skopje
+ML     +1239-00800     Africa/Bamako
+MM     +1647+09610     Asia/Rangoon
+MN     +4755+10653     Asia/Ulaanbaatar        most locations
+MN     +4801+09139     Asia/Hovd       Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
+MN     +4804+11430     Asia/Choibalsan Dornod, Sukhbaatar
+MO     +2214+11335     Asia/Macau
+MP     +1512+14545     Pacific/Saipan
+MQ     +1436-06105     America/Martinique
+MR     +1806-01557     Africa/Nouakchott
+MS     +1643-06213     America/Montserrat
+MT     +3554+01431     Europe/Malta
+MU     -2010+05730     Indian/Mauritius
+MV     +0410+07330     Indian/Maldives
+MW     -1547+03500     Africa/Blantyre
+MX     +1924-09909     America/Mexico_City     Central Time - most locations
+MX     +2105-08646     America/Cancun  Central Time - Quintana Roo
+MX     +2058-08937     America/Merida  Central Time - Campeche, Yucatan
+MX     +2540-10019     America/Monterrey       Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas
+MX     +2313-10625     America/Mazatlan        Mountain Time - S Baja, Nayarit, Sinaloa
+MX     +2838-10605     America/Chihuahua       Mountain Time - Chihuahua
+MX     +2904-11058     America/Hermosillo      Mountain Standard Time - Sonora
+MX     +3232-11701     America/Tijuana Pacific Time
+MY     +0310+10142     Asia/Kuala_Lumpur       peninsular Malaysia
+MY     +0133+11020     Asia/Kuching    Sabah & Sarawak
+MZ     -2558+03235     Africa/Maputo
+NA     -2234+01706     Africa/Windhoek
+NC     -2216+16530     Pacific/Noumea
+NE     +1331+00207     Africa/Niamey
+NF     -2903+16758     Pacific/Norfolk
+NG     +0627+00324     Africa/Lagos
+NI     +1209-08617     America/Managua
+NL     +5222+00454     Europe/Amsterdam
+NO     +5955+01045     Europe/Oslo
+NP     +2743+08519     Asia/Katmandu
+NR     -0031+16655     Pacific/Nauru
+NU     -1901+16955     Pacific/Niue
+NZ     -3652+17446     Pacific/Auckland        most locations
+NZ     -4357-17633     Pacific/Chatham Chatham Islands
+OM     +2336+05835     Asia/Muscat
+PA     +0858-07932     America/Panama
+PE     -1203-07703     America/Lima
+PF     -1732-14934     Pacific/Tahiti  Society Islands
+PF     -0900-13930     Pacific/Marquesas       Marquesas Islands
+PF     -2308-13457     Pacific/Gambier Gambier Islands
+PG     -0930+14710     Pacific/Port_Moresby
+PH     +1435+12100     Asia/Manila
+PK     +2452+06703     Asia/Karachi
+PL     +5215+02100     Europe/Warsaw
+PM     +4703-05620     America/Miquelon
+PN     -2504-13005     Pacific/Pitcairn
+PR     +182806-0660622 America/Puerto_Rico
+PS     +3130+03428     Asia/Gaza
+PT     +3843-00908     Europe/Lisbon   mainland
+PT     +3238-01654     Atlantic/Madeira        Madeira Islands
+PT     +3744-02540     Atlantic/Azores Azores
+PW     +0720+13429     Pacific/Palau
+PY     -2516-05740     America/Asuncion
+QA     +2517+05132     Asia/Qatar
+RE     -2052+05528     Indian/Reunion
+RO     +4426+02606     Europe/Bucharest
+RS     +4450+02030     Europe/Belgrade
+RU     +5443+02030     Europe/Kaliningrad      Moscow-01 - Kaliningrad
+RU     +5545+03735     Europe/Moscow   Moscow+00 - west Russia
+RU     +4844+04425     Europe/Volgograd        Moscow+00 - Caspian Sea
+RU     +5312+05009     Europe/Samara   Moscow+01 - Samara, Udmurtia
+RU     +5651+06036     Asia/Yekaterinburg      Moscow+02 - Urals
+RU     +5500+07324     Asia/Omsk       Moscow+03 - west Siberia
+RU     +5502+08255     Asia/Novosibirsk        Moscow+03 - Novosibirsk
+RU     +5601+09250     Asia/Krasnoyarsk        Moscow+04 - Yenisei River
+RU     +5216+10420     Asia/Irkutsk    Moscow+05 - Lake Baikal
+RU     +6200+12940     Asia/Yakutsk    Moscow+06 - Lena River
+RU     +4310+13156     Asia/Vladivostok        Moscow+07 - Amur River
+RU     +4658+14242     Asia/Sakhalin   Moscow+07 - Sakhalin Island
+RU     +5934+15048     Asia/Magadan    Moscow+08 - Magadan
+RU     +5301+15839     Asia/Kamchatka  Moscow+09 - Kamchatka
+RU     +6445+17729     Asia/Anadyr     Moscow+10 - Bering Sea
+RW     -0157+03004     Africa/Kigali
+SA     +2438+04643     Asia/Riyadh
+SB     -0932+16012     Pacific/Guadalcanal
+SC     -0440+05528     Indian/Mahe
+SD     +1536+03232     Africa/Khartoum
+SE     +5920+01803     Europe/Stockholm
+SG     +0117+10351     Asia/Singapore
+SH     -1555-00542     Atlantic/St_Helena
+SI     +4603+01431     Europe/Ljubljana
+SJ     +7800+01600     Arctic/Longyearbyen     Svalbard
+SJ     +7059-00805     Atlantic/Jan_Mayen      Jan Mayen
+SK     +4809+01707     Europe/Bratislava
+SL     +0830-01315     Africa/Freetown
+SM     +4355+01228     Europe/San_Marino
+SN     +1440-01726     Africa/Dakar
+SO     +0204+04522     Africa/Mogadishu
+SR     +0550-05510     America/Paramaribo
+ST     +0020+00644     Africa/Sao_Tome
+SV     +1342-08912     America/El_Salvador
+SY     +3330+03618     Asia/Damascus
+SZ     -2618+03106     Africa/Mbabane
+TC     +2128-07108     America/Grand_Turk
+TD     +1207+01503     Africa/Ndjamena
+TF     -492110+0701303 Indian/Kerguelen
+TG     +0608+00113     Africa/Lome
+TH     +1345+10031     Asia/Bangkok
+TJ     +3835+06848     Asia/Dushanbe
+TK     -0922-17114     Pacific/Fakaofo
+TL     -0833+12535     Asia/Dili
+TM     +3757+05823     Asia/Ashgabat
+TN     +3648+01011     Africa/Tunis
+TO     -2110+17510     Pacific/Tongatapu
+TR     +4101+02858     Europe/Istanbul
+TT     +1039-06131     America/Port_of_Spain
+TV     -0831+17913     Pacific/Funafuti
+TW     +2503+12130     Asia/Taipei
+TZ     -0648+03917     Africa/Dar_es_Salaam
+UA     +5026+03031     Europe/Kiev     most locations
+UA     +4837+02218     Europe/Uzhgorod Ruthenia
+UA     +4750+03510     Europe/Zaporozhye       Zaporozh'ye, E Lugansk
+UA     +4457+03406     Europe/Simferopol       central Crimea
+UG     +0019+03225     Africa/Kampala
+UM     +1700-16830     Pacific/Johnston        Johnston Atoll
+UM     +2813-17722     Pacific/Midway  Midway Islands
+UM     +1917+16637     Pacific/Wake    Wake Island
+US     +404251-0740023 America/New_York        Eastern Time
+US     +421953-0830245 America/Detroit Eastern Time - Michigan - most locations
+US     +381515-0854534 America/Kentucky/Louisville     Eastern Time - Kentucky - Louisville area
+US     +364947-0845057 America/Kentucky/Monticello     Eastern Time - Kentucky - Wayne County
+US     +394606-0860929 America/Indiana/Indianapolis    Eastern Time - Indiana - most locations
+US     +411745-0863730 America/Indiana/Knox    Eastern Time - Indiana - Starke County
+US     +410305-0863611 America/Indiana/Winamac Eastern Time - Indiana - Pulaski County
+US     +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County
+US     +384452-0850402 America/Indiana/Vevay   Eastern Time - Indiana - Switzerland County
+US     +415100-0873900 America/Chicago Central Time
+US     +384038-0873143 America/Indiana/Vincennes       Central Time - Indiana - Daviess, Dubois, Knox, Martin & Perry Counties
+US     +382931-0871643 America/Indiana/Petersburg      Central Time - Indiana - Pike County
+US     +450628-0873651 America/Menominee       Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties
+US     +470659-1011757 America/North_Dakota/Center     Central Time - North Dakota - Oliver County
+US     +465042-1012439 America/North_Dakota/New_Salem  Central Time - North Dakota - Morton County (except Mandan area)
+US     +394421-1045903 America/Denver  Mountain Time
+US     +433649-1161209 America/Boise   Mountain Time - south Idaho & east Oregon
+US     +364708-1084111 America/Shiprock        Mountain Time - Navajo
+US     +332654-1120424 America/Phoenix Mountain Standard Time - Arizona
+US     +340308-1181434 America/Los_Angeles     Pacific Time
+US     +611305-1495401 America/Anchorage       Alaska Time
+US     +581807-1342511 America/Juneau  Alaska Time - Alaska panhandle
+US     +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck
+US     +643004-1652423 America/Nome    Alaska Time - west Alaska
+US     +515248-1763929 America/Adak    Aleutian Islands
+US     +211825-1575130 Pacific/Honolulu        Hawaii
+UY     -3453-05611     America/Montevideo
+UZ     +3940+06648     Asia/Samarkand  west Uzbekistan
+UZ     +4120+06918     Asia/Tashkent   east Uzbekistan
+VA     +4154+01227     Europe/Vatican
+VC     +1309-06114     America/St_Vincent
+VE     +1030-06656     America/Caracas
+VG     +1827-06437     America/Tortola
+VI     +1821-06456     America/St_Thomas
+VN     +1045+10640     Asia/Saigon
+VU     -1740+16825     Pacific/Efate
+WF     -1318-17610     Pacific/Wallis
+WS     -1350-17144     Pacific/Apia
+YE     +1245+04512     Asia/Aden
+YT     -1247+04514     Indian/Mayotte
+ZA     -2615+02800     Africa/Johannesburg
+ZM     -1525+02817     Africa/Lusaka
+ZW     -1750+03103     Africa/Harare