From cfc8dcb49aefe4ebbe0d1f90d72d18627c85fee5 Mon Sep 17 00:00:00 2001
From: christos
Date: Fri, 4 May 2018 15:51:00 +0000
Subject: [PATCH] Merge 2018e
Changes to code
zic now accepts subsecond precision in expressions like
00:19:32.13, which is approximately the legal time of the
Netherlands from 1835 to 1937. However, because it is
questionable whether the few recorded uses of non-integer offsets
had subsecond precision in practice, there are no plans for tzdata
to use this feature. (Thanks to Steve Allen for pointing out
the limitations of historical data in this area.)
The code is a bit more portable to MS-Windows. Installers can
compile with -DRESERVE_STD_EXT_IDS on MS-Windows platforms that
reserve identifiers like 'localtime'. (Thanks to Manuela
Friedrich).
Changes to documentation and commentary
theory.html now outlines tzdb's extensions to POSIX's model for
civil time, and has a section "POSIX features no longer needed"
that lists POSIX API components that are now vestigial.
(From suggestions by Steve Summit.) It also better distinguishes
time zones from tz regions. (From a suggestion by Guy Harris.)
Commentary is now more consistent about using the phrase "daylight
saving time", to match the C name tm_isdst. Daylight saving time
need not occur in summer, and need not have a positive offset from
standard time.
Commentary about historical transitions in Uruguay has been expanded
with links to many relevant legal documents.
(Thanks to Tim Parenti.)
Commentary now uses some non-ASCII characters with Unicode value
less than U+0100, as they can be useful and should work even with
older editors such as XEmacs.
---
lib/libc/time/CONTRIBUTING | 12 +-
lib/libc/time/Makefile | 176 +-
lib/libc/time/NEWS | 209 ++-
lib/libc/time/asctime.c | 16 +-
lib/libc/time/ctime.3 | 13 +-
lib/libc/time/localtime.c | 30 +-
lib/libc/time/private.h | 38 +-
lib/libc/time/strftime.c | 6 +-
lib/libc/time/theory.html | 1746 +++++++++++--------
lib/libc/time/{tz-art.htm => tz-art.html} | 40 +-
lib/libc/time/{tz-link.htm => tz-link.html} | 144 +-
lib/libc/time/tzset.3 | 52 +-
lib/libc/time/version | 2 +-
lib/libc/time/zdump.c | 16 +-
lib/libc/time/zic.8 | 39 +-
lib/libc/time/zic.c | 109 +-
16 files changed, 1652 insertions(+), 996 deletions(-)
rename lib/libc/time/{tz-art.htm => tz-art.html} (93%)
rename lib/libc/time/{tz-link.htm => tz-link.html} (89%)
diff --git a/lib/libc/time/CONTRIBUTING b/lib/libc/time/CONTRIBUTING
index 449738f7e2d5..4d84a760a754 100644
--- a/lib/libc/time/CONTRIBUTING
+++ b/lib/libc/time/CONTRIBUTING
@@ -25,7 +25,8 @@ justification. Citations should use https: URLs if available.
Please submit changes against either the latest release in
or the master branch of the development
-repository. If you use Git the following workflow may be helpful:
+repository. The latter is preferred. If you use Git the following
+workflow may be helpful:
* Copy the development repository.
@@ -42,6 +43,12 @@ repository. If you use Git the following workflow may be helpful:
git checkout -b mybranch
+ * Sleuth by using 'git blame'. For example, when fixing data for
+ Africa/Sao_Tome, if the command 'git blame africa' outputs a line
+ '2951fa3b (Paul Eggert 2018-01-08 09:03:13 -0800 1068) Zone
+ Africa/Sao_Tome 0:26:56 - LMT 1884', commit 2951fa3b should
+ provide some justification for the 'Zone Africa/Sao_Tome' line.
+
* Edit source files. Include commentary that justifies the
changes by citing reliable sources.
@@ -67,6 +74,9 @@ repository. If you use Git the following workflow may be helpful:
git send-email master
+ For an archived example of such an email, see
+ .
+
* Start anew by getting current with the master branch again
(the second step above).
diff --git a/lib/libc/time/Makefile b/lib/libc/time/Makefile
index 4f448d2b49c6..21fa4889a3e7 100644
--- a/lib/libc/time/Makefile
+++ b/lib/libc/time/Makefile
@@ -10,9 +10,18 @@ VERSION= unknown
# Email address for bug reports.
BUGEMAIL= tz@iana.org
+# Choose source data features. To get new features right away, use:
+# DATAFORM= vanguard
+# To wait a while before using new features, to give downstream users
+# time to upgrade zic (the default), use:
+# DATAFORM= main
+# To wait even longer for new features, use:
+# DATAFORM= rearguard
+DATAFORM= main
+
# 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
+# Alternatively, if you discover you've got the wrong time zone, you can just
# zic -l rightzone
# to correct things.
# Use the command
@@ -25,11 +34,11 @@ LOCALTIME= GMT
# 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
+# 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 UT offsets of standard and
-# summer time.)
-# Alternately, if you discover you've got the wrong time zone, you can just
+# daylight saving time.
+# Alternatively, if you discover you've got the wrong time zone, you can just
# zic -p rightzone
# to correct things.
# Use the command
@@ -189,13 +198,18 @@ LDLIBS=
# -DHAVE_STDINT_H if you have a non-C99 compiler with
# -DHAVE_STRFTIME_L if declares locale_t and strftime_l
# -DHAVE_STRDUP=0 if your system lacks the strdup function
+# -DHAVE_STRTOLL=0 if your system lacks the strtoll function
# -DHAVE_SYMLINK=0 if your system lacks the symlink function
# -DHAVE_SYS_STAT_H=0 if your compiler lacks a
# -DHAVE_SYS_WAIT_H=0 if your compiler lacks a
# -DHAVE_TZSET=0 if your system lacks a tzset function
# -DHAVE_UNISTD_H=0 if your compiler lacks a
# -Dlocale_t=XXX if your system uses XXX instead of locale_t
+# -DRESERVE_STD_EXT_IDS if your platform reserves standard identifiers
+# with external linkage, e.g., applications cannot define 'localtime'.
# -Dssize_t=long on hosts like MS-Windows that lack ssize_t
+# -DSUPPRESS_TZDIR to not prepend TZDIR to file names; this has
+# security implications and is not recommended for general use
# -DTHREAD_SAFE to make localtime.c thread-safe, as POSIX requires;
# not needed by the main-program tz code, which is single-threaded.
# Append other compiler flags as needed, e.g., -pthread on GNU/Linux.
@@ -222,14 +236,16 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
$(GCC_INSTRUMENT) \
-Wall -Wextra \
-Walloc-size-larger-than=100000 -Warray-bounds=2 \
- -Wbad-function-cast -Wcast-align -Wdate-time \
+ -Wbad-function-cast -Wcast-align=strict -Wdate-time \
-Wdeclaration-after-statement -Wdouble-promotion \
-Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \
-Winit-self -Wjump-misses-init -Wlogical-op \
-Wmissing-declarations -Wmissing-prototypes -Wnested-externs \
-Wold-style-definition -Woverlength-strings -Wpointer-arith \
- -Wshadow -Wshift-overflow=2 -Wstrict-prototypes -Wstringop-overflow=5 \
+ -Wshadow -Wshift-overflow=2 -Wstrict-prototypes -Wstringop-overflow=4 \
+ -Wstringop-truncation -Wsuggest-attribute=cold \
-Wsuggest-attribute=const -Wsuggest-attribute=format \
+ -Wsuggest-attribute=malloc \
-Wsuggest-attribute=noreturn -Wsuggest-attribute=pure \
-Wtrampolines -Wundef -Wuninitialized -Wunused \
-Wvariadic-macros -Wvla -Wwrite-strings \
@@ -394,13 +410,19 @@ SAFE_CHARSET3= 'abcdefghijklmnopqrstuvwxyz{|}~'
SAFE_CHARSET= $(SAFE_CHARSET1)$(SAFE_CHARSET2)$(SAFE_CHARSET3)
SAFE_CHAR= '[]'$(SAFE_CHARSET)'-]'
+# Non-ASCII non-letters that OK_CHAR allows, as these characters are
+# useful in commentary. XEmacs 21.5.34 displays them correctly,
+# presumably because they are Latin-1.
+UNUSUAL_OK_CHARSET= °±½¾×
+
# OK_CHAR matches any character allowed in the distributed files.
-# This is the same as SAFE_CHAR, except that multibyte letters are
-# also allowed so that commentary can contain people's names and quote
-# non-English sources. For non-letters the sources are limited to
-# ASCII renderings for the convenience of maintainers whose text editors
-# mishandle UTF-8 by default (e.g., XEmacs 21.4.22).
-OK_CHAR= '[][:alpha:]'$(SAFE_CHARSET)'-]'
+# This is the same as SAFE_CHAR, except that UNUSUAL_OK_CHARSET and
+# multibyte letters are also allowed so that commentary can contain a
+# few safe symbols and people's names and can quote non-English sources.
+# Other non-letters are limited to ASCII renderings for the
+# convenience of maintainers using XEmacs 21.5.34, which by default
+# mishandles Unicode characters U+0100 and greater.
+OK_CHAR= '[][:alpha:]$(UNUSUAL_OK_CHARSET)'$(SAFE_CHARSET)'-]'
# SAFE_LINE matches a line of safe characters.
# SAFE_SHARP_LINE is similar, except any OK character can follow '#';
@@ -462,10 +484,12 @@ TDATA= $(YDATA) $(NDATA) $(BACKWARD)
ZONETABLES= zone1970.tab zone.tab
TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)
LEAP_DEPS= leapseconds.awk leap-seconds.list
-TZDATA_ZI_DEPS= zishrink.awk version $(TDATA) $(PACKRATDATA)
+TZDATA_ZI_DEPS= ziguard.awk zishrink.awk version $(TDATA) $(PACKRATDATA)
+DSTDATA_ZI_DEPS= ziguard.awk $(TDATA) $(PACKRATDATA)
DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \
leapseconds yearistype.sh $(ZONETABLES)
-AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk zishrink.awk
+AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk \
+ ziguard.awk zishrink.awk
MISC= $(AWK_SCRIPTS) zoneinfo2tdf.pl
TZS_YEAR= 2050
TZS= to$(TZS_YEAR).tzs
@@ -492,6 +516,7 @@ VERSION_DEPS= \
tzfile.5 tzfile.h tzselect.8 tzselect.ksh \
workman.sh yearistype.sh \
zdump.8 zdump.c zic.8 zic.c \
+ ziguard.awk zishrink.awk \
zone.tab zone1970.tab zoneinfo2tdf.pl
# And for the benefit of csh users on systems that assume the user
@@ -499,7 +524,8 @@ VERSION_DEPS= \
SHELL= /bin/sh
-all: tzselect yearistype zic zdump libtz.a $(TABDATA)
+all: tzselect yearistype zic zdump libtz.a $(TABDATA) \
+ vanguard.zi main.zi rearguard.zi
ALL: all date $(ENCHILADA)
@@ -534,11 +560,15 @@ version: $(VERSION_DEPS)
printf '%s\n' "$$V" >$@.out
mv $@.out $@
-# This file can be tailored by setting BACKWARD, PACKRATDATA, etc.
-tzdata.zi: $(TZDATA_ZI_DEPS)
+# These files can be tailored by setting BACKWARD, PACKRATDATA, etc.
+vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
+ $(AWK) -v DATAFORM=`expr $@ : '\(.*\).zi'` -f ziguard.awk \
+ $(TDATA) $(PACKRATDATA) >$@.out
+ mv $@.out $@
+tzdata.zi: $(DATAFORM).zi version
version=`sed 1q version` && \
LC_ALL=C $(AWK) -v version="$$version" -f zishrink.awk \
- $(TDATA) $(PACKRATDATA) >$@.out
+ $(DATAFORM).zi >$@.out
mv $@.out $@
version.h: version
@@ -614,19 +644,29 @@ posix_packrat:
zones: $(REDO)
+# dummy.zd is not a real file; it is mentioned here only so that the
+# top-level 'make' does not have a syntax error.
+ZDS = dummy.zd
+# Rule used only by submakes invoked by the $(TZS_NEW) rule.
+# It is separate so that GNU 'make -j' can run instances in parallel.
+$(ZDS): zdump
+ ./zdump -i -c $(TZS_YEAR) '$(wd)/'$$(expr $@ : '\(.*\).zd') >$@
+
$(TZS_NEW): tzdata.zi zdump zic
- mkdir -p tzs.dir
+ rm -fr tzs.dir
+ mkdir tzs.dir
$(zic) -d tzs.dir tzdata.zi
$(AWK) '/^L/{print "Link\t" $$2 "\t" $$3}' \
tzdata.zi | LC_ALL=C sort >$@.out
wd=`pwd` && \
- zones=`$(AWK) -v wd="$$wd" \
- '/^Z/{print wd "/tzs.dir/" $$2}' tzdata.zi \
- | LC_ALL=C sort` && \
- ./zdump -i -c $(TZS_YEAR) $$zones >>$@.out
- sed 's,^TZ=".*tzs\.dir/,TZ=",' $@.out >$@.sed.out
- rm -fr tzs.dir $@.out
- mv $@.sed.out $@
+ set x `$(AWK) '/^Z/{print "tzs.dir/" $$2 ".zd"}' tzdata.zi \
+ | LC_ALL=C sort -t . -k 2,2` && \
+ shift && \
+ ZDS=$$* && \
+ $(MAKE) wd="$$wd" TZS_YEAR=$(TZS_YEAR) ZDS="$$ZDS" $$ZDS && \
+ sed 's,^TZ=".*tzs\.dir/,TZ=",' $$ZDS >>$@.out
+ rm -fr tzs.dir
+ mv $@.out $@
# If $(TZS) does not already exist (e.g., old-format tarballs), create it.
# If it exists but 'make check_tzs' fails, a maintainer should inspect the
@@ -669,8 +709,10 @@ check_character_set: $(ENCHILADA)
sharp='#' && \
! grep -Env $(SAFE_LINE) $(MANS) date.1 $(MANTXTS) \
$(MISC) $(SOURCES) $(WEB_PAGES) \
- CONTRIBUTING LICENSE Makefile README \
+ CONTRIBUTING LICENSE README \
version tzdata.zi && \
+ ! grep -Env $(SAFE_LINE)'|^UNUSUAL_OK_CHARSET='$(OK_CHAR)'*$$' \
+ Makefile && \
! grep -Env $(SAFE_SHARP_LINE) $(TDATA_TO_CHECK) backzone \
leapseconds yearistype.sh zone.tab && \
! grep -Env $(OK_LINE) $(ENCHILADA); \
@@ -702,7 +744,7 @@ check_sorted: backward backzone iso3166.tab zone.tab zone1970.tab
$(AWK) '/^[^#]/ $(CHECK_CC_LIST)' zone1970.tab | \
LC_ALL=C sort -cu
-check_links: checklinks.awk $(TDATA_TO_CHECK)
+check_links: checklinks.awk $(TDATA_TO_CHECK) tzdata.zi
$(AWK) -f checklinks.awk $(TDATA_TO_CHECK)
$(AWK) -f checklinks.awk tzdata.zi
@@ -720,17 +762,26 @@ check_tzs: $(TZS) $(TZS_NEW)
check_web: tz-how-to.html
$(VALIDATE_ENV) $(VALIDATE) $(VALIDATE_FLAGS) tz-how-to.html
-# Check that tzdata.zi generates the same binary data that its sources do.
-check_zishrink: tzdata.zi zic leapseconds $(PACKRATDATA) $(TDATA)
+# Check that zishrink.awk does not alter the data, and that ziguard.awk
+# preserves main-format data.
+check_zishrink: zic leapseconds $(PACKRATDATA) $(TDATA) \
+ $(DATAFORM).zi tzdata.zi
for type in posix right; do \
- mkdir -p time_t.dir/$$type time_t.dir/$$type-shrunk && \
+ mkdir -p time_t.dir/$$type time_t.dir/$$type-t \
+ time_t.dir/$$type-shrunk && \
case $$type in \
right) leap='-L leapseconds';; \
*) leap=;; \
esac && \
- $(ZIC) $$leap -d time_t.dir/$$type $(TDATA) && \
- $(AWK) '/^Rule/' $(TDATA) | \
- $(ZIC) $$leap -d time_t.dir/$$type - $(PACKRATDATA) && \
+ $(ZIC) $$leap -d time_t.dir/$$type $(DATAFORM).zi && \
+ case $(DATAFORM) in \
+ main) \
+ $(ZIC) $$leap -d time_t.dir/$$type-t $(TDATA) && \
+ $(AWK) '/^Rule/' $(TDATA) | \
+ $(ZIC) $$leap -d time_t.dir/$$type-t - \
+ $(PACKRATDATA) && \
+ diff -r time_t.dir/$$type time_t.dir/$$type-t;; \
+ esac && \
$(ZIC) $$leap -d time_t.dir/$$type-shrunk tzdata.zi && \
diff -r time_t.dir/$$type time_t.dir/$$type-shrunk || exit; \
done
@@ -740,7 +791,7 @@ clean_misc:
rm -f core *.o *.out \
date tzselect version.h zdump zic yearistype libtz.a
clean: clean_misc
- rm -fr *.dir tzdata.zi tzdb-*/ $(TZS_NEW)
+ rm -fr *.dir *.zi tzdb-*/ $(TZS_NEW)
maintainer-clean: clean
@echo 'This command is intended for maintainers to use; it'
@@ -852,16 +903,27 @@ check_time_t_alternatives:
done
rm -fr time_t.dir
+TRADITIONAL_ASC = \
+ tzcode$(VERSION).tar.gz.asc \
+ tzdata$(VERSION).tar.gz.asc
+ALL_ASC = $(TRADITIONAL_ASC) \
+ tzdata$(VERSION)-rearguard.tar.gz.asc \
+ tzdb-$(VERSION).tar.lz.asc
+
tarballs traditional_tarballs signatures traditional_signatures: version
VERSION=`cat version` && \
$(MAKE) VERSION="$$VERSION" $@_version
-tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz
+# These *_version rules are intended for use if VERSION is set by some
+# other means. Ordinarily these rules are used only by the above
+# non-_version rules, which set VERSION on the 'make' command line.
+tarballs_version: traditional_tarballs_version \
+ tzdata$(VERSION)-rearguard.tar.gz \
+ tzdb-$(VERSION).tar.lz
traditional_tarballs_version: \
tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz
-signatures_version: traditional_signatures_version tzdb-$(VERSION).tar.lz.asc
-traditional_signatures_version: \
- tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc \
+signatures_version: $(ALL_ASC)
+traditional_signatures_version: $(TRADITIONAL_ASC)
tzcode$(VERSION).tar.gz: set-timestamps.out
LC_ALL=C && export LC_ALL && \
@@ -876,6 +938,26 @@ tzdata$(VERSION).tar.gz: set-timestamps.out
gzip $(GZIPFLAGS) >$@.out
mv $@.out $@
+tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out
+ rm -fr tzdata$(VERSION)-rearguard.dir
+ mkdir tzdata$(VERSION)-rearguard.dir
+ ln $(COMMON) $(DATA) $(MISC) tzdata$(VERSION)-rearguard.dir
+ cd tzdata$(VERSION)-rearguard.dir && \
+ rm -f $(TDATA) $(PACKRATDATA) version
+ for f in $(TDATA) $(PACKRATDATA); do \
+ rearf=tzdata$(VERSION)-rearguard.dir/$$f; \
+ $(AWK) -v DATAFORM=rearguard -f ziguard.awk $$f >$$rearf && \
+ touch -cmr `ls -t ziguard.awk $$f` $$rearf || exit; \
+ done
+ sed '1s/$$/-rearguard/' \
+ tzdata$(VERSION)-rearguard.dir/version
+ touch -cmr version tzdata$(VERSION)-rearguard.dir/version
+ LC_ALL=C && export LC_ALL && \
+ (cd tzdata$(VERSION)-rearguard.dir && \
+ tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \
+ gzip $(GZIPFLAGS)) >$@.out
+ mv $@.out $@
+
tzdb-$(VERSION).tar.lz: set-timestamps.out
rm -fr tzdb-$(VERSION)
mkdir tzdb-$(VERSION)
@@ -886,12 +968,10 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out
mv $@.out $@
tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
- gpg --armor --detach-sign $?
-
tzdata$(VERSION).tar.gz.asc: tzdata$(VERSION).tar.gz
- gpg --armor --detach-sign $?
-
+tzdata$(VERSION)-rearguard.tar.gz.asc: tzdata$(VERSION)-rearguard.tar.gz
tzdb-$(VERSION).tar.lz.asc: tzdb-$(VERSION).tar.lz
+$(ALL_ASC):
gpg --armor --detach-sign $?
typecheck:
@@ -917,13 +997,17 @@ zic.o: private.h tzfile.h version.h
.KEEP_STATE:
.PHONY: ALL INSTALL all
-.PHONY: check check_character_set check_links
+.PHONY: check check_character_set check_links check_name_lengths
.PHONY: check_public check_sorted check_tables
.PHONY: check_time_t_alternatives check_tzs check_web check_white_space
.PHONY: check_zishrink
-.PHONY: clean clean_misc force_tzs
+.PHONY: clean clean_misc dummy.zd force_tzs
.PHONY: install install_data maintainer-clean names
.PHONY: posix_only posix_packrat posix_right
.PHONY: public right_only right_posix signatures signatures_version
-.PHONY: tarballs tarballs_version typecheck
+.PHONY: tarballs tarballs_version
+.PHONY: traditional_signatures traditional_signatures_version
+.PHONY: traditional_tarballs traditional_tarballs_version
+.PHONY: typecheck
.PHONY: zonenames zones
+.PHONY: $(ZDS)
diff --git a/lib/libc/time/NEWS b/lib/libc/time/NEWS
index 2bd0aa84143f..9c445cd0be87 100644
--- a/lib/libc/time/NEWS
+++ b/lib/libc/time/NEWS
@@ -1,9 +1,210 @@
News for the tz database
+Release 2018e - 2018-05-01 23:42:51 -0700
+
+ Briefly:
+
+ North Korea switches back to +09 on 2018-05-05.
+ The main format uses negative DST again, for Ireland etc.
+ 'make tarballs' now also builds a rearguard tarball.
+ New 's' and 'd' suffixes in SAVE columns of Rule and Zone lines.
+
+ Changes to past and future time stamps
+
+ North Korea switches back from +0830 to +09 on 2018-05-05.
+ (Thanks to Kang Seonghoon, Arthur David Olson, Seo Sanghyeon,
+ and Tim Parenti.)
+
+ Bring back the negative-DST changes of 2018a, except be more
+ compatible with data parsers that do not support negative DST.
+ Also, this now affects historical time stamps in Namibia and the
+ former Czechoslovakia, not just Ireland. The main format now uses
+ negative DST to model time stamps in Europe/Dublin (from 1971 on),
+ Europe/Prague (1946/7), and Africa/Windhoek (1994/2017). This
+ does not affect UT offsets, only time zone abbreviations and the
+ tm_isdst flag. Also, this does not affect rearguard or vanguard
+ formats; effectively the main format now uses vanguard instead of
+ rearguard format. Data parsers that do not support negative DST
+ can still use data from the rearguard tarball described below.
+
+ Changes to build procedure
+
+ The command 'make tarballs' now also builds the tarball
+ tzdataVERSION-rearguard.tar.gz, which is like tzdataVERSION.tar.gz
+ except that it uses rearguard format intended for trailing-edge
+ data parsers.
+
+ Changes to data format and to code
+
+ The SAVE column of Rule and Zone lines can now have an 's' or 'd'
+ suffix, which specifies whether the adjusted time is standard time
+ or daylight saving time. If no suffix is given, daylight saving
+ time is used if and only if the SAVE column is nonzero; this is
+ the longstanding behavior. Although this new feature is not used
+ in tzdata, it could be used to specify the legal time in Namibia
+ 1994-2017, as opposed to the popular time (see below).
+
+ Changes to past time stamps
+
+ From 1994 through 2017 Namibia observed DST in winter, not summer.
+ That is, it used negative DST, as Ireland still does. This change
+ does not affect UTC offsets; it affects only the tm_isdst flag and
+ the abbreviation used during summer, which is now CAT, not WAST.
+ Although (as noted by Michael Deckers) summer and winter time were
+ both simply called "standard time" in Namibian law, in common
+ practice winter time was considered to be DST (as noted by Stephen
+ Colebourne). The full effect of this change is only in vanguard
+ format; in rearguard and main format, the tm_isdst flag is still
+ zero in winter and nonzero in summer.
+
+ In 1946/7 Czechoslovakia also observed negative DST in winter.
+ The full effect of this change is only in vanguard format; in
+ rearguard and main formats, it is modeled as plain GMT without
+ daylight saving. Also, the dates of some 1944/5 DST transitions
+ in Czechoslovakia have been changed.
+
+
+Release 2018d - 2018-03-22 07:05:46 -0700
+
+ Briefly:
+
+ Palestine starts DST a week earlier in 2018.
+ Add support for vanguard and rearguard data consumers.
+ Add subsecond precision to source data format, though not to data.
+
+ Changes to future time stamps
+
+ In 2018, Palestine starts DST on March 24, not March 31.
+ Adjust future predictions accordingly. (Thanks to Sharef Mustafa.)
+
+ Changes to past and future time stamps
+
+ Casey Station in Antarctica changed from +11 to +08 on 2018-03-11
+ at 04:00. (Thanks to Steffen Thorsen.)
+
+ Changes to past time stamps
+
+ Historical transitions for Uruguay, represented by
+ America/Montevideo, have been updated per official legal documents,
+ replacing previous data mainly originating from the inventions of
+ Shanks & Pottenger. This has resulted in adjustments ranging from
+ 30 to 90 minutes in either direction over at least two dozen
+ distinct periods ranging from one day to several years in length.
+ A mere handful of pre-1991 transitions are unaffected; data since
+ then has come from more reliable contemporaneous reporting. These
+ changes affect various timestamps in 1920-1923, 1936, 1939,
+ 1942-1943, 1959, 1966-1970, 1972, 1974-1980, and 1988-1990.
+ Additionally, Uruguay's pre-standard-time UT offset has been
+ adjusted westward by 7 seconds, from UT-03:44:44 to UT-03:44:51, to
+ match the location of the Observatory of the National Meteorological
+ Institute in Montevideo.
+ (Thanks to Jeremie Bonjour, Tim Parenti, and Michael Deckers.)
+
+ Enderbury and Kiritimati skipped New Year's Eve 1994, not
+ New Year's Day 1995. (Thanks to Kerry Shetline.)
+
+ Fix the 1912-01-01 transition for Portugal and its colonies.
+ This transition was at 00:00 according to the new UT offset, not
+ according to the old one. Also assume that Cape Verde switched on
+ the same date as the rest, not in 1907. This affects
+ Africa/Bissau, Africa/Sao_Tome, Asia/Macau, Atlantic/Azores,
+ Atlantic/Cape_Verde, Atlantic/Madeira, and Europe/Lisbon.
+ (Thanks to Michael Deckers.)
+
+ Fix an off-by-1 error for pre-1913 timestamps in Jamaica and in
+ Turks & Caicos.
+
+ Changes to past time zone abbreviations
+
+ MMT took effect in Uruguay from 1908-06-10, not 1898-06-28. There
+ is no clock change associated with the transition.
+
+ Changes to build procedure
+
+ The new DATAFORM macro in the Makefile lets the installer choose
+ among three source data formats. The idea is to lessen downstream
+ disruption when data formats are improved.
+
+ * DATAFORM=vanguard installs from the latest, bleeding-edge
+ format. DATAFORM=main (the default) installs from the format
+ used in the 'africa' etc. files. DATAFORM=rearguard installs
+ from a trailing-edge format. Eventually, elements of today's
+ vanguard format should move to the main format, and similarly
+ the main format's features should eventually move to the
+ rearguard format.
+
+ * In the current version, the main and rearguard formats are
+ identical and match that of 2018c, so this change does not
+ affect default behavior. The vanguard format currently contains
+ one feature not in the main format: negative SAVE values. This
+ improves support for Ireland, which uses Irish Standard Time
+ (IST, UTC+01) in summer and GMT (UTC) in winter. tzcode has
+ supported negative SAVE values for decades, and this feature
+ should move to the main format soon. However, it will not move
+ to the rearguard format for quite some time because some
+ downstream parsers do not support it.
+
+ * The build procedure constructs three files vanguard.zi, main.zi,
+ and rearguard.zi, one for each format. The files represent the
+ same data as closely as the formats allow. These three files
+ are intended for downstream data consumers and are not
+ installed. Zoneinfo parsers that do not support negative SAVE values
+ should start using rearguard.zi, so that they will be unaffected
+ when the negative-DST feature moves from vanguard to main.
+ Bleeding-edge Zoneinfo parsers that support the new features
+ already can use vanguard.zi; in this respect, current tzcode is
+ bleeding-edge.
+
+ The Makefile should now be safe for parallelized builds, and 'make
+ -j to2050new.tzs' is now much faster on a multiprocessor host
+ with GNU Make.
+
+ When built with -DSUPPRESS_TZDIR, the tzcode library no longer
+ prepends TZDIR/ to file names that do not begin with '/'. This is
+ not recommended for general use, due to its security implications.
+ (From a suggestion by Manuela Friedrich.)
+
+ Changes to code
+
+ zic now accepts subsecond precision in expressions like
+ 00:19:32.13, which is approximately the legal time of the
+ Netherlands from 1835 to 1937. However, because it is
+ questionable whether the few recorded uses of non-integer offsets
+ had subsecond precision in practice, there are no plans for tzdata
+ to use this feature. (Thanks to Steve Allen for pointing out
+ the limitations of historical data in this area.)
+
+ The code is a bit more portable to MS-Windows. Installers can
+ compile with -DRESERVE_STD_EXT_IDS on MS-Windows platforms that
+ reserve identifiers like 'localtime'. (Thanks to Manuela
+ Friedrich).
+
+ Changes to documentation and commentary
+
+ theory.html now outlines tzdb's extensions to POSIX's model for
+ civil time, and has a section "POSIX features no longer needed"
+ that lists POSIX API components that are now vestigial.
+ (From suggestions by Steve Summit.) It also better distinguishes
+ time zones from tz regions. (From a suggestion by Guy Harris.)
+
+ Commentary is now more consistent about using the phrase "daylight
+ saving time", to match the C name tm_isdst. Daylight saving time
+ need not occur in summer, and need not have a positive offset from
+ standard time.
+
+ Commentary about historical transitions in Uruguay has been expanded
+ with links to many relevant legal documents.
+ (Thanks to Tim Parenti.)
+
+ Commentary now uses some non-ASCII characters with Unicode value
+ less than U+0100, as they can be useful and should work even with
+ older editors such as XEmacs.
+
+
Release 2018c - 2018-01-22 23:00:44 -0800
Briefly:
- Revert Irish changes that relied on negative DST offsets.
+ Revert Irish changes that relied on negative SAVE values.
Changes to tm_isdst
@@ -14,8 +215,8 @@ Release 2018c - 2018-01-22 23:00:44 -0800
struct tm type. This reversion is intended to be a temporary
workaround for problems discovered with downstream uses of
releases 2018a and 2018b, which implemented Irish time by using
- negative DST offsets in the Eire rules of the 'europe' file.
- Although negative DST offsets have been part of tzcode for many
+ negative SAVE values in the Eire rules of the 'europe' file.
+ Although negative SAVE values have been part of tzcode for many
years and are supported by many platforms, they were not
documented before 2018a and ICU and OpenJDK do not currently
support them. A mechanism to export data to platforms lacking
@@ -900,7 +1101,7 @@ Release 2016b - 2016-03-12 17:30:14 -0800
Comments in zone tables have been improved. (Thanks to J William Piggott.)
tzselect again limits its menu comments so that menus fit on a
- 24x80 alphanumeric display.
+ 24×80 alphanumeric display.
A new web page tz-how-to.html. (Thanks to Bill Seymour.)
diff --git a/lib/libc/time/asctime.c b/lib/libc/time/asctime.c
index 7892a71accf0..a43baefd218e 100644
--- a/lib/libc/time/asctime.c
+++ b/lib/libc/time/asctime.c
@@ -1,4 +1,6 @@
-/* $NetBSD: asctime.c,v 1.24 2018/01/07 21:19:35 kamil Exp $ */
+/* $NetBSD: asctime.c,v 1.25 2018/05/04 15:51:00 christos Exp $ */
+
+/* asctime and asctime_r a la POSIX and ISO C, except pad years before 1000. */
/*
** This file is in the public domain, so clarified as of
@@ -16,7 +18,7 @@
#if 0
static char elsieid[] = "@(#)asctime.c 8.5";
#else
-__RCSID("$NetBSD: asctime.c,v 1.24 2018/01/07 21:19:35 kamil Exp $");
+__RCSID("$NetBSD: asctime.c,v 1.25 2018/05/04 15:51:00 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -45,7 +47,7 @@ __weak_alias(asctime_r,_asctime_r)
** 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,
+** The ISO C and POSIX standards prohibit padding the year,
** but many implementations pad anyway; most likely the standards are buggy.
*/
#ifdef __GNUC__
@@ -80,10 +82,6 @@ __weak_alias(asctime_r,_asctime_r)
static char buf_asctime[MAX_ASCTIME_BUF_SIZE];
-/*
-** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
-*/
-
char *
asctime_r(const struct tm *timeptr, char *buf)
{
@@ -131,10 +129,6 @@ asctime_r(const struct tm *timeptr, char *buf)
}
}
-/*
-** A la ISO/IEC 9945-1, ANSI/IEEE Std 1003.1, 2004 Edition.
-*/
-
char *
asctime(const struct tm *timeptr)
{
diff --git a/lib/libc/time/ctime.3 b/lib/libc/time/ctime.3
index 7708e770940f..c2b863276981 100644
--- a/lib/libc/time/ctime.3
+++ b/lib/libc/time/ctime.3
@@ -1,8 +1,8 @@
-.\" $NetBSD: ctime.3,v 1.58 2018/02/11 13:28:26 wiz Exp $
+.\" $NetBSD: ctime.3,v 1.59 2018/05/04 15:51:00 christos Exp $
.\"
.\" XXX: License missing?
.\"
-.Dd February 7, 2018
+.Dd May 5, 2018
.Dt CTIME 3
.Os
.Sh NAME
@@ -258,15 +258,15 @@ to their normal ranges.
.Fa tm_isdst
causes
.Fn mktime
-to presume initially that summer time (for example, Daylight Saving Time
-in the U.S.A.) respectively,
+to presume initially that daylight saving time
+respectively,
is or is not in effect for the specified time.
.It
A negative value for
.Fa tm_isdst
causes the
.Fn mktime
-function to attempt to divine whether summer time is in effect
+function to attempt to divine whether daylight saving time is in effect
for the specified time; in this case it does not use a consistent
rule and may give a different answer when later
presented with the same argument.
@@ -334,13 +334,14 @@ includes the following fields:
int tm_wday; /* day of week (Sunday = 0) */
int tm_yday; /* day of year (0 - 365) */
int tm_isdst; /* is summer time in effect? */
+ int tm_isdst; /* is daylight saving time in effect? */
char *tm_zone; /* abbreviation of timezone name (optional) */
long tm_gmtoff; /* offset from UT in seconds (optional) */
.Ed
.Bl -bullet
.It
.Va tm_isdst
-is non-zero if summer time is in effect.
+is non-zero if daylight saving time is in effect.
.It
.Va tm_gmtoff
is the offset (in seconds) of the time represented from UT,
diff --git a/lib/libc/time/localtime.c b/lib/libc/time/localtime.c
index cf4d2b4f9a3e..095c439b6293 100644
--- a/lib/libc/time/localtime.c
+++ b/lib/libc/time/localtime.c
@@ -1,4 +1,4 @@
-/* $NetBSD: localtime.c,v 1.111 2018/01/25 22:48:42 christos Exp $ */
+/* $NetBSD: localtime.c,v 1.112 2018/05/04 15:51:00 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
@@ -10,7 +10,7 @@
#if 0
static char elsieid[] = "@(#)localtime.c 8.17";
#else
-__RCSID("$NetBSD: localtime.c,v 1.111 2018/01/25 22:48:42 christos Exp $");
+__RCSID("$NetBSD: localtime.c,v 1.112 2018/05/04 15:51:00 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -95,9 +95,8 @@ static const char gmt[] = "GMT";
/*
** The DST rules to use if TZ has no rules and we can't load TZDEFRULES.
** Default to US rules as of 2017-05-07.
-** 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.
+** POSIX does not specify the default DST rules;
+** for historical reasons, US rules are a common default.
*/
#ifndef TZDEFRULESTRING
#define TZDEFRULESTRING ",M3.2.0,M11.1.0"
@@ -448,7 +447,13 @@ tzloadbody(char const *name, struct state *sp, bool doextend,
if (name[0] == ':')
++name;
+#ifdef SUPPRESS_TZDIR
+ /* Do not prepend TZDIR. This is intended for specialized
+ applications only, due to its security implications. */
+ doaccess = true;
+#else
doaccess = name[0] == '/';
+#endif
if (!doaccess) {
size_t namelen = strlen(name);
if (sizeof lsp->fullname - sizeof tzdirslash <= namelen)
@@ -1277,12 +1282,13 @@ tzparse(const char *name, struct state *sp, bool lastditch)
/* 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.
+ ** If daylight saving time is in
+ ** effect, and the transition time was
+ ** not specified as standard time, add
+ ** the daylight saving time offset to
+ ** the transition time; otherwise, add
+ ** the standard time offset to the
+ ** transition time.
*/
/*
** Transitions from DST to DDST
@@ -2361,7 +2367,7 @@ timeoff(struct tm *tmp, long offset)
#ifdef STD_INSPIRED
/*
-** IEEE Std 1003.1-1988 (POSIX) legislates that 536457599
+** IEEE Std 1003.1 (POSIX) says 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
diff --git a/lib/libc/time/private.h b/lib/libc/time/private.h
index 54fee6944517..4eb9a7c43cd5 100644
--- a/lib/libc/time/private.h
+++ b/lib/libc/time/private.h
@@ -1,4 +1,4 @@
-/* $NetBSD: private.h,v 1.51 2017/10/24 17:38:17 christos Exp $ */
+/* $NetBSD: private.h,v 1.52 2018/05/04 15:51:00 christos Exp $ */
#ifndef PRIVATE_H
#define PRIVATE_H
@@ -27,6 +27,16 @@
** Thank you!
*/
+/*
+** zdump has been made independent of the rest of the time
+** conversion package to increase confidence in the verification it provides.
+** You can use zdump to help in verifying other implementations.
+** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
+*/
+#ifndef USE_LTZ
+# define USE_LTZ 1
+#endif
+
/* This string was in the Factory zone through version 2016f. */
#define GRANDPARENTED "Local time zone must be set--see zic manual page"
@@ -78,6 +88,10 @@
#define HAVE_STRDUP 1
#endif
+#ifndef HAVE_STRTOLL
+#define HAVE_STRTOLL 1
+#endif
+
#ifndef HAVE_SYMLINK
#define HAVE_SYMLINK 1
#endif /* !defined HAVE_SYMLINK */
@@ -282,15 +296,19 @@ typedef int int_fast32_t;
#ifndef INTMAX_MAX
# ifdef LLONG_MAX
typedef long long intmax_t;
-# define strtoimax strtoll
+# if HAVE_STRTOLL
+# define strtoimax strtoll
+# endif
# define INTMAX_MAX LLONG_MAX
# define INTMAX_MIN LLONG_MIN
# else
typedef long intmax_t;
-# define strtoimax strtol
# define INTMAX_MAX LONG_MAX
# define INTMAX_MIN LONG_MIN
# endif
+# ifndef strtoimax
+# define strtoimax strtol
+# endif
#endif
#ifndef PRIdMAX
@@ -340,12 +358,14 @@ typedef unsigned long uintmax_t;
#define SIZE_MAX ((size_t) -1)
#endif
-#if 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+#if 3 <= __GNUC__
# define ATTRIBUTE_CONST __attribute__ ((__const__))
+# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
# define ATTRIBUTE_PURE __attribute__ ((__pure__))
# define ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
#else
# define ATTRIBUTE_CONST /* empty */
+# define ATTRIBUTE_MALLOC /* empty */
# define ATTRIBUTE_PURE /* empty */
# define ATTRIBUTE_FORMAT(spec) /* empty */
#endif
@@ -372,6 +392,16 @@ typedef unsigned long uintmax_t;
#ifndef EPOCH_OFFSET
# define EPOCH_OFFSET 0
#endif
+#ifndef RESERVE_STD_EXT_IDS
+# define RESERVE_STD_EXT_IDS 0
+#endif
+
+/* If standard C identifiers with external linkage (e.g., localtime)
+ are reserved and are not already being renamed anyway, rename them
+ as if compiling with '-Dtime_tz=time_t'. */
+#if !defined time_tz && RESERVE_STD_EXT_IDS && USE_LTZ
+# define time_tz time_t
+#endif
/*
** Compile with -Dtime_tz=T to build the tz package with a private
diff --git a/lib/libc/time/strftime.c b/lib/libc/time/strftime.c
index 50a7b9a3fd07..95e3460f16e8 100644
--- a/lib/libc/time/strftime.c
+++ b/lib/libc/time/strftime.c
@@ -1,4 +1,4 @@
-/* $NetBSD: strftime.c,v 1.40 2017/10/24 17:38:17 christos Exp $ */
+/* $NetBSD: strftime.c,v 1.41 2018/05/04 15:51:00 christos Exp $ */
/* Convert a broken-down timestamp to a string. */
@@ -35,7 +35,7 @@
static char elsieid[] = "@(#)strftime.c 7.64";
static char elsieid[] = "@(#)strftime.c 8.3";
#else
-__RCSID("$NetBSD: strftime.c,v 1.40 2017/10/24 17:38:17 christos Exp $");
+__RCSID("$NetBSD: strftime.c,v 1.41 2018/05/04 15:51:00 christos Exp $");
#endif
#endif /* LIBC_SCCS and not lint */
@@ -213,7 +213,7 @@ label:
** %Ec %EC %Ex %EX %Ey %EY
** %Od %oe %OH %OI %Om %OM
** %OS %Ou %OU %OV %Ow %OW %Oy
- ** are supposed to provide alternate
+ ** are supposed to provide alternative
** representations.
*/
goto label;
diff --git a/lib/libc/time/theory.html b/lib/libc/time/theory.html
index ff85f537b4e6..fc2102b3e3c9 100644
--- a/lib/libc/time/theory.html
+++ b/lib/libc/time/theory.html
@@ -1,26 +1,20 @@
-
Theory and pragmatics of the tz code and data
-
-
-
Theory and pragmatics of the tz code and data
+
Theory and pragmatics of the tz code and data
Outline
-
-
-
Scope of the tz database
+
+
Scope of the tz database
-The tz database attempts to record the history and predicted future of
-all computer-based clocks that track civil time. To represent this
-data, the world is partitioned into regions whose clocks all agree
-about timestamps that occur after the somewhat-arbitrary cutoff point
-of the POSIX Epoch (1970-01-01 00:00:00 UTC). For each such region,
-the database records all known clock transitions, and labels the region
-with a notable location. Although 1970 is a somewhat-arbitrary
-cutoff, there are significant challenges to moving the cutoff earlier
-even by a decade or two, due to the wide variety of local practices
-before computer timekeeping became prevalent.
+The tz
+database attempts to record the history and predicted future of
+all computer-based clocks that track civil time.
+It organizes time zone and daylight saving time
+data by partitioning the world into regions
+whose clocks all agree about timestamps that occur after the POSIX Epoch
+(1970-01-01 00:00:00 UTC).
+The database labels each such region with a notable location and
+records all known clock transitions for that location.
+Although 1970 is a somewhat-arbitrary cutoff, there are significant
+challenges to moving the cutoff earlier even by a decade or two, due
+to the wide variety of local practices before computer timekeeping
+became prevalent.
@@ -52,200 +53,236 @@ However, the database is not designed for and does not suffice for
applications requiring accurate handling of all past times everywhere,
as it would take far too much effort and guesswork to record all
details of pre-1970 civil timekeeping.
-Athough some information outside the scope of the database is
+Although some information outside the scope of the database is
collected in a file backzone that is distributed along
with the database proper, this file is less reliable and does not
necessarily follow database guidelines.
-As described below, reference source code for using the tz database is
-also available. The tz code is upwards compatible with POSIX, an
-international standard for UNIX-like systems. As of this writing, the
-current edition of POSIX is:
-
- The Open Group Base Specifications Issue 7,
- IEEE Std 1003.1-2008, 2016 Edition.
+As described below, reference source code for using the
+tz database is also available.
+The tz code is upwards compatible with POSIX, an international
+standard for UNIX-like systems.
+As of this writing, the current edition of POSIX is: The Open
+Group Base Specifications Issue 7, IEEE Std 1003.1-2017, 2018
+Edition.
+Because the database's scope encompasses real-world changes to civil
+timekeeping, its model for describing time is more complex than the
+standard and daylight saving times supported by POSIX.
+A tz region corresponds to a ruleset that can
+have more than two changes per year, these changes need not merely
+flip back and forth between two alternatives, and the rules themselves
+can change at times.
+Whether and when a tz region changes its
+clock, and even the region's notional base offset from UTC, are variable.
+It does not always make sense to talk about a region's
+"base offset", since it is not necessarily a single number.
-
+
-
-
-
Names of time zone rules
+
+
Names of time zone rulesets
-Each of the database's time zone rules has a unique name.
+Each tz region has a unique name that
+corresponds to a set of time zone rules.
Inexperienced users are not expected to select these names unaided.
Distributors should provide documentation and/or a simple selection
-interface that explains the names; for one example, see the 'tzselect'
-program in the tz code. The
-Unicode Common Locale Data
-Repository contains data that may be useful for other
-selection interfaces.
+interface that explains the names; for one example, see the
+tzselect program in the tz code.
+The Unicode Common Locale Data
+Repository contains data that may be useful for other selection
+interfaces.
-The time zone rule naming conventions attempt to strike a balance
+The naming conventions attempt to strike a balance
among the following goals:
+
- Uniquely identify every region where clocks have agreed since 1970.
- This is essential for the intended use: static clocks keeping local
- civil time.
+ Uniquely identify every region where clocks have agreed since 1970.
+ This is essential for the intended use: static clocks keeping local
+ civil time.
- Indicate to experts where that region is.
+ Indicate to experts where that region is.
- Be robust in the presence of political changes. 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 robust in the presence of political changes.
+ 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.
+ Be portable to a wide variety of implementations.
- Use a consistent naming conventions over the entire world.
+ Use a consistent naming conventions over the entire world.
+
-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'.
+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'.
+Some names are further qualified to help avoid confusion; for example,
+'America/Indiana/Petersburg' distinguishes Petersburg,
+Indiana from other Petersburgs in America.
-Here are the general rules used for choosing location names,
+Here are the general guidelines used for
+choosing tz region names,
in decreasing order of importance:
+
- Use only valid POSIX file name components (i.e., the parts of
- names other than '/'). Do not use the file name
- components '.' and '..'.
- 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'. Exceptions: see
- the discussion
- of legacy names below.
+ Use only valid POSIX file name components (i.e., the parts of
+ names other than '/').
+ Do not use the file name components '.' and
+ '..'.
+ 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 Asia/Brunei to
+ Asia/Bandar_Seri_Begawan.
+ Exceptions: see the discussion of legacy names below.
- A name must not be empty, or contain '//', or
- start or end with '/'.
+ A name must not be empty, or contain '//', or
+ start or end with '/'.
- Do not use names that differ only in case. Although the reference
- implementation is case-sensitive, some other implementations
- are not, and they would mishandle names differing only in case.
+ Do not use names that differ only in case.
+ Although the reference implementation is case-sensitive, some
+ other implementations are not, and they would mishandle names
+ differing only in case.
- If one name A is an initial prefix of another
- name AB (ignoring case), then B
- must not start with '/', as a
- regular file cannot have
- the same name as a directory in POSIX. For example,
- 'America/New_York' precludes
- 'America/New_York/Bronx'.
+ If one name A is an initial prefix of another
+ name AB (ignoring case), then B must not
+ start with '/', as a regular file cannot have the
+ same name as a directory in POSIX.
+ For example, America/New_York precludes
+ America/New_York/Bronx.
- Uninhabited regions like the North Pole and Bouvet Island
- do not need locations, since local time is not defined there.
+ Uninhabited regions like the North Pole and Bouvet Island
+ do not need locations, since local time is not defined there.
- There should typically be at least one name for each ISO 3166-1
- officially assigned two-letter code for an inhabited country
- or territory.
+ There should typically be at least one name for each ISO
+ 3166-1 officially assigned two-letter code for an inhabited
+ country or territory.
- If all the clocks in a 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 all the clocks in a region have agreed since 1970,
+ do not 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 José and Georgetown, so
- prefer 'Costa_Rica' to 'San_Jose' and 'Guyana' to 'Georgetown'.
+ If a name is ambiguous, use a less ambiguous alternative;
+ e.g., many cities are named San José and Georgetown, so
+ prefer America/Costa_Rica to
+ America/San_Jose and America/Guyana
+ to America/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.
+ Keep locations compact.
+ Use cities or small islands, not countries or regions, so that any
+ future changes do not split individual locations into different
+ tz regions.
+ E.g., prefer Europe/Paris to Europe/France,
+ since
+ France
+ has had multiple time zones.
- Use mainstream English spelling, e.g. prefer
- 'Rome' to 'Roma', and prefer
- 'Athens' to the Greek
- 'Αθήνα' or the Romanized
- 'Athína'.
- The POSIX file name restrictions encourage this rule.
+ Use mainstream English spelling, e.g., prefer
+ Europe/Rome to Europe/Roma, and
+ prefer Europe/Athens to the Greek
+ Europe/Αθήνα or the Romanized
+ Europe/Athína.
+ The POSIX file name restrictions encourage this guideline.
- Use the most populous among locations in a 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 most populous among locations in a region,
+ e.g., prefer Asia/Shanghai to
+ Asia/Beijing.
+ Among locations with similar populations, pick the best-known
+ location, e.g., prefer Europe/Rome to
+ Europe/Milan.
- Use the singular form, e.g. prefer 'Canary' to 'Canaries'.
+ Use the singular form, e.g., prefer Atlantic/Canary to
+ Atlantic/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.
+ Omit common suffixes like '_Islands' and
+ '_City', unless that would lead to ambiguity.
+ E.g., prefer America/Cayman to
+ America/Cayman_Islands and
+ America/Guatemala to
+ America/Guatemala_City, but prefer
+ America/Mexico_City to
+ America/Mexico
+ because the
+ country of Mexico has several time zones.
- Use '_' to represent a space.
+ Use '_' to represent a space.
- Omit '.' from abbreviations in names, e.g. prefer
- 'St_Helena' to 'St._Helena'.
+ Omit '.' from abbreviations in names.
+ E.g., prefer Atlantic/St_Helena to
+ Atlantic/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.
+ Do not change established names if they only marginally violate
+ the above guidelines.
+ For example, do not change the existing name Europe/Rome to
+ Europe/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.
- This means old spellings will continue to work.
+ If a name is changed, put its old spelling in the
+ 'backward' file.
+ This means old spellings will continue to work.
The file 'zone1970.tab' lists geographical locations used
-to name time
-zone rules. It is intended to be an exhaustive list of names for
-geographic regions as described above; this is a subset of the names
-in the data. Although a 'zone1970.tab' location's longitude
-corresponds to its LMT offset with one hour for every 15° east
-longitude, this relationship is not exact.
+to name tz regions.
+It is intended to be an exhaustive list of names for geographic
+regions as described above; this is a subset of the names in the data.
+Although a 'zone1970.tab' location's
+longitude
+corresponds to
+its local mean
+time (LMT) offset with one hour for every 15°
+east longitude, this relationship is not exact.
@@ -254,843 +291,1014 @@ 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', and 'EET' (see the file 'europe').
+'WET', 'CET', 'MET', and
+'EET' (see the file 'europe').
Older versions of this package defined legacy names that are
-incompatible with the first rule of location names, but which are
-still supported. These legacy names are mostly defined in the file
-'etcetera'. Also, the file 'backward' defines the legacy names
-'GMT0', 'GMT-0' and 'GMT+0', and the file 'northamerica' defines the
-legacy names 'EST5EDT', 'CST6CDT', 'MST7MDT', and 'PST8PDT'.
+incompatible with the first guideline of location names, but which are
+still supported.
+These legacy names are mostly defined in the file
+'etcetera'.
+Also, the file 'backward' defines the legacy names
+'GMT0', 'GMT-0' and 'GMT+0',
+and the file 'northamerica' defines the legacy names
+'EST5EDT', 'CST6CDT',
+'MST7MDT', and 'PST8PDT'.
-Excluding 'backward' should not affect the other data. If
-'backward' is excluded, excluding 'etcetera' should not affect the
-remaining data.
+Excluding 'backward' should not affect the other data.
+If 'backward' is excluded, excluding
+'etcetera' should not affect the remaining data.
+
-
-
-
-
Time zone abbreviations
+
+
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,
+Here are the general guidelines used for choosing time zone abbreviations,
in decreasing order of importance:
+
+
- Use three to six characters that are ASCII alphanumerics or
- '+' or '-'.
- 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 lower-case letters are now allowed.
- Also, POSIX from 2001 on relaxed the rule to allow
- '-', '+',
- and alphanumeric characters from the portable character set
- in the current locale. In practice ASCII alphanumerics and
- '+' and '-' are safe in all locales.
+ Use three to six characters that are ASCII alphanumerics or
+ '+' or '-'.
+ Previous editions of this database also used characters like
+ space and '?', but these characters have a
+ special meaning to the
+ UNIX shell
+ and cause commands like
+ 'set
+ `date`'
+ to have unexpected effects.
+ Previous editions of this guideline required upper-case letters, but the
+ Congressman who introduced
+ Chamorro
+ Standard Time preferred "ChST", so lower-case letters are now
+ allowed.
+ Also, POSIX from 2001 on relaxed the rule to allow '-',
+ '+', and alphanumeric characters from the portable
+ character set in the current locale.
+ In practice ASCII alphanumerics and '+' and
+ '-' are safe in all locales.
- In other words, in the C locale the POSIX extended regular
- expression [-+[:alnum:]]{3,6} should match
- the abbreviation.
- This guarantees that all abbreviations could have been
- specified by a POSIX TZ string.
+
+ In other words, in the C locale the POSIX extended regular
+ expression [-+[:alnum:]]{3,6} should match the
+ abbreviation.
+ This guarantees that all abbreviations could have been specified by a
+ POSIX TZ string.
+
- 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'.
+ 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'.
-
These abbreviations (for standard/daylight/etc. time) are:
-ACST/ACDT Australian Central,
-AST/ADT/APT/AWT/ADDT Atlantic,
-AEST/AEDT Australian Eastern,
-AHST/AHDT Alaska-Hawaii,
-AKST/AKDT Alaska,
-AWST/AWDT Australian Western,
-BST/BDT Bering,
-CAT/CAST Central Africa,
-CET/CEST/CEMT Central European,
-ChST Chamorro,
-CST/CDT/CWT/CPT/CDDT Central [North America],
-CST/CDT China,
-GMT/BST/IST/BDST Greenwich,
-EAT East Africa,
-EST/EDT/EWT/EPT/EDDT Eastern [North America],
-EET/EEST Eastern European,
-GST Guam,
-HST/HDT Hawaii,
-HKT/HKST Hong Kong,
-IST India,
-IST/GMT Irish,
-IST/IDT/IDDT Israel,
-JST/JDT Japan,
-KST/KDT Korea,
-MET/MEST Middle European (a backward-compatibility alias for Central European),
-MSK/MSD Moscow,
-MST/MDT/MWT/MPT/MDDT Mountain,
-NST/NDT/NWT/NPT/NDDT Newfoundland,
-NST/NDT/NWT/NPT Nome,
-NZMT/NZST New Zealand through 1945,
-NZST/NZDT New Zealand 1946–present,
-PKT/PKST Pakistan,
-PST/PDT/PWT/PPT/PDDT Pacific,
-SAST South Africa,
-SST Samoa,
-WAT/WAST West Africa,
-WET/WEST/WEMT Western European,
-WIB Waktu Indonesia Barat,
-WIT Waktu Indonesia Timur,
-WITA Waktu Indonesia Tengah,
-YST/YDT/YWT/YPT/YDDT Yukon.
+
+ These abbreviations (for standard/daylight/etc. time) are:
+ ACST/ACDT Australian Central,
+ AST/ADT/APT/AWT/ADDT Atlantic,
+ AEST/AEDT Australian Eastern,
+ AHST/AHDT Alaska-Hawaii,
+ AKST/AKDT Alaska,
+ AWST/AWDT Australian Western,
+ BST/BDT Bering,
+ CAT/CAST Central Africa,
+ CET/CEST/CEMT Central European,
+ ChST Chamorro,
+ CST/CDT/CWT/CPT/CDDT Central [North America],
+ CST/CDT China,
+ GMT/BST/IST/BDST Greenwich,
+ EAT East Africa,
+ EST/EDT/EWT/EPT/EDDT Eastern [North America],
+ EET/EEST Eastern European,
+ GST Guam,
+ HST/HDT Hawaii,
+ HKT/HKST Hong Kong,
+ IST India,
+ IST/GMT Irish,
+ IST/IDT/IDDT Israel,
+ JST/JDT Japan,
+ KST/KDT Korea,
+ MET/MEST Middle European (a backward-compatibility alias for
+ Central European),
+ MSK/MSD Moscow,
+ MST/MDT/MWT/MPT/MDDT Mountain,
+ NST/NDT/NWT/NPT/NDDT Newfoundland,
+ NST/NDT/NWT/NPT Nome,
+ NZMT/NZST New Zealand through 1945,
+ NZST/NZDT New Zealand 1946–present,
+ PKT/PKST Pakistan,
+ PST/PDT/PWT/PPT/PDDT Pacific,
+ SAST South Africa,
+ SST Samoa,
+ WAT/WAST West Africa,
+ WET/WEST/WEMT Western European,
+ WIB Waktu Indonesia Barat,
+ WIT Waktu Indonesia Timur,
+ WITA Waktu Indonesia Tengah,
+ YST/YDT/YWT/YPT/YDDT Yukon.
+
- For zones whose times are taken from a city's longitude, use the
-traditional xMT notation. The only abbreviation like this
-in current use is 'GMT'. The others are for timestamps before 1960,
-except that Monrovia Mean Time persisted until 1972. Typically,
-numeric abbreviations (e.g., '-004430' for MMT) would
-cause trouble here, as the numeric strings would exceed the POSIX length limit.
+
+ For times taken from a city's longitude, use the
+ traditional xMT notation.
+ The only abbreviation like this in current use is 'GMT'.
+ The others are for timestamps before 1960,
+ except that Monrovia Mean Time persisted until 1972.
+ Typically, numeric abbreviations (e.g., '-004430' for
+ MMT) would cause trouble here, as the numeric strings would exceed
+ the POSIX length limit.
+
A few abbreviations also follow the pattern that
-GMT/BST established for time in the UK. They are:
-
-CMT/BST for Calamarca Mean Time and Bolivian Summer Time
-1890–1932, DMT/IST for Dublin/Dunsink Mean Time and Irish Summer Time
-1880–1916, MMT/MST/MDST for Moscow 1880–1919, and RMT/LST
-for Riga Mean Time and Latvian Summer time 1880–1926.
-An extra-special case is SET for Swedish Time (svensk
-normaltid) 1879–1899, 3° west of the Stockholm
-Observatory.
+
+ A few abbreviations also follow the pattern that
+ GMT/BST established for time in the UK.
+ They are:
+ CMT/BST for Calamarca Mean Time and Bolivian Summer Time
+ 1890–1932,
+ DMT/IST for Dublin/Dunsink Mean Time and Irish Summer Time
+ 1880–1916,
+ MMT/MST/MDST for Moscow 1880–1919, and
+ RMT/LST for Riga Mean Time and Latvian Summer time 1880–1926.
+ An extra-special case is SET for Swedish Time (svensk
+ normaltid) 1879–1899, 3° west of the Stockholm
+ Observatory.
+
- Use 'LMT' for local mean time of locations before the introduction
- of standard time; see "Scope of the
- tz database".
+ Use 'LMT' for local mean time of locations before the
+ introduction of standard time; see "Scope of the
+ tz database".
- If there is no common English abbreviation, use numeric offsets like
- -05 and +0830 that are
- generated by zic's %z notation.
+ If there is no common English abbreviation, use numeric offsets like
+ -05 and +0830 that are generated
+ by zic's %z notation.
- Use current abbreviations for older timestamps to avoid confusion.
- For example, in 1910 a common English abbreviation for UT +01
- in central Europe was 'MEZ' (short for both "Middle European
- Zone" and for "Mitteleuropäische Zeit" in German). Nowadays
- 'CET' ("Central European Time") is more common in English, and
- the database uses 'CET' even for circa-1910 timestamps as this
- is less confusing for modern users and avoids the need for
- determining when 'CET' supplanted 'MEZ' in common usage.
+ Use current abbreviations for older timestamps to avoid confusion.
+ For example, in 1910 a common English abbreviation for time
+ in central Europe was 'MEZ' (short for both "Middle European
+ Zone" and for "Mitteleuropäische Zeit" in German).
+ Nowadays 'CET' ("Central European Time") is more common in
+ English, and the database uses 'CET' even for circa-1910
+ timestamps as this is less confusing for modern users and avoids
+ the need for determining when 'CET' supplanted 'MEZ' in common
+ usage.
- Use a consistent style in a zone's history. For example, if a zone's
- history tends to use numeric abbreviations and a particular
- entry could go either way, use a numeric abbreviation.
+ Use a consistent style in a tz region's history.
+ For example, if history tends to use numeric
+ abbreviations and a particular entry could go either way, use a
+ numeric abbreviation.
- Use UT (with time zone abbreviation '-00') for
- locations while uninhabited. The leading
- '-' is a flag that the time
- zone is in some sense undefined; this notation is
- derived from Internet RFC 3339.
+ Use
+ Universal Time
+ (UT) (with time zone abbreviation '-00') for
+ locations while uninhabited.
+ The leading '-' is a flag that the UT offset is in
+ some sense undefined; this notation is derived
+ from Internet
+ RFC 3339.
+
Application writers should note that these abbreviations are ambiguous
in practice: e.g., 'CST' means one thing in China and something else
in North America, and 'IST' can refer to time in India, Ireland or
-Israel. To avoid ambiguity, use numeric UT offsets like
+Israel.
+To avoid ambiguity, use numeric UT offsets like
'-0600' instead of time zone abbreviations like 'CST'.
-
+
-
-
-
Accuracy of the tz database
+
+
Accuracy of the tz database
-The tz database is not authoritative, and it surely has errors.
+The tz database is not authoritative, and it
+surely has errors.
Corrections are welcome and encouraged; see the file CONTRIBUTING.
Users requiring authoritative data should consult national standards
bodies and the references cited in the database's comments.
-Errors in the tz database arise from many sources:
+Errors in the tz database arise from many sources:
+
- The tz database predicts future timestamps, and current predictions
- will be incorrect after future governments change the rules.
- For example, if today someone schedules a meeting for 13:00 next
- October 1, Casablanca time, and tomorrow Morocco changes its
- daylight saving rules, software can mess up after the rule change
- if it blithely relies on conversions made before the change.
+ The tz database predicts future
+ timestamps, and current predictions
+ will be incorrect after future governments change the rules.
+ For example, if today someone schedules a meeting for 13:00 next
+ October 1, Casablanca time, and tomorrow Morocco changes its
+ daylight saving rules, software can mess up after the rule change
+ if it blithely relies on conversions made before the change.
- The pre-1970 entries in this database cover only a tiny sliver of how
- clocks actually behaved; the vast majority of the necessary
- information was lost or never recorded. Thousands more zones would
- be needed if the tz database's scope were extended to cover even
- just the known or guessed history of standard time; for example,
- the current single entry for France would need to split into dozens
- of entries, perhaps hundreds. And in most of the world even this
- approach would be misleading due to widespread disagreement or
- indifference about what times should be observed. In her 2015 book
- The Global Transformation of Time, 1870-1950, Vanessa Ogle writes
- "Outside of Europe and North America there was no system of time
- zones at all, often not even a stable landscape of mean times,
- prior to the middle decades of the twentieth century". See:
- Timothy Shenk, Booked:
- A Global History of Time. Dissent 2015-12-17.
+ The pre-1970 entries in this database cover only a tiny sliver of how
+ clocks actually behaved; the vast majority of the necessary
+ information was lost or never recorded.
+ Thousands more tz regions would be needed if
+ the tz database's scope were extended to
+ cover even just the known or guessed history of standard time; for
+ example, the current single entry for France would need to split
+ into dozens of entries, perhaps hundreds.
+ And in most of the world even this approach would be misleading
+ due to widespread disagreement or indifference about what times
+ should be observed.
+ In her 2015 book
+ The
+ Global Transformation of Time, 1870–1950,
+ Vanessa Ogle writes
+ "Outside of Europe and North America there was no system of time
+ zones at all, often not even a stable landscape of mean times,
+ prior to the middle decades of the twentieth century".
+ See: Timothy Shenk, Booked:
+ A Global History of Time. Dissent 2015-12-17.
- Most of the pre-1970 data entries come from unreliable sources, often
- astrology books that lack citations and whose compilers evidently
- invented entries when the true facts were unknown, without
- reporting which entries were known and which were invented.
- These books often contradict each other or give implausible entries,
- and on the rare occasions when they are checked they are
- typically found to be incorrect.
+ Most of the pre-1970 data entries come from unreliable sources, often
+ astrology books that lack citations and whose compilers evidently
+ invented entries when the true facts were unknown, without
+ reporting which entries were known and which were invented.
+ These books often contradict each other or give implausible entries,
+ and on the rare occasions when they are checked they are
+ typically found to be incorrect.
- For the UK the tz database relies on years of first-class work done by
- Joseph Myers and others; see
- "History of
- legal time in Britain".
- Other countries are not done nearly as well.
+ For the UK the tz database relies on
+ years of first-class work done by
+ Joseph Myers and others; see
+ "History of
+ legal time in Britain".
+ Other countries are not done nearly as well.
- Sometimes, different people in the same city would maintain clocks
- that differed significantly. Railway time was used by railroad
- companies (which did not always agree with each other),
- church-clock time was used for birth certificates, etc.
- Often this was merely common practice, but sometimes it was set by law.
- For example, from 1891 to 1911 the UT offset in France was legally
- 0:09:21 outside train stations and 0:04:21 inside.
+ Sometimes, different people in the same city maintain clocks
+ that differ significantly.
+ Historically, railway time was used by railroad companies (which
+ did not always
+ agree with each other), church-clock time was used for birth
+ certificates, etc.
+ More recently, competing political groups might disagree about
+ clock settings. Often this is merely common practice, but
+ sometimes it is set by law.
+ For example, from 1891 to 1911 the UT offset in France
+ was legally UT +00:09:21 outside train stations and
+ UT +00:04:21 inside. Other examples include
+ Chillicothe in 1920, Palm Springs in 1946/7, and Jerusalem and
+ Ürümqi to this day.
- Although a named location in the tz database stands for the
- containing region, its pre-1970 data entries are often accurate for
- only a small subset of that region. For example, Europe/London
- stands for the United Kingdom, but its pre-1847 times are valid
- only for locations that have London's exact meridian, and its 1847
- transition to GMT is known to be valid only for the L&NW and the
- Caledonian railways.
+ Although a named location in the tz
+ database stands for the containing region, its pre-1970 data
+ entries are often accurate for only a small subset of that region.
+ For example, Europe/London stands for the United
+ Kingdom, but its pre-1847 times are valid only for locations that
+ have London's exact meridian, and its 1847 transition
+ to GMT is known to be valid only for the L&NW and
+ the Caledonian railways.
- The tz database does not record the earliest time for which a zone's
- data entries are thereafter valid for every location in the region.
- For example, Europe/London is valid for all locations in its
- region after GMT was made the standard time, but the date of
- standardization (1880-08-02) is not in the tz database, other than
- in commentary. For many zones the earliest time of validity is
- unknown.
+ The tz database does not record the
+ earliest time for which a tz region's
+ data entries are thereafter valid for every location in the region.
+ For example, Europe/London is valid for all locations
+ in its region after GMT was made the standard time,
+ but the date of standardization (1880-08-02) is not in the
+ tz database, other than in commentary.
+ For many tz regions the earliest time of
+ validity is unknown.
- The tz database does not record a region's boundaries, and in many
- cases the boundaries are not known. For example, the zone
- America/Kentucky/Louisville represents a region around
- the city of
- Louisville, the boundaries of which are unclear.
+ The tz database does not record a
+ region's boundaries, and in many cases the boundaries are not known.
+ For example, the tz region
+ America/Kentucky/Louisville represents a region
+ around the city of Louisville, the boundaries of which are
+ unclear.
- Changes that are modeled as instantaneous transitions in the tz
- database were often spread out over hours, days, or even decades.
+ Changes that are modeled as instantaneous transitions in the
+ tz
+ database were often spread out over hours, days, or even decades.
- Even if the time is specified by law, locations sometimes
- deliberately flout the law.
+ Even if the time is specified by law, locations sometimes
+ deliberately flout the law.
- Early timekeeping practices, even assuming perfect clocks, were
- often not specified to the accuracy that the tz database requires.
+ Early timekeeping practices, even assuming perfect clocks, were
+ often not specified to the accuracy that the
+ tz database requires.
- Sometimes historical timekeeping was specified more precisely
- than what the tz database can handle. For example, from 1909 to
- 1937 Netherlands clocks were legally UT +00:19:32.13, but the tz
- database cannot represent the fractional second.
+ Sometimes historical timekeeping was specified more precisely
+ than what the tz code can handle.
+ For example, from 1909 to 1937 Netherlands clocks were legally Amsterdam Mean
+ Time (estimated to be UT
+ +00:19:32.13), but the tz
+ code cannot represent the fractional second.
+ In practice these old specifications were rarely if ever
+ implemented to subsecond precision.
- Even when all the timestamp transitions recorded by the tz database
- are correct, the tz rules that generate them may not faithfully
- reflect the historical rules. For example, from 1922 until World
- War II the UK moved clocks forward the day following the third
- Saturday in April unless that was Easter, in which case it moved
- clocks forward the previous Sunday. Because the tz database has no
- way to specify Easter, these exceptional years are entered as
- separate tz Rule lines, even though the legal rules did not change.
+ Even when all the timestamp transitions recorded by the
+ tz database are correct, the
+ tz rules that generate them may not
+ faithfully reflect the historical rules.
+ For example, from 1922 until World War II the UK moved clocks
+ forward the day following the third Saturday in April unless that
+ was Easter, in which case it moved clocks forward the previous
+ Sunday.
+ Because the tz database has no
+ way to specify Easter, these exceptional years are entered as
+ separate tz Rule lines, even though the
+ legal rules did not change.
- The tz database models pre-standard time using the proleptic Gregorian
- calendar and local mean time (LMT), but many people used other
- calendars and other timescales. For example, the Roman Empire used
- the Julian calendar, and had 12 varying-length daytime hours with a
- non-hour-based system at night.
+ The tz database models pre-standard time
+ using the proleptic
+ Gregorian calendar and local mean time, but many people used
+ other calendars and other timescales.
+ For example, the Roman Empire used
+ the Julian
+ calendar,
+ and Roman
+ timekeeping had twelve varying-length daytime hours with a
+ non-hour-based system at night.
- Early clocks were less reliable, and data entries do not represent
- clock error.
+ Early clocks were less reliable, and data entries do not represent
+ clock error.
- The tz database assumes Universal Time (UT) as an origin, even
- though UT is not standardized for older timestamps. In the tz
- database commentary, UT denotes a family of time standards that
- includes Coordinated Universal Time (UTC) along with other variants
- such as UT1 and GMT, with days starting at midnight. Although UT
- equals UTC for modern timestamps, UTC was not defined until 1960,
- so commentary uses the more-general abbreviation UT for timestamps
- that might predate 1960. Since UT, UT1, etc. disagree slightly,
- and since pre-1972 UTC seconds varied in length, interpretation of
- older timestamps can be problematic when subsecond accuracy is
- needed.
+ The tz database assumes Universal Time
+ (UT) as an origin, even though UT is not
+ standardized for older timestamps.
+ In the tz database commentary,
+ UT denotes a family of time standards that includes
+ Coordinated Universal Time (UTC) along with other
+ variants such as UT1 and GMT,
+ with days starting at midnight.
+ Although UT equals UTC for modern
+ timestamps, UTC was not defined until 1960, so
+ commentary uses the more-general abbreviation UT for
+ timestamps that might predate 1960.
+ Since UT, UT1, etc. disagree slightly,
+ and since pre-1972 UTC seconds varied in length,
+ interpretation of older timestamps can be problematic when
+ subsecond accuracy is needed.
- Civil time was not based on atomic time before 1972, and we don't
- know the history of earth's rotation accurately enough to map SI
- seconds to historical solar time to more than about one-hour
- accuracy. See: Stephenson FR, Morrison LV, Hohenkerk CY.
- Measurement
- of the Earth's rotation: 720 BC to AD 2015.
- Proc Royal Soc A. 2016 Dec 7;472:20160404.
- Also see: Espenak F. Uncertainty
- in Delta T (ΔT).
+ Civil time was not based on atomic time before 1972, and we do not
+ know the history of
+ earth's
+ rotation accurately enough to map SI seconds to
+ historical solar time
+ to more than about one-hour accuracy.
+ See: Stephenson FR, Morrison LV, Hohenkerk CY.
+ Measurement of
+ the Earth's rotation: 720 BC to AD 2015.
+ Proc Royal Soc A. 2016 Dec 7;472:20160404.
+ Also see: Espenak F. Uncertainty
+ in Delta T (ΔT).
- The relationship between POSIX time (that is, UTC but ignoring leap
- seconds) and UTC is not agreed upon after 1972. Although the POSIX
- clock officially stops during an inserted leap second, at least one
- proposed standard has it jumping back a second instead; and in
- practice POSIX clocks more typically either progress glacially during
- a leap second, or are slightly slowed while near a leap second.
+ The relationship between POSIX time (that is, UTC but
+ ignoring leap
+ seconds) and UTC is not agreed upon after 1972.
+ Although the POSIX
+ clock officially stops during an inserted leap second, at least one
+ proposed standard has it jumping back a second instead; and in
+ practice POSIX clocks more typically either progress glacially during
+ a leap second, or are slightly slowed while near a leap second.
- The tz database does not represent how uncertain its information is.
- Ideally it would contain information about when data entries are
- incomplete or dicey. Partial temporal knowledge is a field of
- active research, though, and it's not clear how to apply it here.
+ The tz database does not represent how
+ uncertain its information is.
+ Ideally it would contain information about when data entries are
+ incomplete or dicey.
+ Partial temporal knowledge is a field of active research, though,
+ and it is not clear how to apply it here.
-
-In short, many, perhaps most, of the tz database's pre-1970 and future
-timestamps are either wrong or misleading. Any attempt to pass the
-tz database off as the definition of time should be unacceptable to
-anybody who cares about the facts. In particular, the tz database's
-LMT offsets should not be considered meaningful, and should not prompt
-creation of zones merely because two locations differ in LMT or
-transitioned to standard time at different dates.
-
-
-
-
-
-
Time and date functions
-
-The tz code contains time and date functions that are upwards
-compatible with those of POSIX.
-
-POSIX has the following properties and limitations.
+In short, many, perhaps most, of the tz
+database's pre-1970 and future timestamps are either wrong or
+misleading.
+Any attempt to pass the
+tz database off as the definition of time
+should be unacceptable to anybody who cares about the facts.
+In particular, the tz database's
+LMT offsets should not be considered meaningful, and
+should not prompt creation of tz regions
+merely because two locations
+differ in LMT or transitioned to standard time at
+different dates.
+
+
+
+
Time and date functions
+
+The tz code contains time and date functions
+that are upwards compatible with those of POSIX.
+Code compatible with this package is already
+part of many platforms, where the
+primary use of this package is to update obsolete time-related files.
+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 is occasionally extended, and a platform may still be shipping
+an older zic.
+
+
+
POSIX 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.
+ 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 cannot deal with daylight
+ saving time rules not based on the Gregorian calendar (as in
+ Iran), or with situations where more than two time zone
+ abbreviations or UT offsets are used in an area.
+
- The POSIX TZ string takes the following form:
+ The POSIX TZ string takes the following form:
- 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 '<+09>'; this allows
- "+" and "-" in the names.
+ 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 '<+09>';
+ this allows "+" and "-" in the names.
offset
- is of the form
- '[±]hh:[mm[:ss]]'
- and specifies the offset west of UT. 'hh'
- may be a single digit; 0≤hh≤24.
- The default DST offset is one hour ahead of standard time.
+ is of the form
+ '[±]hh:[mm[:ss]]'
+ and specifies the offset west of UT.
+ 'hh' may be a single digit;
+ 0≤hh≤24.
+ 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.
+ specifies the beginning and end of DST.
+ If this is absent, the system supplies its own ruleset
+ for DST, and its rules can differ from year to year;
+ typically US DST rules are used.
time
- takes the form
- 'hh:[mm[:ss]]'
- and defaults to 02:00.
- This is the same format as the offset, except that a
- leading '+' or '-' is not allowed.
+ takes the form
+ 'hh:[mm[:ss]]'
+ and defaults to 02:00.
+ This is the same format as the offset, except that a
+ leading '+' or '-' is not allowed.
date
- takes one of the following forms:
+ 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).
- Typically, this is the only useful form;
- the n
- and Jn forms are
- rarely used.
+ origin-1 day number not counting February 29
-
-
-
- Here is an example POSIX TZ string for New Zealand after 2007.
- It says that standard time (NZST) is 12 hours ahead of UT,
- and that daylight saving time (NZDT) is observed from September's
- last Sunday at 02:00 until April's first Sunday at 03:00:
+
n (0≤n≤365)
+ origin-0 day number counting February 29 if present
+
+ 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).
+ Typically, this is the only useful form; the n
+ and Jn forms are rarely used.
+
+
+
+
-
TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'
+
+ Here is an example POSIX TZ string for New
+ Zealand after 2007.
+ It says that standard time (NZST) is 12 hours ahead
+ of UT, and that daylight saving time
+ (NZDT) is observed from September's last Sunday at
+ 02:00 until April's first Sunday at 03:00:
+
- This POSIX TZ string is hard to remember, and mishandles some
- timestamps before 2008. With this package you can use this
- instead:
+
TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'
-
TZ='Pacific/Auckland'
+
+ This POSIX TZ string is hard to remember, and
+ mishandles some timestamps before 2008.
+ With this package you can use this instead:
+
+
+
TZ='Pacific/Auckland'
- 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.
+ 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.
- The TZ environment variable is process-global, which makes it hard
- to write efficient, thread-safe applications that need access
- to multiple time zones.
+ The TZ environment variable is process-global, which
+ makes it hard to write efficient, thread-safe applications that
+ need access to multiple time zone rulesets.
- 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 UT" 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.)
+ In POSIX, there is 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 UT" 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 provides no convenient and efficient way to determine the UT
- offset and time zone abbreviation of arbitrary timestamps,
- particularly for time zone settings that do not fit into the
- POSIX model.
+ POSIX provides no convenient and efficient way to determine
+ the UT offset and time zone abbreviation of arbitrary
+ timestamps, particularly for tz regions
+ that do not fit into the POSIX model.
- POSIX requires that systems ignore leap seconds.
+ POSIX requires that systems ignore leap seconds.
- The tz code attempts to support all the time_t
- implementations allowed by POSIX. The time_t
- type represents a nonnegative count of
- seconds since 1970-01-01 00:00:00 UTC, ignoring leap seconds.
- In practice, time_t is usually a signed 64- or
- 32-bit integer; 32-bit signed time_t values stop
- working after 2038-01-19 03:14:07 UTC, so
- new implementations these days typically use a signed 64-bit integer.
- Unsigned 32-bit integers are used on one or two platforms,
- and 36-bit and 40-bit integers are also used occasionally.
- Although earlier POSIX versions allowed time_t to be a
- floating-point type, this was not supported by any practical
- systems, and POSIX.1-2013 and the tz code both
- require time_t
- to be an integer type.
+ The tz code attempts to support all the
+ time_t implementations allowed by POSIX.
+ The time_t type represents a nonnegative count of seconds
+ since 1970-01-01 00:00:00 UTC, ignoring leap seconds.
+ In practice, time_t is usually a signed 64- or 32-bit
+ integer; 32-bit signed time_t values stop working after
+ 2038-01-19 03:14:07 UTC, so new implementations these
+ days typically use a signed 64-bit integer.
+ Unsigned 32-bit integers are used on one or two platforms, and 36-bit
+ and 40-bit integers are also used occasionally.
+ Although earlier POSIX versions allowed time_t to be a
+ floating-point type, this was not supported by any practical systems,
+ and POSIX.1-2013 and the tz code both
+ require time_t to be an integer type.
-
-These are the extensions that have been made to the POSIX functions:
-
+
+
Extensions to POSIX in the
+tz code
- 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.
+ The TZ environment variable is used in generating
+ the name of a binary file from which time-related information is read
+ (or is interpreted à la POSIX); TZ is no longer
+ constrained to be a three-letter time zone
+ abbreviation followed by a number of hours and an optional three-letter
+ daylight time zone abbreviation.
+ The daylight saving time rules to be used for a
+ particular tz region are encoded in the
+ binary 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).
+ 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 binary file's 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 (à la POSIX) and "old"
+ programs (as zone names and offsets).
-
-
- The code supports platforms with a UT offset member
- in struct tm,
- e.g., tm_gmtoff.
-
-
- The code supports platforms with a time zone abbreviation member in
- struct tm, e.g., tm_zone.
-
-
- 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.)
-
-
- Functions tzalloc, tzfree,
- localtime_rz, and mktime_z for
- more-efficient thread-safe applications that need to use
- multiple time zones. The tzalloc
- and tzfree functions allocate and free objects of
- type timezone_t, and localtime_rz
- and mktime_z are like localtime_r
- and mktime with an extra
- timezone_t argument. The functions were inspired
- by NetBSD.
-
-
- 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.)
-
-
- Negative time_t values are supported, on systems
- where time_t is signed.
-
-
- These functions can account for leap seconds, thanks to Bradley White.
-
+
+
+ The code supports platforms with a UT offset member
+ in struct tm, e.g., tm_gmtoff.
+
+
+ The code supports platforms with a time zone abbreviation member in
+ struct tm, e.g., tm_zone.
+
+
+ Functions tzalloc, tzfree,
+ localtime_rz, and mktime_z for
+ more-efficient thread-safe applications that need to use multiple
+ time zone rulesets.
+ The tzalloc and tzfree functions
+ allocate and free objects of type timezone_t,
+ and localtime_rz and mktime_z are
+ like localtime_r and mktime with an
+ extra timezone_t argument.
+ The functions were inspired by NetBSD.
+
+
+ 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 do not
+ provide tzsetwall, you will not be able to generate an
+ executable program.
+ (These functions also arrange for local wall clock time to
+ be used if tzset is called – directly or
+ indirectly – and there is no TZ environment
+ variable; portable applications should not, however, rely on this
+ behavior since it is not the way SVR2
+ systems behave.)
+
+
+ Negative time_t values are supported, on systems
+ where time_t is signed.
+
+
+ These functions can account for leap seconds, thanks to Bradley White.
+
+
+
POSIX features no longer needed
-Points of interest to folks with other systems:
+POSIX and ISO C
+define some APIs that are vestigial:
+they are not needed, and are relics of a too-simple model that does
+not suffice to handle many real-world timestamps.
+Although the tz code supports these
+vestigial APIs for backwards compatibility, they should
+be avoided in portable applications.
+The vestigial APIs are:
- Code compatible with this package is already part of many platforms,
- including GNU/Linux, Android, the BSDs, Chromium OS, Cygwin, AIX, iOS,
- BlackBery 10, macOS, Microsoft Windows, OpenVMS, and Solaris.
- 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 is occasionally extended, and a
- platform may still be shipping an older zic.
+ The POSIX tzname variable does not suffice and is no
+ longer needed.
+ To get a timestamp's time zone abbreviation, consult
+ the tm_zone member if available; otherwise,
+ use strftime's "%Z" conversion
+ specification.
- 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
- localtime(&clock)->tm_zone
- (if TM_ZONE is defined) or
- tzname[localtime(&clock)->tm_isdst]
- (if HAVE_TZNAME is defined)
- to learn the correct time zone abbreviation to use.
+ The POSIX daylight and timezone
+ variables do not suffice and are no longer needed.
+ To get a timestamp's UT offset, consult
+ the tm_gmtoff member if available; otherwise,
+ subtract values returned by localtime
+ and gmtime using the rules of the Gregorian calendar,
+ or use strftime's "%z" conversion
+ specification if a string like "+0900" suffices.
- 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 UT.
- This package takes care to do these conversions correctly.
- A comment in the source code tells how to get compatibly wrong
- results.
+ The tm_isdst member is almost never needed and most of
+ its uses should be discouraged in favor of the abovementioned
+ APIs.
+ Although it can still be used in arguments to
+ mktime to disambiguate timestamps near
+ a DST transition when the clock jumps back, this
+ disambiguation does not work when standard time itself jumps back,
+ which can occur when a location changes to a time zone with a
+ lesser UT offset.
-
-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.
-
-
-
-
-
-
Interface stability
-
-The tz code and data supply the following interfaces:
-
+
Other portability notes
- A set of zone names as per "Names of time zone
- rules" above.
+ The 7th Edition
+ UNIXtimezone function is not present in this
+ package; it is 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 localtime(&clock)->tm_zone
+ (if TM_ZONE is defined) or
+ tzname[localtime(&clock)->tm_isdst]
+ (if HAVE_TZNAME is defined) to learn the correct time
+ zone abbreviation to use.
- Library functions described in "Time and date
- functions" above.
+ 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.
- The programs tzselect, zdump,
- and zic, documented in their man pages.
+ In SVR2, time conversion fails for near-minimum or
+ near-maximum time_t values when doing conversions
+ for places that do not use UT.
+ This package takes care to do these conversions correctly.
+ A comment in the source code tells how to get compatibly wrong
+ results.
- The format of zic input files, documented in
- the zic man page.
+ 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.
- The format of zic output files, documented in
- the tzfile man page.
-
-
- The format of zone table files, documented in zone1970.tab.
-
-
- The format of the country code file, documented in iso3166.tab.
-
-
- The version number of the code and data, as the first line of
- the text file 'version' in each release.
+ 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.
+
+
+
+
Interface stability
+
+The tz code and data supply the following interfaces:
+
+ The programs tzselect, zdump,
+ and zic, documented in their man pages.
+
+
+ The format of zic input files, documented in
+ the zic man page.
+
+
+ The format of zic output files, documented in
+ the tzfile man page.
+
+
+ The format of zone table files, documented in zone1970.tab.
+
+
+ The format of the country code file, documented in iso3166.tab.
+
+
+ The version number of the code and data, as the first line of
+ the text file 'version' in each release.
+
+
+
Interface changes in a release attempt to preserve compatibility with
-recent releases. For example, tz data files typically do not rely on
-recently-added zic features, so that users can run
-older zic versions to process newer data
-files. Sources for time zone and daylight
-saving time data describes how
-releases are tagged and distributed.
+recent releases.
+For example, tz data files typically do not
+rely on recently-added zic features, so that users can
+run older zic versions to process newer data files.
+Downloading
+the tz database describes how releases
+are tagged and distributed.
-Interfaces not listed above are less stable. For example, users
-should not rely on particular UT offsets or abbreviations for
-timestamps, as data entries are often based on guesswork and these
-guesses may be corrected or improved.
+Interfaces not listed above are less stable.
+For example, users should not rely on particular UT
+offsets or abbreviations for timestamps, as data entries are often
+based on guesswork and these guesses may be corrected or improved.
-
+
-
-
-
Calendrical issues
+
+
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 Nachum Dershowitz and Edward M. Reingold,
-Calendrical
-Calculations: Third Edition, Cambridge University Press (2008).
-Other information and sources are given in the file 'calendars'
-in the tz distribution. They sometimes disagree.
+extended the time zone database further into the past.
+An excellent resource in this area is Edward M. Reingold
+and Nachum Dershowitz, Calendrical
+Calculations: The Ultimate Edition, Cambridge University Press (2018).
+Other information and sources are given in the file 'calendars'
+in the tz distribution.
+They sometimes disagree.
-
+
-
-
-
Time and time zones on other planets
+
+
Time and time zones on other planets
-Some people's work schedules use Mars time. Jet Propulsion Laboratory
-(JPL) coordinators have kept Mars time on and off at least since 1997
-for the Mars Pathfinder mission. Some of their family members have
-also adapted to Mars time. Dozens of special Mars watches were built
-for JPL 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.
+Some people's work schedules
+use Mars time.
+Jet Propulsion Laboratory (JPL) coordinators kept Mars time on
+and off during the
+Mars
+Pathfinder mission.
+Some of their family members also adapted to Mars time.
+Dozens of special Mars watches were built for JPL 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.
+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).
+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.
+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
+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.
+12:00 GMT.
In our solar system, Mars is the planet with time and calendar most
-like Earth's. On other planets, Sun-based time and calendars would
-work quite differently. For example, although Mercury's sidereal
-rotation period is 58.646 Earth days, Mercury revolves around the Sun
-so rapidly that an observer on Mercury's equator would see a sunrise
-only every 175.97 Earth days, i.e., a Mercury year is 0.5 of a Mercury
-day. Venus is more complicated, partly because its rotation is
-slightly retrograde: its year is 1.92 of its days. Gas giants like
-Jupiter are trickier still, as their polar and equatorial regions
-rotate at different rates, so that the length of a day depends on
-latitude. This effect is most pronounced on Neptune, where the day is
-about 12 hours at the poles and 18 hours at the equator.
+like Earth's.
+On other planets, Sun-based time and calendars would work quite
+differently.
+For example, although Mercury's
+sidereal
+rotation period is 58.646 Earth days, Mercury revolves around the
+Sun so rapidly that an observer on Mercury's equator would see a
+sunrise only every 175.97 Earth days, i.e., a Mercury year is 0.5 of a
+Mercury day.
+Venus is more complicated, partly because its rotation is slightly
+retrograde:
+its year is 1.92 of its days.
+Gas giants like Jupiter are trickier still, as their polar and
+equatorial regions rotate at different rates, so that the length of a
+day depends on latitude.
+This effect is most pronounced on Neptune, where the day is about 12
+hours at the poles and 18 hours at the equator.
-Although the tz database does not support time on other planets, it is
-documented here in the hopes that support will be added eventually.
+Although the tz database does not support
+time on other planets, it is documented here in the hopes that support
+will be added eventually.
-
+
-
+
diff --git a/lib/libc/time/tz-art.htm b/lib/libc/time/tz-art.html
similarity index 93%
rename from lib/libc/time/tz-art.htm
rename to lib/libc/time/tz-art.html
index 4cf33e89bf4d..9624d8cd2292 100644
--- a/lib/libc/time/tz-art.htm
+++ b/lib/libc/time/tz-art.html
@@ -81,19 +81,19 @@ doing so got a crook trying to be declared dead to
emerge a bit too early from the titular enclosure.
-The 1960s ITC television series The Prisoner included an episode
-entitled "The Chimes of Big Ben" in which our protagonist tumbled to
+"The Chimes of Big Ben", The Prisoner, episode 2, ITC, 1967-10-06.
+Our protagonist tumbles to
the fraudulent nature of a Poland-to-England escape upon hearing "Big
Ben" chiming on Polish local time.
-The series Seinfeld included an episode entitled "The Susie," first
-broadcast 1997-02-13, in which Kramer decides that daylight saving time
+"The Susie", Seinfeld, season 8, episode 15, NBC, 1997-02-13.
+Kramer decides that daylight saving time
isn't coming fast enough, so he sets his watch ahead an hour.
-The "20 Hours in America" episode of The West Wing,
-first aired 2002-09-25, contained a The West Wing, season 4, episodes 1–2,
+2002-09-25, contained a scene that
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.
@@ -144,6 +144,9 @@ hinges on whether or not Russia observes daylight saving time.
"The Lost Hour", Eerie, Indiana, episode 10, NBC, 1991-12-01.
Despite Indiana's then-lack of DST, Marshall changes his clock with
unusual consequences.
+See "Eerie,
+Indiana was a few dimensions ahead of its time".
"Time Tunnel", The Adventures of Pete & Pete, season 2, episode 5,
@@ -162,6 +165,11 @@ CBS, 2016-01-17.
The applicability of a contract hinges on the
time zone associated with a video timestamp.
+
+"Justice", Veep, season 6, episode 4, HBO, 2017-05-07.
+Jonah's inability to understand DST ends up impressing a wealthy
+backer who sets him up for a 2020 presidential run.
+
Books, plays, and magazines
@@ -423,7 +431,7 @@ Supernaw.
ADO Rating
1.5 stars
Notes
The title song is also available on "Bob Dylan's Greatest Hits" and "The Essential Bob Dylan."
-
+
Artist
Luciana Souza
CD
Tide
Copyright Date
2009
@@ -488,6 +496,22 @@ it's already tomorrow in Australia!"
Jokes
+The idea behind daylight saving time was first proposed as a joke by
+Benjamin Franklin. To enforce it, he suggested, "Every
+morning, as soon as the sun rises, let all the bells in every church
+be set ringing; and if that is not sufficient, let cannon be fired in
+every street, to wake the sluggards effectually, and make them open
+their eyes to see their true interest. All the difficulty will be in
+the first two or three days: after which the reformation will be as
+natural and easy as the present irregularity; for, ce n'est que le
+premier pas qui coûte."
+Franklin's
+joke was first published on 1784-04-26 by the
+Journal de Paris as an
+anonymous letter translated into French.
+
+
"We've been using the five-cent nickel in this country since 1492.
Now that's pretty near 100 years, daylight saving."
(Groucho Marx as Captain Spaulding in Animal Crackers, 1930,
@@ -571,7 +595,7 @@ but maybe in your time zone I haven't finished yet. So stay tuned!"
diff --git a/lib/libc/time/tz-link.htm b/lib/libc/time/tz-link.html
similarity index 89%
rename from lib/libc/time/tz-link.htm
rename to lib/libc/time/tz-link.html
index b7c06e6c2e66..13a824d7e9af 100644
--- a/lib/libc/time/tz-link.htm
+++ b/lib/libc/time/tz-link.html
@@ -7,7 +7,9 @@
Sources for time zone and daylight saving time data
-Time zone and daylight saving rules are controlled by individual
+Time zone and
+daylight-saving
+rules are controlled by individual
governments. They are sometimes changed with little notice, and their
histories and planned futures are often recorded only fitfully. Here
is a summary of attempts to organize and record relevant data in this
@@ -20,12 +22,9 @@ 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 time zone
-boundaries and
-daylight-saving
-rules.
-This database (often called zoneinfo or
-tz)
+to time zone boundaries and daylight saving rules.
+This database (known as tz,
+tzdb, or zoneinfo)
is used by several implementations,
including
the
@@ -109,7 +108,7 @@ gzip -dc tzdata-latest.tar.gz | tar -xf -
release in a single-tarball format containing extra data
useful for regression testing:
These commands use convenience links to the latest release
of the tz database hosted by the
@@ -130,7 +129,7 @@ Since version 2016h, each release has contained a text file named
The releases are also available in an
FTP directory via a
-less-secure protocol .
+less-secure protocol.
Alternatively, a development repository of code and data can be
retrieved from GitHub via the shell
command:
@@ -182,6 +181,8 @@ data yourself. System-specific instructions for installing the
latest tz data have also been published
for AIX,
Android,
+ICU,
IBM
@@ -190,7 +191,7 @@ href="http://www.oracle.com/technetwork/java/javase/tzupdater-readme-136440.html
Java, Joda-Time, MySQL,
and Noda Time (see below).
+href="https://nodatime.org/userguide/tzdb">Noda Time (see below).
Sources for the tz database are
LF,
which can be modified by common text editors such
as GNU Emacs,
gedit, and
-vim.
+vim.
Specialized source-file editing can be done via the
Sublime
zoneinfo package for
Time.is shows locations'
-time and zones in a simple format.
@@ -267,10 +272,10 @@ href="https://tools.ietf.org/html/rfc7808">TZDIST
(Internet RFC 7808), a time zone data distribution service,
along with CalDAV
(Internet RFC 7809), a calendar access protocol for
-transferring time zone data by reference. The (expired) draft TZDIST
-Geolocate Extension would have let a client determine its time zone region
+href="https://tools.ietf.org/html/draft-murchison-tzdist-geolocate-01">TZDIST
+Geolocate Extension lets a client determine its time zone region
from its geographic location using a 'geo' URI.
International Components for
Unicode (ICU) contains C/C++ and Java
@@ -333,8 +344,7 @@ into an ICU-specific format.
the Elixir language downloads
and compiles tz source and exposes APIs for use. It is
-freely available under the MIT license.
Noda Time – Date and
time API for .NET
and TZ4Net
are similar to Joda-Time and Time4J, but for the .NET framework instead of
@@ -374,6 +384,11 @@ and a BSD-style license, respectively.
CompactTimeZoneGenerator
+compiles time zone data into a compact form designed for
+JavaScript. It is freely available under a combination of
+the MIT license and the Apache License.
Moment Timezone is a
plugin for the Moment.js date
manipulation library. It is freely available under the MIT
@@ -432,12 +447,20 @@ It is freely available under the LGPL.
implementation of a binary file reader. It is freely available under
the Apache License.
CCTZ is a simple C++
-library that translates between UTC and civil time and
+library that translates between UT and civil time and
can read binary files. It is freely available under the Apache
License.
ZoneInfo.java
is a tz binary file reader written in Java.
It is freely available under the LGPL.
+
Timelib is a C
+library that reads tz binary files and converts
+time stamps from one time zone or format to another.
+It is used by PHP,
+HHVM,
+and MongoDB.
+It is freely available under the MIT license.
Timezone is a
JavaScript library that supports date arithmetic that is time zone
aware. It is freely available under the MIT license.
Time Zone
Master is a Microsoft Windows clock program that can automatically
download, compile and use tz releases. The Basic version
is free.
@@ -520,8 +543,8 @@ licenses to tz contributors.
Time-zone Atlas
is Astrodienst's Web version of Shanks and Pottenger's
time zone history atlases also published in software
-form by ACS-Starcrafts.
+href="https://astrocom.com/astrology-products/software/acs-atlas-software">software
+form by ACS-Starcrafts.
These atlases are extensive but unreliable, as Shanks appears to have
guessed many UT offsets and transitions. The atlases cite no
sources and do not indicate which entries are guesswork.
@@ -529,7 +552,7 @@ sources and do not indicate which entries are guesswork.
its own tztab(4) format.
Microsoft Windows has proprietary data mentioned
above.
World Time Zones
contains data from the Time Service Department of the
@@ -553,16 +576,16 @@ Library Map Collection
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,
+but the maps do not indicate daylight saving time,
and parts of the data are a few years out of date.
@@ -622,10 +645,10 @@ library for Python is freely available under the MIT license.
href="https://github.com/gunyarakun/timezone_finder">timezone_finder
library for Ruby is freely available under the MIT license.
A ship within the territorial
waters of any nation uses that nation's time. In international
waters, time zone boundaries are meridians 15° apart, except that
-UTC−12 and UTC+12 are each 7.5°
+UT−12 and UT+12 are each 7.5°
wide and are separated by
the 180° meridian (not by the International Date Line, which is
for land and territorial waters only). A captain can change ship's
@@ -706,6 +728,10 @@ zones & daylight saving time.
The Oceanography, Hydrography, and Meteorology Service of the Uruguayan
+Navy (SOHMA) publishes an annual almanac
+(in Spanish).
Precision timekeeping
@@ -759,6 +790,8 @@ Time Zone Proceedings lists changes to time zone boundaries.
href="http://leapsecond.com/hpan/an1289.pdf">The
Science of Timekeeping is a thorough introduction
to the theory and practice of precision timekeeping.
NTP: The Network
Time Protocol (Internet RFC 5905)
@@ -778,12 +811,12 @@ href="https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol">D
option for a server to configure
a client's time zone and daylight saving settings automatically.
Formats on the Web surveys web- and Internet-oriented date and time
formats.
Alphabetic time zone abbreviations should not be used as unique
-identifiers for UTC offsets as they are ambiguous in
+identifiers for UT offsets as they are ambiguous in
practice. For example, in English-speaking North America
-"CST" denotes 6 hours behind UTC,
-but in China it denotes 8 hours ahead of UTC,
+"CST" denotes 6 hours behind UT,
+but in China it denotes 8 hours ahead of UT,
and French-speaking North Americans prefer
"HNC" to
"CST". The tz
database contains English abbreviations for many time stamps;
unfortunately some of these abbreviations were merely the database maintainers'
-inventions, and are gradually being removed.
+inventions, and these have been removed when possible.
Numeric time zone abbreviations typically count hours east of
-UTC, e.g., +09 for Japan and
+UT, e.g., +09 for Japan and
−10 for Hawaii. However, the POSIX
TZ environment variable uses the opposite convention.
For example, one might use TZ="POSIX TZ to a value like
"GMT-9", though, since this would incorrectly imply that
-local time is nine hours ahead of UTC and the time zone
+local time is nine hours ahead of UT and the time zone
is called "GMT".
diff --git a/lib/libc/time/tzset.3 b/lib/libc/time/tzset.3
index aa6a45e85485..41671d0ed9b8 100644
--- a/lib/libc/time/tzset.3
+++ b/lib/libc/time/tzset.3
@@ -1,5 +1,5 @@
-.\" $NetBSD: tzset.3,v 1.37 2018/01/25 22:48:42 christos Exp $
-.Dd January 25, 2018
+.\" $NetBSD: tzset.3,v 1.38 2018/05/04 15:51:00 christos Exp $
+.Dd May 5, 2018
.Dt TZSET 3
.Os
.Sh NAME
@@ -175,14 +175,15 @@ where:
.It Cm std No and Cm dst
Three or more bytes that are the designation for the standard
.Cm ( std )
-or summer
-.Cm ( dst )
+or the alternative
+.Cm ( dst
+such as daylight saving time)
time zone.
Only
.Cm std
is required; if
.Cm dst
-is missing, then summer time does not apply in this locale.
+is missing, then daylight saving 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 NUL bytes are allowed.
@@ -225,7 +226,7 @@ If no
.Cm offset
follows
.Cm dst ,
-summer time is assumed to be one hour ahead of standard time.
+daylight saving 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
@@ -236,7 +237,7 @@ the time zone shall be east of the Prime Meridian; otherwise it shall be
west (which may be indicated by an optional preceding
.Dq + ) .
.It Cm rule
-Indicates when to change to and back from summer time.
+Indicates when to change to and back from daylight saving time.
The
.Cm rule
has the form:
@@ -253,7 +254,7 @@ has the form:
.Pp
where the first
.Cm date
-describes when the change from standard to summer time occurs and the
+describes when the change from standard to daylight saving time occurs and the
second
.Cm date
describes when the change back happens.
@@ -337,30 +338,41 @@ extensions to POSIX.
stands for US Eastern Standard
Time (EST), 5 hours behind UT, without daylight saving.
.It FJT\-12FJST,M11.1.0,M1.3.4/75
-stands for Fiji Time (FJT) and Fiji Summer Time (FJST), 12 hours ahead
+.It <+12>\-12<+13>,M11.1.0,M1.2.1/147
+stands for Fiji time, 12 hours ahead
of UT, springing forward on November's first Sunday at 02:00, and
-falling back on January's third Thursday at 75:00 (i.e., 03:00 on the
-first Sunday on or after January 18).
+falling back on January's second Monday at 147:00 (i.e., 03:00 on the
+first Sunday on or after January 14).
+The abbreviations for standard and daylight saving time are
+.Qq +12
+and
+.Qq +13 .
.It IST\-2IDT,M3.4.4/26,M10.5.0
stands for Israel Standard Time (IST) and Israel Daylight Time (IDT),
2 hours ahead of UT, springing forward on March's fourth
Thursday at 26:00 (i.e., 02:00 on the first Friday on or after March
23), and falling back on October's last Sunday at 02:00.
-.It WART4WARST,J1/0,J365/25
-stands for Western Argentina Summer Time (WARST), 3 hours behind UT.
+.It <\-04>4<\-03>,J1/0,J365/25
+stands for permanent daylight saving time, 3 hours behind UT with
+abbreviation
+.Qq \-03 .
There is a dummy fall-back transition on December 31 at 25:00 daylight
saving time (i.e., 24:00 standard time, equivalent to January 1 at
00:00 standard time), and a simultaneous spring-forward transition on
January 1 at 00:00 standard time, so daylight saving time is in effect
all year and the initial
-.Em WART
+.Em <\-04>
is a placeholder.
-.It WGT3WGST,M3.5.0/\-2,M10.5.0/\-1
-stands for Western Greenland Time (WGT) and Western Greenland Summer
-Time (WGST), 3 hours behind UT, where clocks follow the EU rules of
+.It <\-03>3<\-02>,M3.5.0/\-2,M10.5.0/\-1
+stands for time in western Greenland, 3 hours behind UT, where clocks
+follow the EU rules of
springing forward on March's last Sunday at 01:00 UT (\-02:00 local
-time) and falling back on October's last Sunday at 01:00 UT
-(\-01:00 local time).
+time, i.e., 22:00 the previous day) and falling back on October's last
+Sunday at 01:00 UT (\-01:00 local time, i.e., 23:00 the previous day).
+The abbreviations for standard and daylight saving time are
+.Qq \-03
+and
+.Qq \-02 .
.El
.Pp
If no
@@ -373,7 +385,7 @@ format file
.Pa posixrules
in
.Pa /usr/share/zoneinfo
-are used, with the standard and summer time offsets from UT replaced
+are used, with the standard and daylight saving time offsets from UT replaced
by those specified by the
.Cm offset
values in
diff --git a/lib/libc/time/version b/lib/libc/time/version
index f6a71fe2f67f..cc61cea271c9 100644
--- a/lib/libc/time/version
+++ b/lib/libc/time/version
@@ -1 +1 @@
-2018c
+2018e
diff --git a/lib/libc/time/zdump.c b/lib/libc/time/zdump.c
index 20a1216ddf1b..b335a6f428f7 100644
--- a/lib/libc/time/zdump.c
+++ b/lib/libc/time/zdump.c
@@ -1,4 +1,4 @@
-/* $NetBSD: zdump.c,v 1.48 2018/01/25 22:48:42 christos Exp $ */
+/* $NetBSD: zdump.c,v 1.49 2018/05/04 15:51:00 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2009-05-17 by Arthur David Olson.
@@ -6,22 +6,12 @@
#include
#ifndef lint
-__RCSID("$NetBSD: zdump.c,v 1.48 2018/01/25 22:48:42 christos Exp $");
+__RCSID("$NetBSD: zdump.c,v 1.49 2018/05/04 15:51:00 christos Exp $");
#endif /* !defined lint */
-/*
-** 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.
-** To do this, compile with -DUSE_LTZ=0 and link without the tz library.
-*/
-
#ifndef NETBSD_INSPIRED
# define NETBSD_INSPIRED 1
#endif
-#ifndef USE_LTZ
-# define USE_LTZ 1
-#endif
#include
#include "private.h"
@@ -149,7 +139,7 @@ sumsize(size_t a, size_t b)
/* Return a pointer to a newly allocated buffer of size SIZE, exiting
on failure. SIZE should be nonzero. */
-static void *
+static void * ATTRIBUTE_MALLOC
xmalloc(size_t size)
{
void *p = malloc(size);
diff --git a/lib/libc/time/zic.8 b/lib/libc/time/zic.8
index 0506b9691faa..f464a9db6c9f 100644
--- a/lib/libc/time/zic.8
+++ b/lib/libc/time/zic.8
@@ -1,5 +1,5 @@
-.\" $NetBSD: zic.8,v 1.28 2018/01/25 22:48:42 christos Exp $
-.Dd January 25, 2018
+.\" $NetBSD: zic.8,v 1.29 2018/05/04 15:51:00 christos Exp $
+.Dd May 5, 2018
.Dt ZIC 8
.Os
.Sh NAME
@@ -156,11 +156,11 @@ abbreviation must be unambiguous in context.
.Pp
A rule line has the form
.Pp
-.Dl Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
+.Dl Rule NAME FROM TO TYPE IN ON AT SAVE LETTER/S
.Pp
For example:
.Pp
-.Dl Rule US 1967 1973 \- Apr lastSun 2:00 1:00 D
+.Dl Rule US 1967 1973 \- Apr lastSun 2:00s 1:00d D
.Pp
The fields that make up a rule line are:
.Bl -tag -width "LETTER/S"
@@ -233,13 +233,15 @@ field.
Gives the time of day at which the rule takes effect.
Recognized forms include:
.Pp
-.Bl -tag -width "01X28X14" -compact -offset indent
+.Bl -tag -width "00X19X32X13" -compact -offset indent
.It 2
time in hours
.It 2:00
time in hours and minutes
.It 01:28:14
time in hours, minutes, and seconds
+.It 00:19:32.13
+time with fractional seconds
.It 15:00
24-hour format time (for times after noon)
.It 260:00
@@ -252,6 +254,12 @@ equivalent to 0
.Pp
where hour 0 is midnight at the start of the day,
and hour 24 is midnight at the end of the day.
+Although
+.I zic
+rounds times to the nearest integer second
+(breaking ties to the even integer), the fractions may be useful
+to other applications requiring greater precision.
+The source format does not specify any maximum precision.
Any of these forms may be followed by the letter
.Em w
if the given time is local
@@ -275,16 +283,23 @@ clock/calendar set to the type of time specified in the
field would show the specified date and time of day.
.It SAVE
Gives the amount of time to be added to local standard time when the rule is in
-effect.
+effect, and whether the resulting time is standard or daylight saving.
This field has the same format as the
.Em AT
field
-(although, of course, the
-suffixes are not used).
+.Em s
+for standard time and
+.Em d
+for daylight saving time.
+The suffix letter is typically omitted, and defaults to
+.Em s
+if the offset is zero and to
+.Em d
+otherwise.
Negative offsets are allowed; in Ireland, for example, daylight saving
time is observed in winter and has a negative offset relative to
Irish Standard Time.
-Only the sum of standard time and this amount matters; for example,
+The offset is merely added to standard time; for example,
.Nm
does not distinguish a 10:30 standard time plus an 0:30
.Em SAVE
@@ -337,7 +352,9 @@ fields of rule lines;
begin the field with a minus sign if time must be subtracted from UT.
.It RULES
The name of the rules that apply in the time zone or,
-alternatively, an amount of time to add to local standard time.
+alternatively, a field in the same format as a rule-line SAVE column,
+giving of the amount of time to be added to local standard time
+effect, and whether the resulting time is standard or daylight saving.
If this field is
.Em \&-
then standard time always applies in the time zone.
@@ -350,7 +367,7 @@ The pair of characters
is used to show where the
.Dq variable part
of the time zone abbreviation goes.
-Alternately, a format can use the pair of characters
+Alternatively, a format can use the pair of characters
.Em %z
+to stand for the UT offset in the form
.Em \(+- hh ,
diff --git a/lib/libc/time/zic.c b/lib/libc/time/zic.c
index 41787ddbe774..010a70e3f482 100644
--- a/lib/libc/time/zic.c
+++ b/lib/libc/time/zic.c
@@ -1,4 +1,4 @@
-/* $NetBSD: zic.c,v 1.70 2018/01/25 22:48:42 christos Exp $ */
+/* $NetBSD: zic.c,v 1.71 2018/05/04 15:51:00 christos Exp $ */
/*
** This file is in the public domain, so clarified as of
** 2006-07-17 by Arthur David Olson.
@@ -10,7 +10,7 @@
#include
#ifndef lint
-__RCSID("$NetBSD: zic.c,v 1.70 2018/01/25 22:48:42 christos Exp $");
+__RCSID("$NetBSD: zic.c,v 1.71 2018/05/04 15:51:00 christos Exp $");
#endif /* !defined lint */
#include "private.h"
@@ -52,6 +52,10 @@ typedef int_fast64_t zic_t;
#else
#define MKDIR_UMASK 0755
#endif
+/* Port to native MS-Windows and to ancient UNIX. */
+#if !defined S_ISDIR && defined S_IFDIR && defined S_IFMT
+# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
+#endif
#if HAVE_SYS_WAIT_H
#include /* for WIFEXITED and WEXITSTATUS */
@@ -96,7 +100,9 @@ struct rule {
/* or wall clock time if 0 */
bool r_todisgmt; /* above is GMT if 1 */
/* or local time if 0 */
- zic_t r_stdoff; /* offset from standard time */
+ bool r_isdst; /* is this daylight saving time? */
+ zic_t r_stdoff; /* offset from default time (which is
+ usually standard time) */
const char * r_abbrvar; /* variable part of abbreviation */
bool r_todo; /* a rule to do (used in outzone) */
@@ -117,10 +123,11 @@ struct zone {
const char * z_name;
zic_t z_gmtoff;
- const char * z_rule;
+ char * z_rule;
const char * z_format;
char z_format_specifier;
+ bool z_isdst;
zic_t z_stdoff;
struct rule * z_rules;
@@ -160,6 +167,7 @@ static void dolink(const char *, const char *, bool);
static char ** getfields(char * buf);
static zic_t gethms(const char * string, const char * errstring,
bool);
+static zic_t getstdoff(char *, bool *);
static void infile(const char * filename);
static void inleap(char ** fields, int nfields);
static void inlink(char ** fields, int nfields);
@@ -450,7 +458,7 @@ memcheck(void *ptr)
return ptr;
}
-static void *
+static void * ATTRIBUTE_MALLOC
zic_malloc(size_t size)
{
return memcheck(malloc(size));
@@ -462,7 +470,7 @@ zic_realloc(void *ptr, size_t size)
return memcheck(realloc(ptr, size));
}
-static char *
+static char * ATTRIBUTE_MALLOC
ecpyalloc(char const *str)
{
return memcheck(strdup(str));
@@ -905,9 +913,11 @@ dolink(char const *fromfield, char const *tofield, bool staysymlink)
char *linkalloc = absolute ? NULL : relname(fromfield, tofield);
char const *contents = absolute ? fromfield : linkalloc;
int symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
- if (symlink_errno == ENOENT && !todirs_made) {
+ if (!todirs_made
+ && (symlink_errno == ENOENT || symlink_errno == ENOTSUP)) {
mkdirs(tofield, true);
- symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
+ if (symlink_errno == ENOENT)
+ symlink_errno = symlink(contents, tofield) == 0 ? 0 : errno;
}
free(linkalloc);
if (symlink_errno == 0) {
@@ -1095,8 +1105,7 @@ associate(void)
** 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);
+ zp->z_stdoff = getstdoff(zp->z_rule, &zp->z_isdst);
/*
** Note, though, that if there's no rule,
** a '%s' in the format is a bad thing.
@@ -1203,8 +1212,10 @@ static zic_t
gethms(char const *string, char const *errstring, bool signable)
{
zic_t hh;
- int mm, ss, sign;
- char xs;
+ int sign, mm = 0, ss = 0;
+ char hhx, mmx, ssx, xr = '0', xs;
+ int tenths = 0;
+ bool ok = true;
if (string == NULL || *string == '\0')
return 0;
@@ -1214,12 +1225,24 @@ gethms(char const *string, char const *errstring, bool signable)
sign = -1;
++string;
} else sign = 1;
- if (sscanf(string, "%"SCNdZIC"%c", &hh, &xs) == 1)
- mm = ss = 0;
- else if (sscanf(string, "%"SCNdZIC":%d%c", &hh, &mm, &xs) == 2)
- ss = 0;
- else if (sscanf(string, "%"SCNdZIC":%d:%d%c", &hh, &mm, &ss, &xs)
- != 3) {
+ switch (sscanf(string,
+ "%"SCNdZIC"%c%d%c%d%c%1d%*[0]%c%*[0123456789]%c",
+ &hh, &hhx, &mm, &mmx, &ss, &ssx, &tenths, &xr, &xs)) {
+ default: ok = false; break;
+ case 8:
+ ok = '0' <= xr && xr <= '9';
+ /* fallthrough */
+ case 7:
+ ok &= ssx == '.';
+ if (ok && noise)
+ warning(_("fractional seconds rejected by"
+ " pre-2018 versions of zic"));
+ /* fallthrough */
+ case 5: ok &= mmx == ':'; /* fallthrough */
+ case 3: ok &= hhx == ':'; /* fallthrough */
+ case 1: break;
+ }
+ if (!ok) {
error("%s", errstring);
return 0;
}
@@ -1233,6 +1256,7 @@ gethms(char const *string, char const *errstring, bool signable)
error(_("time overflow"));
return 0;
}
+ ss += 5 + ((ss ^ 1) & (xr == '0')) <= tenths; /* Round to even. */
if (noise && (hh > HOURSPERDAY ||
(hh == HOURSPERDAY && (mm != 0 || ss != 0))))
warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
@@ -1240,6 +1264,24 @@ warning(_("values over 24 hours not handled by pre-2007 versions of zic"));
sign * (mm * SECSPERMIN + ss));
}
+static zic_t
+getstdoff(char *field, bool *isdst)
+{
+ int dst = -1;
+ zic_t stdoff;
+ size_t fieldlen = strlen(field);
+ if (fieldlen != 0) {
+ char *ep = field + fieldlen - 1;
+ switch (*ep) {
+ case 'd': dst = 1; *ep = '\0'; break;
+ case 's': dst = 0; *ep = '\0'; break;
+ }
+ }
+ stdoff = gethms(field, _("invalid saved time"), true);
+ *isdst = dst < 0 ? stdoff != 0 : dst;
+ return stdoff;
+}
+
static void
inrule(char **fields, int nfields)
{
@@ -1255,7 +1297,7 @@ inrule(char **fields, int nfields)
}
r.r_filename = filename;
r.r_linenum = linenum;
- r.r_stdoff = gethms(fields[RF_STDOFF], _("invalid saved time"), true);
+ r.r_stdoff = getstdoff(fields[RF_STDOFF], &r.r_isdst);
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]);
@@ -2106,7 +2148,7 @@ abbroffset(char *buf, zic_t offset)
static size_t
doabbr(char *abbr, int abbrlen, struct zone const *zp, const char *letters,
- zic_t stdoff, bool doquotes)
+ bool isdst, zic_t stdoff, bool doquotes)
{
char * cp;
char * slashp;
@@ -2121,7 +2163,7 @@ doabbr(char *abbr, int abbrlen, struct zone const *zp, const char *letters,
else if (!letters)
letters = "%s";
snprintf(abbr, abbrlen, format, letters);
- } else if (stdoff != 0) {
+ } else if (isdst) {
strlcpy(abbr, slashp + 1, abbrlen);
} else {
memcpy(abbr, format, slashp - format);
@@ -2232,7 +2274,7 @@ stringrule(char *result, const struct rule *const rp, const zic_t dstoff,
}
if (rp->r_todisgmt)
tod += gmtoff;
- if (rp->r_todisstd && rp->r_stdoff == 0)
+ if (rp->r_todisstd && !rp->r_isdst)
tod += dstoff;
if (tod != 2 * SECSPERMIN * MINSPERHOUR) {
*result++ = '/';
@@ -2290,7 +2332,7 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
continue;
if (rp->r_yrtype != NULL)
continue;
- if (rp->r_stdoff == 0) {
+ if (!rp->r_isdst) {
if (stdrp == NULL)
stdrp = rp;
else return -1;
@@ -2309,7 +2351,7 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
struct rule *stdabbrrp = NULL;
for (i = 0; i < zp->z_nrules; ++i) {
rp = &zp->z_rules[i];
- if (rp->r_stdoff == 0 && rule_cmp(stdabbrrp, rp) < 0)
+ if (!rp->r_isdst && rule_cmp(stdabbrrp, rp) < 0)
stdabbrrp = rp;
if (rule_cmp(stdrp, rp) < 0)
stdrp = rp;
@@ -2322,13 +2364,14 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
if (stdrp != NULL && stdrp->r_hiyear == 2037)
return YEAR_BY_YEAR_ZONE;
- if (stdrp != NULL && stdrp->r_stdoff != 0) {
+ if (stdrp != NULL && stdrp->r_isdst) {
/* Perpetual DST. */
dstr.r_month = TM_JANUARY;
dstr.r_dycode = DC_DOM;
dstr.r_dayofmonth = 1;
dstr.r_tod = 0;
dstr.r_todisstd = dstr.r_todisgmt = false;
+ dstr.r_isdst = stdrp->r_isdst;
dstr.r_stdoff = stdrp->r_stdoff;
dstr.r_abbrvar = stdrp->r_abbrvar;
stdr.r_month = TM_DECEMBER;
@@ -2336,6 +2379,7 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
stdr.r_dayofmonth = 31;
stdr.r_tod = SECSPERDAY + stdrp->r_stdoff;
stdr.r_todisstd = stdr.r_todisgmt = false;
+ stdr.r_isdst = false;
stdr.r_stdoff = 0;
stdr.r_abbrvar
= (stdabbrrp ? stdabbrrp->r_abbrvar : "");
@@ -2343,10 +2387,10 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
stdrp = &stdr;
}
}
- if (stdrp == NULL && (zp->z_nrules != 0 || zp->z_stdoff != 0))
+ if (stdrp == NULL && (zp->z_nrules != 0 || zp->z_isdst))
return -1;
abbrvar = (stdrp == NULL) ? "" : stdrp->r_abbrvar;
- len = doabbr(result, resultlen, zp, abbrvar, 0, true);
+ len = doabbr(result, resultlen, zp, abbrvar, false, 0, true);
offsetlen = stringoffset(result + len, -zp->z_gmtoff);
if (! offsetlen) {
result[0] = '\0';
@@ -2355,7 +2399,8 @@ stringzone(char *result, const int resultlen, const struct zone *const zpfirst,
len += offsetlen;
if (dstrp == NULL)
return compat;
- len += doabbr(result + len, resultlen - len, zp, dstrp->r_abbrvar, dstrp->r_stdoff, true);
+ len += doabbr(result + len, resultlen - len, zp, dstrp->r_abbrvar,
+ dstrp->r_isdst, dstrp->r_stdoff, true);
if (dstrp->r_stdoff != SECSPERMIN * MINSPERHOUR) {
offsetlen = stringoffset(result + len,
-(zp->z_gmtoff + dstrp->r_stdoff));
@@ -2532,7 +2577,7 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
if (zp->z_nrules == 0) {
stdoff = zp->z_stdoff;
doabbr(startbuf, max_abbr_len + 1, zp,
- NULL, stdoff, false);
+ NULL, zp->z_isdst, stdoff, false);
type = addtype(oadd(zp->z_gmtoff, stdoff),
startbuf, stdoff != 0, startttisstd,
startttisgmt);
@@ -2632,6 +2677,7 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
max_abbr_len + 1,
zp,
rp->r_abbrvar,
+ rp->r_isdst,
rp->r_stdoff,
false);
continue;
@@ -2643,6 +2689,7 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
max_abbr_len + 1,
zp,
rp->r_abbrvar,
+ rp->r_isdst,
rp->r_stdoff,
false);
}
@@ -2650,9 +2697,9 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
eats(zp->z_filename, zp->z_linenum,
rp->r_filename, rp->r_linenum);
doabbr(ab, max_abbr_len + 1, zp, rp->r_abbrvar,
- rp->r_stdoff, false);
+ rp->r_isdst, rp->r_stdoff, false);
offset = oadd(zp->z_gmtoff, rp->r_stdoff);
- type = addtype(offset, ab, rp->r_stdoff != 0,
+ type = addtype(offset, ab, rp->r_isdst,
rp->r_todisstd, rp->r_todisgmt);
if (rp->r_hiyear == ZIC_MAX
&& ! (0 <= lastatmax