diff --git a/tz/.gitignore b/tz/.gitignore
index d50d176..e7bb041 100644
--- a/tz/.gitignore
+++ b/tz/.gitignore
@@ -2,12 +2,18 @@
# This file is in the public domain.
*.a
*.asc
+*.ck
+*.ckd/
*.diff
+*.dir/
*.i
*.o
*.orig
*.patch
+*.pdf
+*.ps
*.rej
+*.s
*.tar
*.tar.*
*.txt
@@ -15,13 +21,11 @@
*.zi
*~
ChangeLog
-check_*
date
leapseconds
tzdir.h
tzselect
version
version.h
-yearistype
zdump
zic
diff --git a/tz/CONTRIBUTING b/tz/CONTRIBUTING
index 6d800e4..f6edbd3 100644
--- a/tz/CONTRIBUTING
+++ b/tz/CONTRIBUTING
@@ -23,10 +23,10 @@ such as renaming, adding or removing zones, please read
"Theory and pragmatics of the tz code and data"
.
It is also good to browse the mailing list archives
- for examples of patches that tend
-to work well. Additions to data should contain commentary citing
-reliable sources as justification. Citations should use "https:" URLs
-if available.
+
+for examples of patches that tend to work well.
+Changes should contain commentary citing reliable sources.
+Citations should use "https:" URLs if available.
For changes that fix sensitive security-related bugs, please see the
distribution's 'SECURITY' file.
@@ -63,12 +63,16 @@ If you use Git the following workflow may be helpful:
* Edit source files. Include commentary that justifies the
changes by citing reliable sources.
- * Debug the changes, e.g.:
+ * Debug the changes locally, e.g.:
- make check
- make install
+ make TOPDIR=$PWD/tz clean check install
./zdump -v America/Los_Angeles
+ Although builds assume only basic POSIX, they use extra features
+ if available. 'make check' accesses validator.w3.org unless you
+ lack 'curl' or use 'make CURL=:'. If you have the latest GCC,
+ "make CFLAGS='$(GCC_DEBUG_FLAGS)'" does extra checking.
+
* For each separable change, commit it in the new branch, e.g.:
git add northamerica
diff --git a/tz/Makefile b/tz/Makefile
index d48354c..0087b45 100644
--- a/tz/Makefile
+++ b/tz/Makefile
@@ -3,17 +3,17 @@
# 2009-05-17 by Arthur David Olson.
# Request POSIX conformance; this must be the first non-comment line.
.POSIX:
-# On older platforms you may need to scrounge for a POSIX-conforming 'make'.
-# For example, on Solaris 10 (2005), use /usr/sfw/bin/gmake or
-# /usr/xpg4/bin/make, not /usr/ccs/bin/make.
+# On older platforms you may need to scrounge for POSIX conformance.
+# For example, on Solaris 10 (2005) with Sun Studio 12 aka Sun C 5.9 (2007),
+# use 'PATH=/usr/xpg4/bin:$PATH make CC=c99'.
# To affect how this Makefile works, you can run a shell script like this:
#
# #!/bin/sh
-# make CC='gcc -std=gnu11' "$@"
+# make CC='gcc -std=gnu23' "$@"
#
-# This example script is appropriate for a pre-2017 GNU/Linux system
-# where a non-default setting is needed to support this package's use of C99.
+# This example script is appropriate for a circa 2024 GNU/Linux system
+# where a non-default setting enables this package's optional use of C23.
#
# Alternatively, you can simply edit this Makefile to tailor the following
# macro definitions.
@@ -53,7 +53,7 @@ DATAFORM= main
LOCALTIME= Factory
-# The POSIXRULES macro controls interpretation of POSIX-2017.1-like TZ
+# The POSIXRULES macro controls interpretation of POSIX-like TZ
# settings like TZ='EET-2EEST' that lack DST transition rules.
# If POSIXRULES is '-', no template is installed; this is the default.
# Any other value for POSIXRULES is obsolete and should not be relied on, as:
@@ -132,8 +132,9 @@ LIBDIR = $(TOPDIR)/$(USRDIR)/lib
# Types to try, as an alternative to time_t.
TIME_T_ALTERNATIVES = $(TIME_T_ALTERNATIVES_HEAD) $(TIME_T_ALTERNATIVES_TAIL)
-TIME_T_ALTERNATIVES_HEAD = int_least64_t
-TIME_T_ALTERNATIVES_TAIL = int_least32_t uint_least32_t uint_least64_t
+TIME_T_ALTERNATIVES_HEAD = int_least64_t.ck
+TIME_T_ALTERNATIVES_TAIL = int_least32_t.ck uint_least32_t.ck \
+ uint_least64_t.ck
# What kind of TZif data files to generate. (TZif is the binary time
# zone data format that zic generates; see Internet RFC 8536.)
@@ -219,6 +220,7 @@ LDLIBS=
# than what POSIX specifies, assuming local time is UT.
# For example, N is 252460800 on AmigaOS.
# -DHAVE_DECL_ASCTIME_R=0 if does not declare asctime_r
+# on POSIX platforms predating POSIX.1-2024
# -DHAVE_DECL_ENVIRON if declares 'environ'
# -DHAVE_DECL_TIMEGM=0 if does not declare timegm
# -DHAVE_DIRECT_H if mkdir needs (MS-Windows)
@@ -229,7 +231,7 @@ LDLIBS=
# where LDLIBS also needs to contain -lintl on some hosts;
# -DHAVE_GETTEXT=0 to avoid using gettext
# -DHAVE_INCOMPATIBLE_CTIME_R if your system's time.h declares
-# ctime_r and asctime_r incompatibly with the POSIX standard
+# ctime_r and asctime_r incompatibly with POSIX.1-2017 and earlier
# (Solaris when _POSIX_PTHREAD_SEMANTICS is not defined).
# -DHAVE_INTTYPES_H=0 if does not work*+
# -DHAVE_LINK=0 if your system lacks a link function
@@ -261,8 +263,11 @@ LDLIBS=
# -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
-# -DSUPPORT_C89 if the tzcode library should support C89 callers+
-# However, this might trigger latent bugs in C99-or-later callers.
+# -DSUPPORT_C89=0 if the tzcode library should not support C89 callers
+# Although -DSUPPORT_C89=0 might work around latent bugs in callers,
+# it does not conform to POSIX.
+# -DSUPPORT_POSIX2008 if the library should support older POSIX callers+
+# However, this might cause problems in POSIX.1-2024-or-later callers.
# -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;
@@ -274,7 +279,7 @@ LDLIBS=
# -DTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
# the default is system-supplied, typically "/usr/lib/locale"
# -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
-# DST transitions for POSIX.1-2017-style TZ strings lacking them,
+# DST transitions for proleptic format TZ strings lacking them,
# in the usual case where POSIXRULES is '-'. If not specified,
# TZDEFRULESTRING defaults to US rules for future DST transitions.
# This mishandles some past timestamps, as US DST rules have changed.
@@ -302,23 +307,25 @@ LDLIBS=
#
# * Options marked "*" can be omitted if your compiler is C23 compatible.
# * Options marked "+" are obsolescent and are planned to be removed
-# once the code assumes C99 or later, say in the year 2029.
+# once the code assumes C99 or later (say in the year 2029)
+# and POSIX.1-2024 or later (say in the year 2034).
#
# Select instrumentation via "make GCC_INSTRUMENT='whatever'".
GCC_INSTRUMENT = \
-fsanitize=undefined -fsanitize-address-use-after-scope \
-fsanitize-undefined-trap-on-error -fstack-protector
# Omit -fanalyzer from GCC_DEBUG_FLAGS, as it makes GCC too slow.
-GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
+GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 \
$(GCC_INSTRUMENT) \
-Wall -Wextra \
-Walloc-size-larger-than=100000 -Warray-bounds=2 \
-Wbad-function-cast -Wbidi-chars=any,ucn -Wcast-align=strict -Wdate-time \
-Wdeclaration-after-statement -Wdouble-promotion \
- -Wduplicated-branches -Wduplicated-cond \
+ -Wduplicated-branches -Wduplicated-cond -Wflex-array-member-not-at-end \
-Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \
-Wimplicit-fallthrough=5 -Winit-self -Wlogical-op \
- -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \
+ -Wmissing-declarations -Wmissing-prototypes \
+ -Wmissing-variable-declarations -Wnested-externs \
-Wnull-dereference \
-Wold-style-definition -Woverlength-strings -Wpointer-arith \
-Wshadow -Wshift-overflow=2 -Wstrict-overflow \
@@ -327,10 +334,9 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
-Wsuggest-attribute=const -Wsuggest-attribute=format \
-Wsuggest-attribute=malloc \
-Wsuggest-attribute=noreturn -Wsuggest-attribute=pure \
- -Wtrampolines -Wundef -Wuninitialized -Wunused-macros -Wuse-after-free=3 \
+ -Wtrampolines -Wundef -Wunused-macros -Wuse-after-free=3 \
-Wvariadic-macros -Wvla -Wwrite-strings \
- -Wno-address -Wno-format-nonliteral -Wno-sign-compare \
- -Wno-type-limits
+ -Wno-format-nonliteral -Wno-sign-compare
#
# If your system has a "GMT offset" field in its "struct tm"s
# (or if you decide to add such a field in your system's "time.h" file),
@@ -341,9 +347,8 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
# Similarly, if your system has a "zone abbreviation" field, define
# -DTM_ZONE=tm_zone
# and define NO_TM_ZONE to suppress any guessing.
-# Although these two fields are not required by POSIX.1-2017,
-# POSIX 202x/D4 requires them and they are widely available
-# on GNU/Linux and BSD systems.
+# Although POSIX.1-2024 requires these fields and they are widely available
+# on GNU/Linux and BSD systems, some older systems lack them.
#
# The next batch of options control support for external variables
# exported by tzcode. In practice these variables are less useful
@@ -353,7 +358,9 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
# # -DHAVE_TZNAME=0 # do not support "tzname"
# # -DHAVE_TZNAME=1 # support "tzname", which is defined by system library
# # -DHAVE_TZNAME=2 # support and define "tzname"
-# # to the "CFLAGS=" line. "tzname" is required by POSIX.1-1988 and later.
+# # to the "CFLAGS=" line. Although "tzname" is required by POSIX.1-1988
+# # and later, its contents are unspecified if you use a geographical TZ
+# # and the variable is planned to be removed in a future POSIX edition.
# # If not defined, the code attempts to guess HAVE_TZNAME from other macros.
# # Warning: unless time_tz is also defined, HAVE_TZNAME=1 can cause
# # crashes when combined with some platforms' standard libraries,
@@ -364,7 +371,9 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
# # -DUSG_COMPAT=1 # support, and variables are defined by system library
# # -DUSG_COMPAT=2 # support and define variables
# # to the "CFLAGS=" line; "timezone" and "daylight" are inspired by Unix
-# # Systems Group code and are required by POSIX.1-2008 and later (with XSI).
+# # Systems Group code and are required by POSIX.1-2008 and later (with XSI),
+# # although their contents are unspecified if you use a geographical TZ
+# # and the variables are planned to be removed in a future edition of POSIX.
# # If not defined, the code attempts to guess USG_COMPAT from other macros.
# #
# # To support the external variable "altzone", add
@@ -428,18 +437,13 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \
# The name of a POSIX-like library archiver, its flags, C compiler,
# linker flags, and 'make' utility. Ordinarily the defaults suffice.
-# The commented-out values are the defaults specified by POSIX.1-202x/D4.
+# The commented-out values are the defaults specified by POSIX.1-2024.
#AR = ar
#ARFLAGS = -rv
#CC = c17
#LDFLAGS =
#MAKE = make
-# For leap seconds, this Makefile uses LEAPSECONDS='-L leapseconds' in
-# submake command lines. The default is no leap seconds.
-
-LEAPSECONDS=
-
# Where to fetch leap-seconds.list from.
leaplist_URI = \
https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list
@@ -461,7 +465,7 @@ ZFLAGS=
# How to use zic to install TZif files.
-ZIC_INSTALL= $(ZIC) -d '$(DESTDIR)$(TZDIR)' $(LEAPSECONDS)
+ZIC_INSTALL= $(ZIC) -d '$(DESTDIR)$(TZDIR)'
# The name of a POSIX-compliant 'awk' on your system.
# mawk 1.3.3 and Solaris 10 /usr/bin/awk do not work.
@@ -480,6 +484,7 @@ KSHELL= /bin/bash
# Name of curl , used for HTML validation
# and to fetch leap-seconds.list from upstream.
+# Set CURL=: to disable use of the Internet.
CURL= curl
# Name of GNU Privacy Guard , used to sign distributions.
@@ -533,21 +538,28 @@ OK_LINE= '^'$(OK_CHAR)'*$$'
# Flags to give 'tar' when making a distribution.
# Try to use flags appropriate for GNU tar.
-GNUTARFLAGS= --format=pax --pax-option='delete=atime,delete=ctime' \
+GNUTARFLAGS= --format=pax --pax-option=delete=atime,delete=ctime \
--numeric-owner --owner=0 --group=0 \
--mode=go+u,go-w --sort=name
-TARFLAGS= `if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; \
- then echo $(GNUTARFLAGS); \
- else :; \
- fi`
+SETUP_TAR= \
+ export LC_ALL=C && \
+ if tar $(GNUTARFLAGS) --version >/dev/null 2>&1; then \
+ TAR='tar $(GNUTARFLAGS)'; \
+ else \
+ TAR=tar; \
+ fi
# Flags to give 'gzip' when making a distribution.
GZIPFLAGS= -9n
# When comparing .tzs files, use GNU diff's -F'^TZ=' option if supported.
# This makes it easier to see which Zone has been affected.
-DIFF_TZS= diff -u$$(! diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1 \
- || echo ' -F^TZ=')
+SETUP_DIFF_TZS = \
+ if diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1; then \
+ DIFF_TZS='diff -u -F^TZ='; \
+ else \
+ DIFF_TZS='diff -u'; \
+ fi
# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
RANLIB= :
@@ -561,8 +573,8 @@ RANLIB= :
TZCOBJS= zic.o
-TZDOBJS= zdump.o localtime.o asctime.o strftime.o
-DATEOBJS= date.o localtime.o strftime.o asctime.o
+TZDOBJS= zdump.o localtime.o strftime.o
+DATEOBJS= date.o localtime.o strftime.o
LIBSRCS= localtime.c asctime.c difftime.c strftime.c
LIBOBJS= localtime.o asctime.o difftime.o strftime.o
HEADERS= tzfile.h private.h
@@ -579,8 +591,7 @@ MANTXTS= newctime.3.txt newstrftime.3.txt newtzset.3.txt \
COMMON= calendars CONTRIBUTING LICENSE Makefile \
NEWS README SECURITY theory.html version
WEB_PAGES= tz-art.html tz-how-to.html tz-link.html
-CHECK_WEB_PAGES=check_theory.html check_tz-art.html \
- check_tz-how-to.html check_tz-link.html
+CHECK_WEB_PAGES=theory.ck tz-art.ck tz-how-to.ck tz-link.ck
DOCS= $(MANS) date.1 $(MANTXTS) $(WEB_PAGES)
PRIMARY_YDATA= africa antarctica asia australasia \
europe northamerica southamerica
@@ -641,8 +652,7 @@ install: all $(DATA) $(REDO) $(MANS)
'$(DESTDIR)$(MANDIR)/man3' '$(DESTDIR)$(MANDIR)/man5' \
'$(DESTDIR)$(MANDIR)/man8'
$(ZIC_INSTALL) -l $(LOCALTIME) \
- `case '$(POSIXRULES)' in ?*) echo '-p';; esac \
- ` $(POSIXRULES) \
+ -p $(POSIXRULES) \
-t '$(DESTDIR)$(TZDEFAULT)'
cp -f $(TABDATA) '$(DESTDIR)$(TZDIR)/.'
cp tzselect '$(DESTDIR)$(BINDIR)/.'
@@ -665,10 +675,10 @@ INSTALL: ALL install date.1
# and append "-dirty" if the contents do not already end in "-dirty".
version: $(VERSION_DEPS)
{ (type git) >/dev/null 2>&1 && \
- V=`git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
- --abbrev=7 --dirty` || \
- if test '$(VERSION)' = unknown && V=`cat $@`; then \
- case $$V in *-dirty);; *) V=$$V-dirty;; esac; \
+ V=$$(git describe --match '[0-9][0-9][0-9][0-9][a-z]*' \
+ --abbrev=7 --dirty) || \
+ if test '$(VERSION)' = unknown && read -r V <$@; then \
+ V=$${V%-dirty}-dirty; \
else \
V='$(VERSION)'; \
fi; } && \
@@ -678,7 +688,7 @@ version: $(VERSION_DEPS)
# These files can be tailored by setting BACKWARD, PACKRATDATA, PACKRATLIST.
vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
$(AWK) \
- -v DATAFORM=`expr $@ : '\(.*\).zi'` \
+ -v DATAFORM=$(@:.zi=) \
-v PACKRATDATA='$(PACKRATDATA)' \
-v PACKRATLIST='$(PACKRATLIST)' \
-f ziguard.awk \
@@ -687,7 +697,7 @@ vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
# This file has a version comment that attempts to capture any tailoring
# via BACKWARD, DATAFORM, PACKRATDATA, PACKRATLIST, and REDO.
tzdata.zi: $(DATAFORM).zi version zishrink.awk
- version=`sed 1q version` && \
+ read -r version $@
+ ./zdump -i $(TZS_CUTOFF_FLAG) "$$PWD/$(@:.zd=)" >$@
TZS_NEW_DEPS = tzdata.zi zdump zic
$(TZS_NEW): $(TZS_NEW_DEPS)
@@ -812,20 +815,19 @@ $(TZS_NEW): $(TZS_NEW_DEPS)
$(zic) -d tzs$(TZS_YEAR).dir tzdata.zi
$(AWK) '/^L/{print "Link\t" $$2 "\t" $$3}' \
tzdata.zi | LC_ALL=C sort >$@.out
- wd=`pwd` && \
- x=`$(AWK) '/^Z/{print "tzs$(TZS_YEAR).dir/" $$2 ".zd"}' \
+ x=$$($(AWK) '/^Z/{print "tzs$(TZS_YEAR).dir/" $$2 ".zd"}' \
tzdata.zi \
- | LC_ALL=C sort -t . -k 2,2` && \
+ | LC_ALL=C sort -t . -k 2,2) && \
set x $$x && \
shift && \
ZDS=$$* && \
- $(MAKE) wd="$$wd" TZS_CUTOFF_FLAG="$(TZS_CUTOFF_FLAG)" \
+ $(MAKE) TZS_CUTOFF_FLAG="$(TZS_CUTOFF_FLAG)" \
ZDS="$$ZDS" $$ZDS && \
sed 's,^TZ=".*\.dir/,TZ=",' $$ZDS >>$@.out
rm -fr tzs$(TZS_YEAR).dir
mv $@.out $@
-# If $(TZS) exists but 'make check_tzs' fails, a maintainer should inspect the
+# If $(TZS) exists but 'make tzs.ck' fails, a maintainer should inspect the
# failed output and fix the inconsistency, perhaps by running 'make force_tzs'.
$(TZS):
touch $@
@@ -842,7 +844,7 @@ date: $(DATEOBJS)
$(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(DATEOBJS) $(LDLIBS)
tzselect: tzselect.ksh version
- VERSION=`cat version` && sed \
+ read -r VERSION /dev/null 2>&1 \
- || { LC_ALL='$(UTF8_LOCALE)'; export LC_ALL; false; }; }
+ || { export LC_ALL='$(UTF8_LOCALE)'; false; }; }
-check_character_set: $(ENCHILADA)
+character-set.ck: $(ENCHILADA)
$(UTF8_LOCALE_MISSING) || { \
sharp='#' && \
! grep -Env $(SAFE_LINE) $(MANS) date.1 $(MANTXTS) \
@@ -882,48 +884,55 @@ check_character_set: $(ENCHILADA)
}
touch $@
-check_white_space: $(ENCHILADA)
+white-space.ck: $(ENCHILADA)
$(UTF8_LOCALE_MISSING) || { \
- patfmt=' \t|[\f\r\v]' && pat=`printf "$$patfmt\\n"` && \
+ enchilada='$(ENCHILADA)' && \
+ patfmt=' \t|[\f\r\v]' && pat=$$(printf "$$patfmt\\n") && \
! grep -En "$$pat|[$s]\$$" \
- $$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list); \
+ $${enchilada%leap-seconds.list*} \
+ $${enchilada#*leap-seconds.list}; \
}
touch $@
PRECEDES_FILE_NAME = ^(Zone|Link[$s]+[^$s]+)[$s]+
FILE_NAME_COMPONENT_TOO_LONG = $(PRECEDES_FILE_NAME)[^$s]*[^/$s]{15}
-check_name_lengths: $(TDATA_TO_CHECK) backzone
- ! grep -En '$(FILE_NAME_COMPONENT_TOO_LONG)' \
+name-lengths.ck: $(TDATA_TO_CHECK) backzone
+ :;! grep -En '$(FILE_NAME_COMPONENT_TOO_LONG)' \
$(TDATA_TO_CHECK) backzone
touch $@
+mainguard.ck: main.zi
+ test '$(PACKRATLIST)' || \
+ cat $(TDATA) $(PACKRATDATA) | diff -u - main.zi
+ touch $@
+
PRECEDES_STDOFF = ^(Zone[$s]+[^$s]+)?[$s]+
STDOFF = [-+]?[0-9:.]+
RULELESS_SAVE = (-|$(STDOFF)[sd]?)
RULELESS_SLASHED_ABBRS = \
$(PRECEDES_STDOFF)$(STDOFF)[$s]+$(RULELESS_SAVE)[$s]+[^$s]*/
-check_slashed_abbrs: $(TDATA_TO_CHECK)
- ! grep -En '$(RULELESS_SLASHED_ABBRS)' $(TDATA_TO_CHECK)
+slashed-abbrs.ck: $(TDATA_TO_CHECK)
+ :;! grep -En '$(RULELESS_SLASHED_ABBRS)' $(TDATA_TO_CHECK)
touch $@
CHECK_CC_LIST = { n = split($$1,a,/,/); for (i=2; i<=n; i++) print a[1], a[i]; }
-check_sorted: backward backzone
+sorted.ck: backward backzone
$(AWK) '/^Link/ {printf "%.5d %s\n", g, $$3} !/./ {g++}' \
backward | LC_ALL=C sort -cu
- $(AWK) '/^Zone/ {print $$2}' backzone | LC_ALL=C sort -cu
+ $(AWK) '/^Zone.*\// {print $$2}' backzone | LC_ALL=C sort -cu
touch $@
-check_back: checklinks.awk $(TDATA_TO_CHECK)
+back.ck: checklinks.awk $(TDATA_TO_CHECK)
$(AWK) \
-v DATAFORM=$(DATAFORM) \
-v backcheck=backward \
-f checklinks.awk $(TDATA_TO_CHECK)
touch $@
-check_links: checklinks.awk tzdata.zi
+links.ck: checklinks.awk tzdata.zi
$(AWK) \
-v DATAFORM=$(DATAFORM) \
-f checklinks.awk tzdata.zi
@@ -932,26 +941,36 @@ check_links: checklinks.awk tzdata.zi
# Check timestamps from now through 28 years from now, to make sure
# that zonenow.tab contains all sequences of planned timestamps,
# without any duplicate sequences. In theory this might require
-# 2800 years but that would take a long time to check.
-CHECK_NOW_TIMESTAMP = `./date +%s`
+# 2800+ years but that would take a long time to check.
+CHECK_NOW_TIMESTAMP = $$(./date +%s)
CHECK_NOW_FUTURE_YEARS = 28
-CHECK_NOW_FUTURE_SECS = $(CHECK_NOW_FUTURE_YEARS) '*' 366 '*' 24 '*' 60 '*' 60
-check_now: checknow.awk date tzdata.zi zdump zic zone1970.tab zonenow.tab
- rm -fr $@.dir
- mkdir $@.dir
- ./zic -d $@.dir tzdata.zi
+CHECK_NOW_FUTURE_SECS = $(CHECK_NOW_FUTURE_YEARS) * 366 * 24 * 60 * 60
+now.ck: checknow.awk date tzdata.zi zdump zic zone1970.tab zonenow.tab
+ rm -fr $@d
+ mkdir $@d
+ ./zic -d $@d tzdata.zi
now=$(CHECK_NOW_TIMESTAMP) && \
- future=`expr $(CHECK_NOW_FUTURE_SECS) + $$now` && \
+ future=$$(($(CHECK_NOW_FUTURE_SECS) + $$now)) && \
./zdump -i -t $$now,$$future \
- $$(find $$PWD/$@.dir/????*/ -type f) \
- >$@.dir/zdump.tab
+ $$(find "$$PWD/$@d"/????*/ -type f) \
+ >$@d/zdump-now.tab && \
+ ./zdump -i -t 0,$$future \
+ $$(find "$$PWD/$@d" -name Etc -prune \
+ -o -type f ! -name '*.tab' -print) \
+ >$@d/zdump-1970.tab
$(AWK) \
- -v zdump_table=$@.dir/zdump.tab \
+ -v zdump_table=$@d/zdump-now.tab \
-f checknow.awk zonenow.tab
- rm -fr $@.dir
+ $(AWK) \
+ 'BEGIN {print "-\t-\tUTC"} /^Zone/ {print "-\t-\t" $$2}' \
+ $(PRIMARY_YDATA) backward factory | \
+ $(AWK) \
+ -v zdump_table=$@d/zdump-1970.tab \
+ -f checknow.awk
+ rm -fr $@d
touch $@
-check_tables: checktab.awk $(YDATA) backward zone.tab zone1970.tab
+tables.ck: checktab.awk $(YDATA) backward zone.tab zone1970.tab
for tab in $(ZONETABLES); do \
test "$$tab" = zone.tab && links='$(BACKWARD)' || links=''; \
$(AWK) -f checktab.awk -v zone_table=$$tab $(YDATA) $$links \
@@ -959,26 +978,24 @@ check_tables: checktab.awk $(YDATA) backward zone.tab zone1970.tab
done
touch $@
-check_tzs: $(TZS) $(TZS_NEW)
+tzs.ck: $(TZS) $(TZS_NEW)
if test -s $(TZS); then \
- $(DIFF_TZS) $(TZS) $(TZS_NEW); \
+ $(SETUP_DIFF_TZS) && $$DIFF_TZS $(TZS) $(TZS_NEW); \
else \
cp $(TZS_NEW) $(TZS); \
fi
touch $@
check_web: $(CHECK_WEB_PAGES)
-check_theory.html: theory.html
-check_tz-art.html: tz-art.html
-check_tz-how-to.html: tz-how-to.html
-check_tz-link.html: tz-link.html
-check_theory.html check_tz-art.html check_tz-how-to.html check_tz-link.html:
- $(CURL) -sS --url https://validator.w3.org/nu/ -F out=gnu \
- -F file=@$$(expr $@ : 'check_\(.*\)') -o $@.out && \
+.SUFFIXES: .ck .html
+.html.ck:
+ { ! ($(CURL) --version) >/dev/null 2>&1 || \
+ $(CURL) -sS --url https://validator.w3.org/nu/ -F out=gnu \
+ -F file=@$<; } >$@.out && \
test ! -s $@.out || { cat $@.out; exit 1; }
mv $@.out $@
-check_ziguard: rearguard.zi vanguard.zi ziguard.awk
+ziguard.ck: rearguard.zi vanguard.zi ziguard.awk
$(AWK) -v DATAFORM=rearguard -f ziguard.awk vanguard.zi | \
diff -u rearguard.zi -
$(AWK) -v DATAFORM=vanguard -f ziguard.awk rearguard.zi | \
@@ -987,36 +1004,35 @@ check_ziguard: rearguard.zi vanguard.zi ziguard.awk
# Check that zishrink.awk does not alter the data, and that ziguard.awk
# preserves main-format data.
-check_zishrink: check_zishrink_posix check_zishrink_right
-check_zishrink_posix check_zishrink_right: \
+check_zishrink: zishrink-posix.ck zishrink-right.ck
+zishrink-posix.ck zishrink-right.ck: \
zic leapseconds $(PACKRATDATA) $(PACKRATLIST) \
$(TDATA) $(DATAFORM).zi tzdata.zi
- rm -fr $@.dir $@-t.dir $@-shrunk.dir
- mkdir $@.dir $@-t.dir $@-shrunk.dir
+ rm -fr $@d t-$@d shrunk-$@d
+ mkdir $@d t-$@d shrunk-$@d
case $@ in \
- *_right) leap='-L leapseconds';; \
+ *right*) leap='-L leapseconds';; \
*) leap=;; \
esac && \
- $(ZIC) $$leap -d $@.dir $(DATAFORM).zi && \
- $(ZIC) $$leap -d $@-shrunk.dir tzdata.zi && \
+ $(ZIC) $$leap -d $@d $(DATAFORM).zi && \
+ $(ZIC) $$leap -d shrunk-$@d tzdata.zi && \
case $(DATAFORM),$(PACKRATLIST) in \
main,) \
- $(ZIC) $$leap -d $@-t.dir $(TDATA) && \
+ $(ZIC) $$leap -d t-$@d $(TDATA) && \
$(AWK) '/^Rule/' $(TDATA) | \
- $(ZIC) $$leap -d $@-t.dir - $(PACKRATDATA) && \
- diff -r $@.dir $@-t.dir;; \
+ $(ZIC) $$leap -d t-$@d - $(PACKRATDATA) && \
+ diff -r $@d t-$@d;; \
esac
- diff -r $@.dir $@-shrunk.dir
- rm -fr $@.dir $@-t.dir $@-shrunk.dir
+ diff -r $@d shrunk-$@d
+ rm -fr $@d t-$@d shrunk-$@d
touch $@
clean_misc:
- rm -fr check_*.dir typecheck_*.dir
- rm -f *.o *.out $(TIME_T_ALTERNATIVES) \
- check_* core typecheck_* \
+ rm -fr *.ckd *.dir
+ rm -f *.ck *.core *.o *.out core core.* \
date tzdir.h tzselect version.h zdump zic libtz.a
clean: clean_misc
- rm -fr *.dir tzdb-*/
+ rm -fr tzdb-*/
rm -f *.zi $(TZS_NEW)
maintainer-clean: clean
@@ -1027,7 +1043,7 @@ maintainer-clean: clean
names:
@echo $(ENCHILADA)
-public: check check_public $(CHECK_TIME_T_ALTERNATIVES) \
+public: check public.ck $(CHECK_TIME_T_ALTERNATIVES) \
tarballs signatures
date.1.txt: date.1
@@ -1041,7 +1057,7 @@ zdump.8.txt: zdump.8
zic.8.txt: zic.8
$(MANTXTS): workman.sh
- LC_ALL=C sh workman.sh `expr $@ : '\(.*\)\.txt$$'` >$@.out
+ LC_ALL=C sh workman.sh $(@:.txt=) >$@.out
mv $@.out $@
# Set file timestamps deterministically if possible,
@@ -1054,13 +1070,13 @@ SET_TIMESTAMP_N = sh -c '\
n=$$0 dest=$$1; shift; \
<"$$dest" && \
if test $$n != 0 && \
- lsout=`ls -nt --time-style="+%s" "$$@" 2>/dev/null`; then \
+ lsout=$$(ls -nt --time-style="+%s" "$$@" 2>/dev/null); then \
set x $$lsout && \
- timestamp=`expr $$7 + $$n` && \
+ timestamp=$$(($$7 + $$n)) && \
echo "+ touch -md @$$timestamp $$dest" && \
touch -md @$$timestamp "$$dest"; \
else \
- newest=`ls -t "$$@" | sed 1q` && \
+ newest=$$(ls -t "$$@" | sed 1q) && \
echo "+ touch -mr $$newest $$dest" && \
touch -mr "$$newest" "$$dest"; \
fi'
@@ -1083,15 +1099,15 @@ SET_TIMESTAMP_DEP = $(SET_TIMESTAMP_N) 1
set-timestamps.out: $(EIGHT_YARDS)
rm -f $@
if (type git) >/dev/null 2>&1 && \
- files=`git ls-files $(EIGHT_YARDS)` && \
+ files=$$(git ls-files $(EIGHT_YARDS)) && \
touch -md @1 test.out; then \
rm -f test.out && \
for file in $$files; do \
if git diff --quiet $$file; then \
- time=`TZ=UTC0 git log -1 \
+ time=$$(TZ=UTC0 git log -1 \
--format='tformat:%cd' \
--date='format:%Y-%m-%dT%H:%M:%SZ' \
- $$file` && \
+ $$file) && \
echo "+ touch -md $$time $$file" && \
touch -md $$time $$file; \
else \
@@ -1100,8 +1116,8 @@ set-timestamps.out: $(EIGHT_YARDS)
done; \
fi
$(SET_TIMESTAMP_DEP) leapseconds $(LEAP_DEPS)
- for file in `ls $(MANTXTS) | sed 's/\.txt$$//'`; do \
- $(SET_TIMESTAMP_DEP) $$file.txt $$file workman.sh || \
+ for file in $(MANTXTS); do \
+ $(SET_TIMESTAMP_DEP) $$file $${file%.txt} workman.sh || \
exit; \
done
$(SET_TIMESTAMP_DEP) version $(VERSION_DEPS)
@@ -1114,30 +1130,29 @@ set-tzs-timestamp.out: $(TZS)
# The zics below ensure that each data file can stand on its own.
# We also do an all-files run to catch links to links.
-check_public: $(VERSION_DEPS)
- rm -fr public.dir
- mkdir public.dir
- ln $(VERSION_DEPS) public.dir
- cd public.dir \
+public.ck: $(VERSION_DEPS)
+ rm -fr $@d
+ mkdir $@d
+ ln $(VERSION_DEPS) $@d
+ cd $@d \
&& $(MAKE) CFLAGS='$(GCC_DEBUG_FLAGS)' TZDIR='$(TZDIR)' ALL
- for i in $(TDATA_TO_CHECK) public.dir/tzdata.zi \
- public.dir/vanguard.zi public.dir/main.zi \
- public.dir/rearguard.zi; \
+ for i in $(TDATA_TO_CHECK) \
+ tzdata.zi vanguard.zi main.zi rearguard.zi; \
do \
- public.dir/zic -v -d public.dir/zoneinfo $$i 2>&1 || exit; \
+ $@d/zic -v -d $@d/zoneinfo $@d/$$i || exit; \
done
- public.dir/zic -v -d public.dir/zoneinfo-all $(TDATA_TO_CHECK)
+ $@d/zic -v -d $@d/zoneinfo-all $(TDATA_TO_CHECK)
:
: Also check 'backzone' syntax.
- rm public.dir/main.zi
- cd public.dir && $(MAKE) PACKRATDATA=backzone main.zi
- public.dir/zic -d public.dir/zoneinfo main.zi
- rm public.dir/main.zi
- cd public.dir && \
+ rm $@d/main.zi
+ cd $@d && $(MAKE) PACKRATDATA=backzone main.zi
+ $@d/zic -d $@d/zoneinfo main.zi
+ rm $@d/main.zi
+ cd $@d && \
$(MAKE) PACKRATDATA=backzone PACKRATLIST=zone.tab main.zi
- public.dir/zic -d public.dir/zoneinfo main.zi
+ $@d/zic -d $@d/zoneinfo main.zi
:
- rm -fr public.dir
+ rm -fr $@d
touch $@
# Check that the code works under various alternative
@@ -1145,46 +1160,47 @@ check_public: $(VERSION_DEPS)
check_time_t_alternatives: $(TIME_T_ALTERNATIVES)
$(TIME_T_ALTERNATIVES_TAIL): $(TIME_T_ALTERNATIVES_HEAD)
$(TIME_T_ALTERNATIVES): $(VERSION_DEPS)
- rm -fr $@.dir
- mkdir $@.dir
- ln $(VERSION_DEPS) $@.dir
+ rm -fr $@d
+ mkdir $@d
+ ln $(VERSION_DEPS) $@d
case $@ in \
- int*32_t) range=-2147483648,2147483648;; \
+ *32_t*) range=-2147483648,2147483648;; \
u*) range=0,4294967296;; \
*) range=-4294967296,4294967296;; \
esac && \
- wd=`pwd` && \
- zones=`$(AWK) '/^[^#]/ { print $$3 }' /dev/null; then \
quiet_option='-q'; \
else \
quiet_option=''; \
fi && \
- diff $$quiet_option -r $(TIME_T_ALTERNATIVES_HEAD).dir/etc \
- $@.dir/etc && \
+ diff $$quiet_option -r $(TIME_T_ALTERNATIVES_HEAD)d/etc \
+ $@d/etc && \
diff $$quiet_option -r \
- $(TIME_T_ALTERNATIVES_HEAD).dir/usr/share \
- $@.dir/usr/share; \
+ $(TIME_T_ALTERNATIVES_HEAD)d/usr/share \
+ $@d/usr/share; \
}
touch $@
@@ -1199,7 +1215,7 @@ ALL_ASC = $(TRADITIONAL_ASC) $(REARGUARD_ASC) \
tarballs rearguard_tarballs tailored_tarballs traditional_tarballs \
signatures rearguard_signatures traditional_signatures: \
version set-timestamps.out rearguard.zi vanguard.zi
- VERSION=`cat version` && \
+ read -r VERSION $@.out
mv $@.out $@
tzdata$(VERSION).tar.gz: set-timestamps.out
- LC_ALL=C && export LC_ALL && \
- tar $(TARFLAGS) -cf - $(TZDATA_DIST) | \
+ $(SETUP_TAR) && \
+ $$TAR -cf - $(TZDATA_DIST) | \
gzip $(GZIPFLAGS) >$@.out
mv $@.out $@
@@ -1251,9 +1267,9 @@ tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out
: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
$(CREATE_EMPTY) $@.dir/pacificnew
touch -mr version $@.dir/version
- LC_ALL=C && export LC_ALL && \
+ $(SETUP_TAR) && \
(cd $@.dir && \
- tar $(TARFLAGS) -cf - \
+ $$TAR -cf - \
$(TZDATA_DIST) pacificnew | \
gzip $(GZIPFLAGS)) >$@.out
mv $@.out $@
@@ -1269,9 +1285,14 @@ tzdata$(VERSION)-tailored.tar.gz: set-timestamps.out
rm -fr $@.dir
mkdir $@.dir
: The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
+ if test $(DATAFORM) = vanguard; then \
+ pacificnew=; \
+ else \
+ pacificnew=pacificnew; \
+ fi && \
cd $@.dir && \
$(CREATE_EMPTY) $(PRIMARY_YDATA) $(NDATA) backward \
- `test $(DATAFORM) = vanguard || echo pacificnew`
+ $$pacificnew
(grep '^#' tzdata.zi && echo && cat $(DATAFORM).zi) \
>$@.dir/etcetera
touch -mr tzdata.zi $@.dir/etcetera
@@ -1291,9 +1312,9 @@ tzdata$(VERSION)-tailored.tar.gz: set-timestamps.out
test -f $@.dir/$$file || links="$$links $$file"; \
done && \
ln $$links $@.dir
- LC_ALL=C && export LC_ALL && \
+ $(SETUP_TAR) && \
(cd $@.dir && \
- tar $(TARFLAGS) -cf - * | gzip $(GZIPFLAGS)) >$@.out
+ $$TAR -cf - * | gzip $(GZIPFLAGS)) >$@.out
mv $@.out $@
tzdb-$(VERSION).tar.lz: set-timestamps.out set-tzs-timestamp.out
@@ -1301,8 +1322,8 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out set-tzs-timestamp.out
mkdir tzdb-$(VERSION)
ln $(ENCHILADA) tzdb-$(VERSION)
$(SET_TIMESTAMP) tzdb-$(VERSION) tzdb-$(VERSION)/*
- LC_ALL=C && export LC_ALL && \
- tar $(TARFLAGS) -cf - tzdb-$(VERSION) | lzip -9 >$@.out
+ $(SETUP_TAR) && \
+ $$TAR -cf - tzdb-$(VERSION) | lzip -9 >$@.out
mv $@.out $@
tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
@@ -1313,22 +1334,21 @@ $(ALL_ASC):
$(GPG) --armor --detach-sign $?
TYPECHECK_CFLAGS = $(CFLAGS) -DTYPECHECK -D__time_t_defined -D_TIME_T
-typecheck: typecheck_long_long typecheck_unsigned
-typecheck_long_long typecheck_unsigned: $(VERSION_DEPS)
- rm -fr $@.dir
- mkdir $@.dir
- ln $(VERSION_DEPS) $@.dir
- cd $@.dir && \
+typecheck: long-long.ck unsigned.ck
+long-long.ck unsigned.ck: $(VERSION_DEPS)
+ rm -fr $@d
+ mkdir $@d
+ ln $(VERSION_DEPS) $@d
+ cd $@d && \
case $@ in \
- *_long_long) i="long long";; \
- *_unsigned ) i="unsigned" ;; \
+ long-long.*) i="long long";; \
+ unsigned.* ) i="unsigned" ;; \
esac && \
- typecheck_cflags='' && \
$(MAKE) \
CFLAGS="$(TYPECHECK_CFLAGS) \"-Dtime_t=$$i\"" \
- TOPDIR="`pwd`" \
+ TOPDIR="$$PWD" \
install
- $@.dir/zdump -i -c 1970,1971 Europe/Rome
+ $@d/zdump -i -c 1970,1971 Europe/Rome
touch $@
zonenames: tzdata.zi
@@ -1347,7 +1367,7 @@ zic.o: private.h tzfile.h tzdir.h version.h
.PHONY: check_web check_zishrink
.PHONY: clean clean_misc commit-leap-seconds.list dummy.zd
.PHONY: fetch-leap-seconds.list force_tzs
-.PHONY: install install_data maintainer-clean names
+.PHONY: install maintainer-clean names
.PHONY: posix_only posix_right public
.PHONY: rearguard_signatures rearguard_signatures_version
.PHONY: rearguard_tarballs rearguard_tarballs_version
diff --git a/tz/NEWS b/tz/NEWS
index d407342..83b8b8c 100644
--- a/tz/NEWS
+++ b/tz/NEWS
@@ -1,5 +1,125 @@
News for the tz database
+Release 2024b - 2024-09-04 12:27:47 -0700
+
+ Briefly:
+ Improve historical data for Mexico, Mongolia, and Portugal.
+ System V names are now obsolescent.
+ The main data form now uses %z.
+ The code now conforms to RFC 8536 for early timestamps.
+ Support POSIX.1-2024, which removes asctime_r and ctime_r.
+ Assume POSIX.2-1992 or later for shell scripts.
+ SUPPORT_C89 now defaults to 1.
+
+ Changes to past timestamps
+
+ Asia/Choibalsan is now an alias for Asia/Ulaanbaatar rather than
+ being a separate Zone with differing behavior before April 2008.
+ This seems better given our wildly conflicting information about
+ Mongolia's time zone history. (Thanks to Heitor David Pinto.)
+
+ Historical transitions for Mexico have been updated based on
+ official Mexican decrees. The affected timestamps occur during
+ the years 1921-1927, 1931, 1945, 1949-1970, and 1981-1997.
+ The affected zones are America/Bahia_Banderas, America/Cancun,
+ America/Chihuahua, America/Ciudad_Juarez, America/Hermosillo,
+ America/Mazatlan, America/Merida, America/Mexico_City,
+ America/Monterrey, America/Ojinaga, and America/Tijuana.
+ (Thanks to Heitor David Pinto.)
+
+ Historical transitions for Portugal, represented by Europe/Lisbon,
+ Atlantic/Azores, and Atlantic/Madeira, have been updated based on a
+ close reading of old Portuguese legislation, replacing previous data
+ mainly originating from Whitman and Shanks & Pottenger. These
+ changes affect a few transitions in 1917-1921, 1924, and 1940
+ throughout these regions by a few hours or days, and various
+ timestamps between 1977 and 1993 depending on the region. In
+ particular, the Azores and Madeira did not observe DST from 1977 to
+ 1981. Additionally, the adoption of standard zonal time in former
+ Portuguese colonies have been adjusted: Africa/Maputo in 1909, and
+ Asia/Dili by 22 minutes at the start of 1912.
+ (Thanks to Tim Parenti.)
+
+ Changes to past tm_isdst flags
+
+ The period from 1966-04-03 through 1966-10-02 in Portugal is now
+ modeled as DST, to more closely reflect how contemporaneous changes
+ in law entered into force.
+
+ Changes to data
+
+ Names present only for compatibility with UNIX System V
+ (last released in the 1990s) have been moved to 'backward'.
+ These names, which for post-1970 timestamps mostly just duplicate
+ data of geographical names, were confusing downstream uses.
+ Names moved to 'backward' are now links to geographical names.
+ This affects behavior for TZ='EET' for some pre-1981 timestamps,
+ for TZ='CET' for some pre-1947 timestamps, and for TZ='WET' for
+ some pre-1996 timestamps. Also, TZ='MET' now behaves like
+ TZ='CET' and so uses the abbreviation "CET" rather than "MET".
+ Those needing the previous TZDB behavior, which does not match any
+ real-world clocks, can find the old entries in 'backzone'.
+ (Problem reported by Justin Grant.)
+
+ The main source files' time zone abbreviations now use %z,
+ supported by zic since release 2015f and used in vanguard form
+ since release 2022b. For example, America/Sao_Paulo now contains
+ the zone continuation line "-3:00 Brazil %z", which is less error
+ prone than the old "-3:00 Brazil -03/-02". This does not change
+ the represented data: the generated TZif files are unchanged.
+ Rearguard form still avoids %z, to support obsolescent parsers.
+
+ Asia/Almaty has been removed from zonenow.tab as it now agrees
+ with Asia/Tashkent for future timestamps, due to Kazakhstan's
+ 2024-02-29 time zone change. Similarly, America/Scoresbysund
+ has been removed, as it now agrees with America/Nuuk due to
+ its 2024-03-31 time zone change.
+
+ Changes to code
+
+ localtime.c now always uses a TZif file's time type 0 to handle
+ timestamps before the file's first transition. Formerly,
+ localtime.c sometimes inferred a different time type, in order to
+ handle problematic data generated by zic 2018e or earlier. As it
+ is now safe to assume more recent versions of zic, there is no
+ longer a pressing need to fail to conform RFC 8536 section 3.2,
+ which requires using time type 0 in this situation. This change
+ does not affect behavior when reading TZif files generated by zic
+ 2018f and later.
+
+ POSIX.1-2024 removes asctime_r and ctime_r and does not let
+ libraries define them, so remove them except when needed to
+ conform to earlier POSIX. These functions are dangerous as they
+ can overrun user buffers. If you still need them, add
+ -DSUPPORT_POSIX2008 to CFLAGS.
+
+ The SUPPORT_C89 option now defaults to 1 instead of 0, fixing a
+ POSIX-conformance bug introduced in 2023a.
+
+ tzselect now supports POSIX.1-2024 proleptic TZ strings. Also, it
+ assumes POSIX.2-1992 or later, as practical porting targets now
+ all support that, and it uses some features from POSIX.1-2024 if
+ available.
+
+ Changes to build procedure
+
+ 'make check' no longer requires curl and Internet access.
+
+ The build procedure now assumes POSIX.2-1992 or later, to simplify
+ maintenance. To build on Solaris 10, the only extant system still
+ defaulting to pre-POSIX, prepend /usr/xpg4/bin to PATH.
+
+ Changes to documentation
+
+ The documentation now reflects POSIX.1-2024.
+
+ Changes to commentary
+
+ Commentary about historical transitions in Portugal and her former
+ colonies has been expanded with links to many relevant legislation.
+ (Thanks to Tim Parenti.)
+
+
Release 2024a - 2024-02-01 09:28:56 -0800
Briefly:
@@ -161,7 +281,7 @@ Release 2023d - 2023-12-21 20:02:24 -0800
* It uses the special .POSIX target.
* It quotes special characters more carefully.
* It no longer mishandles builds in an ISO 8859 locale.
- Due to the CC changes, TZDIR is now #defined in a file tzfile.h
+ Due to the CC changes, TZDIR is now #defined in a file tzdir.h
built by 'make', not in a $(CC) -D option. Also, TZDEFAULT is
now treated like TZDIR as they have similar roles.
@@ -283,7 +403,7 @@ Release 2023a - 2023-03-22 12:39:33 -0700
To improve tzselect diagnostics, zone1970.tab's comments column is
now limited to countries that have multiple timezones.
- Note that leap seconds are planned to be discontinued by 2035.
+ Note that there are plans to discontinue leap seconds by 2035.
Release 2022g - 2022-11-29 08:58:31 -0800
diff --git a/tz/africa b/tz/africa
index 92d823a..fd6c44a 100644
--- a/tz/africa
+++ b/tz/africa
@@ -103,17 +103,16 @@ Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 16
# Cape Verde / Cabo Verde
#
-# From Paul Eggert (2018-02-16):
-# Shanks gives 1907 for the transition to +02.
-# For now, ignore that and follow the 1911-05-26 Portuguese decree
-# (see Europe/Lisbon).
+# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
+# For timestamps before independence, see commentary for Europe/Lisbon.
+# Shanks gives 1907 instead for the transition to -02.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
- -2:00 - -02 1942 Sep
- -2:00 1:00 -01 1945 Oct 15
- -2:00 - -02 1975 Nov 25 2:00
- -1:00 - -01
+ -2:00 - %z 1942 Sep
+ -2:00 1:00 %z 1945 Oct 15
+ -2:00 - %z 1975 Nov 25 2:00
+ -1:00 - %z
# Chad
# Zone NAME STDOFF RULES FORMAT [UNTIL]
@@ -345,14 +344,12 @@ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct
# Guinea-Bissau
#
-# From Paul Eggert (2018-02-16):
-# Shanks gives 1911-05-26 for the transition to WAT,
-# evidently confusing the date of the Portuguese decree
-# (see Europe/Lisbon) with the date that it took effect.
+# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
+# For timestamps before independence, see commentary for Europe/Lisbon.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
- -1:00 - -01 1975
+ -1:00 - %z 1975
0:00 - GMT
# Comoros
@@ -417,10 +414,10 @@ Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Nairobi 2:27:16 - LMT 1908 May
- 2:30 - +0230 1928 Jun 30 24:00
+ 2:30 - %z 1928 Jun 30 24:00
3:00 - EAT 1930 Jan 4 24:00
- 2:30 - +0230 1936 Dec 31 24:00
- 2:45 - +0245 1942 Jul 31 24:00
+ 2:30 - %z 1936 Dec 31 24:00
+ 2:45 - %z 1942 Jul 31 24:00
3:00 - EAT
# Liberia
@@ -591,7 +588,7 @@ Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
- 4:00 Mauritius +04/+05
+ 4:00 Mauritius %z
# Agalega Is, Rodriguez
# no information; probably like Indian/Mauritius
@@ -1071,10 +1068,10 @@ Rule Morocco 2087 only - May 11 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
- 0:00 Morocco +00/+01 1984 Mar 16
- 1:00 - +01 1986
- 0:00 Morocco +00/+01 2018 Oct 28 3:00
- 1:00 Morocco +01/+00
+ 0:00 Morocco %z 1984 Mar 16
+ 1:00 - %z 1986
+ 0:00 Morocco %z 2018 Oct 28 3:00
+ 1:00 Morocco %z
# Western Sahara
#
@@ -1088,9 +1085,9 @@ Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
# since most of it was then controlled by Morocco.
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
- -1:00 - -01 1976 Apr 14
- 0:00 Morocco +00/+01 2018 Oct 28 3:00
- 1:00 Morocco +01/+00
+ -1:00 - %z 1976 Apr 14
+ 0:00 Morocco %z 2018 Oct 28 3:00
+ 1:00 Morocco %z
# Botswana
# Burundi
@@ -1101,13 +1098,27 @@ Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
# Zambia
# Zimbabwe
#
-# Shanks gives 1903-03-01 for the transition to CAT.
-# Perhaps the 1911-05-26 Portuguese decree
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# merely made it official?
+# From Tim Parenti (2024-07-01):
+# For timestamps before Mozambique's independence, see commentary for
+# Europe/Lisbon.
+#
+# From Paul Eggert (2024-05-24):
+# The London Gazette, 1903-04-03, page 2245, says that
+# as of 1903-03-03 a time ball at the port of Lourenço Marques
+# (as Maputo was then called) was dropped daily at 13:00:00 LMT,
+# corresponding to 22:49:41.7 GMT, so local time was +02:10:18.3.
+# Conversely, the newspaper South Africa, 1909-02-09, page 321,
+# says the port had just installed an apparatus that communicated
+# "from the controlling clock in the new Observatory at Reuben Point ...
+# exact mean South African time, i.e., 30 deg., or 2 hours East of Greenwich".
+# Although Shanks gives 1903-03-01 for the transition to CAT,
+# evidently the port transitioned to CAT after 1903-03-03 but before
+# the Portuguese legal transition of 1912-01-01 (see Europe/Lisbon commentary).
+# For lack of better info, list 1909 as the transition date.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
-Zone Africa/Maputo 2:10:20 - LMT 1903 Mar
+ #STDOFF 2:10:18.3
+Zone Africa/Maputo 2:10:18 - LMT 1909
2:00 - CAT
# Namibia
@@ -1172,7 +1183,7 @@ Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
- 1:30 - +0130 1903 Mar
+ 1:30 - %z 1903 Mar
2:00 - SAST 1942 Sep 20 2:00
2:00 1:00 SAST 1943 Mar 21 2:00
2:00 - SAST 1990 Mar 21 # independence
@@ -1260,7 +1271,7 @@ Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
Zone Africa/Lagos 0:13:35 - LMT 1905 Jul 1
0:00 - GMT 1908 Jul 1
0:13:35 - LMT 1914 Jan 1
- 0:30 - +0030 1919 Sep 1
+ 0:30 - %z 1919 Sep 1
1:00 - WAT
# São Tomé and Príncipe
diff --git a/tz/antarctica b/tz/antarctica
index 763c272..8d5d6cd 100644
--- a/tz/antarctica
+++ b/tz/antarctica
@@ -87,34 +87,34 @@
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Casey 0 - -00 1969
- 8:00 - +08 2009 Oct 18 2:00
- 11:00 - +11 2010 Mar 5 2:00
- 8:00 - +08 2011 Oct 28 2:00
- 11:00 - +11 2012 Feb 21 17:00u
- 8:00 - +08 2016 Oct 22
- 11:00 - +11 2018 Mar 11 4:00
- 8:00 - +08 2018 Oct 7 4:00
- 11:00 - +11 2019 Mar 17 3:00
- 8:00 - +08 2019 Oct 4 3:00
- 11:00 - +11 2020 Mar 8 3:00
- 8:00 - +08 2020 Oct 4 0:01
- 11:00 - +11 2021 Mar 14 0:00
- 8:00 - +08 2021 Oct 3 0:01
- 11:00 - +11 2022 Mar 13 0:00
- 8:00 - +08 2022 Oct 2 0:01
- 11:00 - +11 2023 Mar 9 3:00
- 8:00 - +08
+ 8:00 - %z 2009 Oct 18 2:00
+ 11:00 - %z 2010 Mar 5 2:00
+ 8:00 - %z 2011 Oct 28 2:00
+ 11:00 - %z 2012 Feb 21 17:00u
+ 8:00 - %z 2016 Oct 22
+ 11:00 - %z 2018 Mar 11 4:00
+ 8:00 - %z 2018 Oct 7 4:00
+ 11:00 - %z 2019 Mar 17 3:00
+ 8:00 - %z 2019 Oct 4 3:00
+ 11:00 - %z 2020 Mar 8 3:00
+ 8:00 - %z 2020 Oct 4 0:01
+ 11:00 - %z 2021 Mar 14 0:00
+ 8:00 - %z 2021 Oct 3 0:01
+ 11:00 - %z 2022 Mar 13 0:00
+ 8:00 - %z 2022 Oct 2 0:01
+ 11:00 - %z 2023 Mar 9 3:00
+ 8:00 - %z
Zone Antarctica/Davis 0 - -00 1957 Jan 13
- 7:00 - +07 1964 Nov
+ 7:00 - %z 1964 Nov
0 - -00 1969 Feb
- 7:00 - +07 2009 Oct 18 2:00
- 5:00 - +05 2010 Mar 10 20:00u
- 7:00 - +07 2011 Oct 28 2:00
- 5:00 - +05 2012 Feb 21 20:00u
- 7:00 - +07
+ 7:00 - %z 2009 Oct 18 2:00
+ 5:00 - %z 2010 Mar 10 20:00u
+ 7:00 - %z 2011 Oct 28 2:00
+ 5:00 - %z 2012 Feb 21 20:00u
+ 7:00 - %z
Zone Antarctica/Mawson 0 - -00 1954 Feb 13
- 6:00 - +06 2009 Oct 18 2:00
- 5:00 - +05
+ 6:00 - %z 2009 Oct 18 2:00
+ 5:00 - %z
# References:
# Casey Weather (1998-02-26)
# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html
@@ -290,10 +290,10 @@ Zone Antarctica/Troll 0 - -00 2005 Feb 12
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Vostok 0 - -00 1957 Dec 16
- 7:00 - +07 1994 Feb
+ 7:00 - %z 1994 Feb
0 - -00 1994 Nov
- 7:00 - +07 2023 Dec 18 2:00
- 5:00 - +05
+ 7:00 - %z 2023 Dec 18 2:00
+ 5:00 - %z
# S Africa - year-round bases
# Marion Island, -4653+03752
@@ -326,7 +326,7 @@ Zone Antarctica/Vostok 0 - -00 1957 Dec 16
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Rothera 0 - -00 1976 Dec 1
- -3:00 - -03
+ -3:00 - %z
# Uruguay - year round base
# Artigas, King George Island, -621104-0585107
diff --git a/tz/asctime.c b/tz/asctime.c
index a40661f..f75ec86 100644
--- a/tz/asctime.c
+++ b/tz/asctime.c
@@ -1,4 +1,4 @@
-/* asctime and asctime_r a la POSIX and ISO C, except pad years before 1000. */
+/* asctime a la ISO C. */
/*
** This file is in the public domain, so clarified as of
@@ -25,8 +25,8 @@
** 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 and POSIX standards prohibit padding the year,
-** but many implementations pad anyway; most likely the standards are buggy.
+** This conforms to recent ISO C and POSIX standards, which say behavior
+** is undefined when the year is less than 1000 or greater than 9999.
*/
static char const ASCTIME_FMT[] = "%s %s%3d %.2d:%.2d:%.2d %-4s\n";
/*
@@ -60,6 +60,18 @@ static char buf_asctime[2*3 + 5*INT_STRLEN_MAXIMUM(int) + 7 + 2 + 1 + 1];
static char buf_ctime[sizeof buf_asctime];
#endif
+/* Publish asctime_r and ctime_r only when supporting older POSIX. */
+#if SUPPORT_POSIX2008
+# define asctime_static
+#else
+# define asctime_static static
+# undef asctime_r
+# undef ctime_r
+# define asctime_r static_asctime_r
+# define ctime_r static_ctime_r
+#endif
+
+asctime_static
char *
asctime_r(struct tm const *restrict timeptr, char *restrict buf)
{
@@ -116,6 +128,7 @@ asctime(register const struct tm *timeptr)
return asctime_r(timeptr, buf_asctime);
}
+asctime_static
char *
ctime_r(const time_t *timep, char *buf)
{
diff --git a/tz/asia b/tz/asia
index 05683b9..a2480b0 100644
--- a/tz/asia
+++ b/tz/asia
@@ -83,8 +83,8 @@ Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
# Afghanistan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kabul 4:36:48 - LMT 1890
- 4:00 - +04 1945
- 4:30 - +0430
+ 4:00 - %z 1945
+ 4:30 - %z
# Armenia
# From Paul Eggert (2006-03-22):
@@ -116,12 +116,12 @@ Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
- 3:00 - +03 1957 Mar
- 4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
- 3:00 RussiaAsia +03/+04 1995 Sep 24 2:00s
- 4:00 - +04 1997
- 4:00 RussiaAsia +04/+05 2011
- 4:00 Armenia +04/+05
+ 3:00 - %z 1957 Mar
+ 4:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 3:00 RussiaAsia %z 1995 Sep 24 2:00s
+ 4:00 - %z 1997
+ 4:00 RussiaAsia %z 2011
+ 4:00 Armenia %z
# Azerbaijan
@@ -142,12 +142,12 @@ Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baku 3:19:24 - LMT 1924 May 2
- 3:00 - +03 1957 Mar
- 4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
- 3:00 RussiaAsia +03/+04 1992 Sep lastSun 2:00s
- 4:00 - +04 1996
- 4:00 EUAsia +04/+05 1997
- 4:00 Azer +04/+05
+ 3:00 - %z 1957 Mar
+ 4:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 3:00 RussiaAsia %z 1992 Sep lastSun 2:00s
+ 4:00 - %z 1996
+ 4:00 EUAsia %z 1997
+ 4:00 Azer %z
# Bangladesh
# From Alexander Krivenyshev (2009-05-13):
@@ -228,17 +228,17 @@ Rule Dhaka 2009 only - Dec 31 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dhaka 6:01:40 - LMT 1890
5:53:20 - HMT 1941 Oct # Howrah Mean Time?
- 6:30 - +0630 1942 May 15
- 5:30 - +0530 1942 Sep
- 6:30 - +0630 1951 Sep 30
- 6:00 - +06 2009
- 6:00 Dhaka +06/+07
+ 6:30 - %z 1942 May 15
+ 5:30 - %z 1942 Sep
+ 6:30 - %z 1951 Sep 30
+ 6:00 - %z 2009
+ 6:00 Dhaka %z
# Bhutan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
- 5:30 - +0530 1987 Oct
- 6:00 - +06
+ 5:30 - %z 1987 Oct
+ 6:00 - %z
# British Indian Ocean Territory
# Whitman and the 1995 CIA time zone map say 5:00, but the
@@ -248,8 +248,8 @@ Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
# then contained the Chagos Archipelago).
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Chagos 4:49:40 - LMT 1907
- 5:00 - +05 1996
- 6:00 - +06
+ 5:00 - %z 1996
+ 6:00 - %z
# Cocos (Keeling) Islands
# Myanmar (Burma)
@@ -265,9 +265,9 @@ Zone Indian/Chagos 4:49:40 - LMT 1907
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoon
6:24:47 - RMT 1920 # Rangoon local time
- 6:30 - +0630 1942 May
- 9:00 - +09 1945 May 3
- 6:30 - +0630
+ 6:30 - %z 1942 May
+ 9:00 - %z 1945 May 3
+ 6:30 - %z
# China
@@ -656,7 +656,7 @@ Zone Asia/Shanghai 8:05:43 - LMT 1901
# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
Zone Asia/Urumqi 5:50:20 - LMT 1928
- 6:00 - +06
+ 6:00 - %z
# Hong Kong
@@ -1114,7 +1114,7 @@ Rule Macau 1979 only - Oct Sun>=16 03:30 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30
8:00 - CST 1941 Dec 21 23:00
- 9:00 Macau +09/+10 1945 Sep 30 24:00
+ 9:00 Macau %z 1945 Sep 30 24:00
8:00 Macau C%sT
@@ -1157,7 +1157,7 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14
Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
2:00 Cyprus EE%sT 1998 Sep
2:00 EUAsia EE%sT 2016 Sep 8
- 3:00 - +03 2017 Oct 29 1:00u
+ 3:00 - %z 2017 Oct 29 1:00u
2:00 EUAsia EE%sT
# Georgia
@@ -1198,18 +1198,25 @@ Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tbilisi 2:59:11 - LMT 1880
2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time
- 3:00 - +03 1957 Mar
- 4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
- 3:00 RussiaAsia +03/+04 1992
- 3:00 E-EurAsia +03/+04 1994 Sep lastSun
- 4:00 E-EurAsia +04/+05 1996 Oct lastSun
- 4:00 1:00 +05 1997 Mar lastSun
- 4:00 E-EurAsia +04/+05 2004 Jun 27
- 3:00 RussiaAsia +03/+04 2005 Mar lastSun 2:00
- 4:00 - +04
+ 3:00 - %z 1957 Mar
+ 4:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 3:00 RussiaAsia %z 1992
+ 3:00 E-EurAsia %z 1994 Sep lastSun
+ 4:00 E-EurAsia %z 1996 Oct lastSun
+ 4:00 1:00 %z 1997 Mar lastSun
+ 4:00 E-EurAsia %z 2004 Jun 27
+ 3:00 RussiaAsia %z 2005 Mar lastSun 2:00
+ 4:00 - %z
# East Timor
+# From Tim Parenti (2024-07-01):
+# The 1912-01-01 transition occurred at 00:00 new time, per the 1911-05-24
+# Portuguese decree (see Europe/Lisbon). A provision in article 5(c) of the
+# decree prescribed that Timor "will keep counting time in harmony with
+# neighboring foreign colonies, [for] as long as they do not adopt the time
+# that belongs to them in [the Washington Convention] system."
+
# See Indonesia for the 1945 transition.
# From João Carrascalão, brother of the former governor of East Timor, in
@@ -1233,11 +1240,11 @@ Zone Asia/Tbilisi 2:59:11 - LMT 1880
# midnight on Saturday, September 16.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
-Zone Asia/Dili 8:22:20 - LMT 1912 Jan 1
- 8:00 - +08 1942 Feb 21 23:00
- 9:00 - +09 1976 May 3
- 8:00 - +08 2000 Sep 17 0:00
- 9:00 - +09
+Zone Asia/Dili 8:22:20 - LMT 1911 Dec 31 16:00u
+ 8:00 - %z 1942 Feb 21 23:00
+ 9:00 - %z 1976 May 3
+ 8:00 - %z 2000 Sep 17 0:00
+ 9:00 - %z
# India
@@ -1303,9 +1310,9 @@ Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
5:53:20 - HMT 1870 # Howrah Mean Time?
5:21:10 - MMT 1906 Jan 1 # Madras local time
5:30 - IST 1941 Oct
- 5:30 1:00 +0630 1942 May 15
+ 5:30 1:00 %z 1942 May 15
5:30 - IST 1942 Sep
- 5:30 1:00 +0630 1945 Oct 15
+ 5:30 1:00 %z 1945 Oct 15
5:30 - IST
# Since 1970 the following are like Asia/Kolkata:
# Andaman Is
@@ -1357,33 +1364,33 @@ Zone Asia/Jakarta 7:07:12 - LMT 1867 Aug 10
# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
# but this must be a typo.
7:07:12 - BMT 1923 Dec 31 16:40u # Batavia
- 7:20 - +0720 1932 Nov
- 7:30 - +0730 1942 Mar 23
- 9:00 - +09 1945 Sep 23
- 7:30 - +0730 1948 May
- 8:00 - +08 1950 May
- 7:30 - +0730 1964
+ 7:20 - %z 1932 Nov
+ 7:30 - %z 1942 Mar 23
+ 9:00 - %z 1945 Sep 23
+ 7:30 - %z 1948 May
+ 8:00 - %z 1950 May
+ 7:30 - %z 1964
7:00 - WIB
# west and central Borneo
Zone Asia/Pontianak 7:17:20 - LMT 1908 May
7:17:20 - PMT 1932 Nov # Pontianak MT
- 7:30 - +0730 1942 Jan 29
- 9:00 - +09 1945 Sep 23
- 7:30 - +0730 1948 May
- 8:00 - +08 1950 May
- 7:30 - +0730 1964
+ 7:30 - %z 1942 Jan 29
+ 9:00 - %z 1945 Sep 23
+ 7:30 - %z 1948 May
+ 8:00 - %z 1950 May
+ 7:30 - %z 1964
8:00 - WITA 1988 Jan 1
7:00 - WIB
# Sulawesi, Lesser Sundas, east and south Borneo
Zone Asia/Makassar 7:57:36 - LMT 1920
7:57:36 - MMT 1932 Nov # Macassar MT
- 8:00 - +08 1942 Feb 9
- 9:00 - +09 1945 Sep 23
+ 8:00 - %z 1942 Feb 9
+ 9:00 - %z 1945 Sep 23
8:00 - WITA
# Maluku Islands, West Papua, Papua
Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
- 9:00 - +09 1944 Sep 1
- 9:30 - +0930 1964
+ 9:00 - %z 1944 Sep 1
+ 9:30 - %z 1964
9:00 - WIT
# Iran
@@ -1619,9 +1626,9 @@ Rule Iran 2021 2022 - Sep 21 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tehran 3:25:44 - LMT 1916
3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time
- 3:30 Iran +0330/+0430 1977 Oct 20 24:00
- 4:00 Iran +04/+05 1979
- 3:30 Iran +0330/+0430
+ 3:30 Iran %z 1977 Oct 20 24:00
+ 4:00 Iran %z 1979
+ 3:30 Iran %z
# Iraq
@@ -1664,8 +1671,8 @@ Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time?
- 3:00 - +03 1982 May
- 3:00 Iraq +03/+04
+ 3:00 - %z 1982 May
+ 3:00 Iraq %z
###############################################################################
@@ -2262,7 +2269,7 @@ Rule Jordan 2022 only - Feb lastThu 24:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Amman 2:23:44 - LMT 1931
2:00 Jordan EE%sT 2022 Oct 28 0:00s
- 3:00 - +03
+ 3:00 - %z
# Kazakhstan
@@ -2473,88 +2480,88 @@ Zone Asia/Amman 2:23:44 - LMT 1931
# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
# This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11),
# Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71),
-# East Kazkhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
+# East Kazakhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
# Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55),
-# Shyumkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
+# Shymkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
- 5:00 - +05 1930 Jun 21
- 6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
- 5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
- 6:00 RussiaAsia +06/+07 2004 Oct 31 2:00s
- 6:00 - +06 2024 Mar 1 0:00
- 5:00 - +05
+ 5:00 - %z 1930 Jun 21
+ 6:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 5:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 6:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 6:00 - %z 2024 Mar 1 0:00
+ 5:00 - %z
# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43)
Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
- 4:00 - +04 1930 Jun 21
- 5:00 - +05 1981 Apr 1
- 5:00 1:00 +06 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
- 4:00 RussiaAsia +04/+05 1991 Sep 29 2:00s
- 5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
- 6:00 RussiaAsia +06/+07 1992 Mar 29 2:00s
- 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
- 6:00 - +06 2018 Dec 21 0:00
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Apr 1
+ 5:00 1:00 %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 4:00 RussiaAsia %z 1991 Sep 29 2:00s
+ 5:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 6:00 RussiaAsia %z 1992 Mar 29 2:00s
+ 5:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 6:00 - %z 2018 Dec 21 0:00
+ 5:00 - %z
# Qostanay (aka Kostanay, Kustanay) (KZ-39)
# The 1991/2 rules are unclear partly because of the 1997 Turgai
# reorganization.
Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2
- 4:00 - +04 1930 Jun 21
- 5:00 - +05 1981 Apr 1
- 5:00 1:00 +06 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
- 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
- 6:00 - +06 2024 Mar 1 0:00
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Apr 1
+ 5:00 1:00 %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 5:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 6:00 - %z 2024 Mar 1 0:00
+ 5:00 - %z
# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15)
Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
- 4:00 - +04 1930 Jun 21
- 5:00 - +05 1981 Apr 1
- 5:00 1:00 +06 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
- 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Apr 1
+ 5:00 1:00 %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 5:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 5:00 - %z
# Mangghystaū (KZ-47)
# Aqtau was not founded until 1963, but it represents an inhabited region,
# so include timestamps before 1963.
Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
- 4:00 - +04 1930 Jun 21
- 5:00 - +05 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
- 5:00 RussiaAsia +05/+06 1994 Sep 25 2:00s
- 4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 5:00 RussiaAsia %z 1994 Sep 25 2:00s
+ 4:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 5:00 - %z
# Atyraū (KZ-23) is like Mangghystaū except it switched from
# +04/+05 to +05/+06 in spring 1999, not fall 1994.
Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2
- 3:00 - +03 1930 Jun 21
- 5:00 - +05 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
- 5:00 RussiaAsia +05/+06 1999 Mar 28 2:00s
- 4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
- 5:00 - +05
+ 3:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 5:00 RussiaAsia %z 1999 Mar 28 2:00s
+ 4:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 5:00 - %z
# West Kazakhstan (KZ-27)
# From Paul Eggert (2016-03-18):
# The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
- 3:00 - +03 1930 Jun 21
- 5:00 - +05 1981 Apr 1
- 5:00 1:00 +06 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1989 Mar 26 2:00s
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
- 5:00 RussiaAsia +05/+06 1992 Mar 29 2:00s
- 4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
- 5:00 - +05
+ 3:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Apr 1
+ 5:00 1:00 %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1989 Mar 26 2:00s
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00s
+ 5:00 RussiaAsia %z 1992 Mar 29 2:00s
+ 4:00 RussiaAsia %z 2004 Oct 31 2:00s
+ 5:00 - %z
# Kyrgyzstan (Kirgizstan)
# Transitions through 1991 are from Shanks & Pottenger.
@@ -2575,11 +2582,11 @@ Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
- 5:00 - +05 1930 Jun 21
- 6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
- 5:00 RussiaAsia +05/+06 1991 Aug 31 2:00
- 5:00 Kyrgyz +05/+06 2005 Aug 12
- 6:00 - +06
+ 5:00 - %z 1930 Jun 21
+ 6:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 5:00 RussiaAsia %z 1991 Aug 31 2:00
+ 5:00 Kyrgyz %z 2005 Aug 12
+ 6:00 - %z
###############################################################################
@@ -2786,16 +2793,16 @@ Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
# and 1982 transition dates are from Mok Ly Yng.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kuching 7:21:20 - LMT 1926 Mar
- 7:30 - +0730 1933
- 8:00 NBorneo +08/+0820 1942 Feb 16
- 9:00 - +09 1945 Sep 12
- 8:00 - +08
+ 7:30 - %z 1933
+ 8:00 NBorneo %z 1942 Feb 16
+ 9:00 - %z 1945 Sep 12
+ 8:00 - %z
# Maldives
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
4:54:00 - MMT 1960 # Malé Mean Time
- 5:00 - +05
+ 5:00 - %z
# Mongolia
@@ -2897,9 +2904,37 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
# From Arthur David Olson (2008-05-19):
# Assume that Choibalsan is indeed offset by 8:00.
-# XXX--in the absence of better information, assume that transition
-# was at the start of 2008-03-31 (the day of Steffen Thorsen's report);
-# this is almost surely wrong.
+
+# From Heitor David Pinto (2024-06-23):
+# Sources about time zones in Mongolia seem to list one of two conflicting
+# configurations. The first configuration, mentioned in a comment to the TZ
+# database in 1999, citing a Mongolian government website, lists the provinces
+# of Bayan-Ölgii, Khovd and Uvs in UTC+7, and the rest of the country in
+# UTC+8. The second configuration, mentioned in a comment to the database in
+# 2001, lists Bayan-Ölgii, Khovd, Uvs, Govi-Altai and Zavkhan in UTC+7, Dornod
+# and Sükhbaatar in UTC+9, and the rest of the country in UTC+8.
+#
+# The first configuration is still mentioned by several Mongolian travel
+# agencies:
+# https://www.adventurerider.mn/en/page/about_mongolia
+# http://www.naturetours.mn/nt/mongolia.php
+# https://www.newjuulchin.mn/web/content/7506?unique=fa24a0f6e96e022a3578ee5195ac879638c734ce
+#
+# It also matches these flight schedules in 2013:
+# http://web.archive.org/web/20130722023600/https://www.hunnuair.com/en/timetabled
+# The flight times imply that the airports of Uliastai (Zavkhan), Choibalsan
+# (Dornod) and Altai (Govi-Altai) are in the same time zone as Ulaanbaatar,
+# and Khovd is one hour behind....
+#
+# The second configuration was mentioned by an official of the Mongolian
+# standards agency in an interview in 2014: https://ikon.mn/n/9v6
+# And it's still listed by the Mongolian aviation agency:
+# https://ais.mn/files/aip/eAIP/2023-12-25/html/eSUP/ZM-eSUP-23-04-en-MN.html
+#
+# ... I believe that the first configuration is what is actually observed in
+# Mongolia and has been so all along, at least since 1999. The second
+# configuration closely matches the ideal time zone boundaries at 97.5° E and
+# 112.5° E but it doesn't seem to be used in practice.
# From Ganbold Tsagaankhuu (2015-03-10):
# It seems like yesterday Mongolian Government meeting has concluded to use
@@ -2938,25 +2973,18 @@ Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
Zone Asia/Hovd 6:06:36 - LMT 1905 Aug
- 6:00 - +06 1978
- 7:00 Mongol +07/+08
+ 6:00 - %z 1978
+ 7:00 Mongol %z
# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
- 7:00 - +07 1978
- 8:00 Mongol +08/+09
-# Choibalsan, a.k.a. Bajan Tümen, Bajan Tumen, Chojbalsan,
-# Choybalsan, Sanbejse, Tchoibalsan
-Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
- 7:00 - +07 1978
- 8:00 - +08 1983 Apr
- 9:00 Mongol +09/+10 2008 Mar 31
- 8:00 Mongol +08/+09
+ 7:00 - %z 1978
+ 8:00 Mongol %z
# Nepal
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kathmandu 5:41:16 - LMT 1920
- 5:30 - +0530 1986
- 5:45 - +0545
+ 5:30 - %z 1986
+ 5:45 - %z
# Pakistan
@@ -3102,10 +3130,10 @@ Rule Pakistan 2009 only - Apr 15 0:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Karachi 4:28:12 - LMT 1907
- 5:30 - +0530 1942 Sep
- 5:30 1:00 +0630 1945 Oct 15
- 5:30 - +0530 1951 Sep 30
- 5:00 - +05 1971 Mar 26
+ 5:30 - %z 1942 Sep
+ 5:30 1:00 %z 1945 Oct 15
+ 5:30 - %z 1951 Sep 30
+ 5:00 - %z 1971 Mar 26
5:00 Pakistan PK%sT # Pakistan Time
# Palestine
@@ -3653,14 +3681,14 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct
# Philippine Star 2014-08-05
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
-# From Paul Goyette (2018-06-15):
+# From Paul Goyette (2018-06-15) with URLs updated by Guy Harris (2024-02-15):
# In the Philippines, there is a national law, Republic Act No. 10535
# which declares the official time here as "Philippine Standard Time".
# The act [1] even specifies use of PST as the abbreviation, although
# the FAQ provided by PAGASA [2] uses the "acronym PhST to distinguish
# it from the Pacific Standard Time (PST)."
-# [1] http://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
-# [2] https://www1.pagasa.dost.gov.ph/index.php/astronomy/philippine-standard-time#republic-act-10535
+# [1] https://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
+# [2] https://prsd.pagasa.dost.gov.ph/index.php/28-astronomy/302-philippine-standard-time
#
# From Paul Eggert (2018-06-19):
# I surveyed recent news reports, and my impression is that "PST" is
@@ -3693,8 +3721,8 @@ Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
# Qatar
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
- 4:00 - +04 1972 Jun
- 3:00 - +03
+ 4:00 - %z 1972 Jun
+ 3:00 - %z
# Kuwait
# Saudi Arabia
@@ -3744,7 +3772,7 @@ Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
- 3:00 - +03
+ 3:00 - %z
# Singapore
# taken from Mok Ly Yng (2003-10-30)
@@ -3752,13 +3780,13 @@ Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
- 7:00 - +07 1933 Jan 1
- 7:00 0:20 +0720 1936 Jan 1
- 7:20 - +0720 1941 Sep 1
- 7:30 - +0730 1942 Feb 16
- 9:00 - +09 1945 Sep 12
- 7:30 - +0730 1981 Dec 31 16:00u
- 8:00 - +08
+ 7:00 - %z 1933 Jan 1
+ 7:00 0:20 %z 1936 Jan 1
+ 7:20 - %z 1941 Sep 1
+ 7:30 - %z 1942 Feb 16
+ 9:00 - %z 1945 Sep 12
+ 7:30 - %z 1981 Dec 31 16:00u
+ 8:00 - %z
# Spratly Is
# no information
@@ -3816,13 +3844,13 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Colombo 5:19:24 - LMT 1880
5:19:32 - MMT 1906 # Moratuwa Mean Time
- 5:30 - +0530 1942 Jan 5
- 5:30 0:30 +06 1942 Sep
- 5:30 1:00 +0630 1945 Oct 16 2:00
- 5:30 - +0530 1996 May 25 0:00
- 6:30 - +0630 1996 Oct 26 0:30
- 6:00 - +06 2006 Apr 15 0:30
- 5:30 - +0530
+ 5:30 - %z 1942 Jan 5
+ 5:30 0:30 %z 1942 Sep
+ 5:30 1:00 %z 1945 Oct 16 2:00
+ 5:30 - %z 1996 May 25 0:00
+ 6:30 - %z 1996 Oct 26 0:30
+ 6:00 - %z 2006 Apr 15 0:30
+ 5:30 - %z
# Syria
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@@ -3993,16 +4021,16 @@ Rule Syria 2009 2022 - Oct lastFri 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
2:00 Syria EE%sT 2022 Oct 28 0:00
- 3:00 - +03
+ 3:00 - %z
# Tajikistan
# From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
- 5:00 - +05 1930 Jun 21
- 6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
- 5:00 1:00 +06 1991 Sep 9 2:00s
- 5:00 - +05
+ 5:00 - %z 1930 Jun 21
+ 6:00 RussiaAsia %z 1991 Mar 31 2:00s
+ 5:00 1:00 %z 1991 Sep 9 2:00s
+ 5:00 - %z
# Cambodia
# Christmas I
@@ -4012,16 +4040,16 @@ Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bangkok 6:42:04 - LMT 1880
6:42:04 - BMT 1920 Apr # Bangkok Mean Time
- 7:00 - +07
+ 7:00 - %z
# Turkmenistan
# From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
- 4:00 - +04 1930 Jun 21
- 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00
- 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 RussiaAsia %z 1991 Mar 31 2:00
+ 4:00 RussiaAsia %z 1992 Jan 19 2:00
+ 5:00 - %z
# Oman
# Réunion
@@ -4031,25 +4059,25 @@ Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
# The Crozet Is also observe Réunion time; see the 'antarctica' file.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dubai 3:41:12 - LMT 1920
- 4:00 - +04
+ 4:00 - %z
# Uzbekistan
# Byalokoz 1919 says Uzbekistan was 4:27:53.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2
- 4:00 - +04 1930 Jun 21
- 5:00 - +05 1981 Apr 1
- 5:00 1:00 +06 1981 Oct 1
- 6:00 - +06 1982 Apr 1
- 5:00 RussiaAsia +05/+06 1992
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 - %z 1981 Apr 1
+ 5:00 1:00 %z 1981 Oct 1
+ 6:00 - %z 1982 Apr 1
+ 5:00 RussiaAsia %z 1992
+ 5:00 - %z
# Milne says Tashkent was 4:37:10.8.
#STDOFF 4:37:10.8
Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
- 5:00 - +05 1930 Jun 21
- 6:00 RussiaAsia +06/+07 1991 Mar 31 2:00
- 5:00 RussiaAsia +05/+06 1992
- 5:00 - +05
+ 5:00 - %z 1930 Jun 21
+ 6:00 RussiaAsia %z 1991 Mar 31 2:00
+ 5:00 RussiaAsia %z 1992
+ 5:00 - %z
# Vietnam (southern)
@@ -4107,7 +4135,7 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
# Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13
# http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none
# It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07.
-# It also mentions a 1945-03-29 decree (by a Japanese Goveror-General)
+# It also mentions a 1945-03-29 decree (by a Japanese Governor-General)
# to set the time zone to +09, but does not say whether that decree
# merely legalized an earlier change to +09.
#
@@ -4128,14 +4156,14 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
#STDOFF 7:06:30.13
Zone Asia/Ho_Chi_Minh 7:06:30 - LMT 1906 Jul 1
7:06:30 - PLMT 1911 May 1 # Phù Liễn MT
- 7:00 - +07 1942 Dec 31 23:00
- 8:00 - +08 1945 Mar 14 23:00
- 9:00 - +09 1945 Sep 1 24:00
- 7:00 - +07 1947 Apr 1
- 8:00 - +08 1955 Jul 1 01:00
- 7:00 - +07 1959 Dec 31 23:00
- 8:00 - +08 1975 Jun 13
- 7:00 - +07
+ 7:00 - %z 1942 Dec 31 23:00
+ 8:00 - %z 1945 Mar 14 23:00
+ 9:00 - %z 1945 Sep 1 24:00
+ 7:00 - %z 1947 Apr 1
+ 8:00 - %z 1955 Jul 1 01:00
+ 7:00 - %z 1959 Dec 31 23:00
+ 8:00 - %z 1975 Jun 13
+ 7:00 - %z
# From Paul Eggert (2019-02-19):
#
diff --git a/tz/australasia b/tz/australasia
index 0e9c259..359f9c1 100644
--- a/tz/australasia
+++ b/tz/australasia
@@ -43,8 +43,8 @@ Zone Australia/Perth 7:43:24 - LMT 1895 Dec
8:00 Aus AW%sT 1943 Jul
8:00 AW AW%sT
Zone Australia/Eucla 8:35:28 - LMT 1895 Dec
- 8:45 Aus +0845/+0945 1943 Jul
- 8:45 AW +0845/+0945
+ 8:45 Aus %z 1943 Jul
+ 8:45 AW %z
# Queensland
#
@@ -209,8 +209,8 @@ Rule LH 2008 max - Apr Sun>=1 2:00 0 -
Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
10:00 - AEST 1981 Mar
- 10:30 LH +1030/+1130 1985 Jul
- 10:30 LH +1030/+11
+ 10:30 LH %z 1985 Jul
+ 10:30 LH %z
# Australian miscellany
#
@@ -416,16 +416,16 @@ Rule Fiji 2019 only - Nov Sun>=8 2:00 1:00 -
Rule Fiji 2020 only - Dec 20 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
- 12:00 Fiji +12/+13
+ 12:00 Fiji %z
# French Polynesia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea
- -9:00 - -09
+ -9:00 - %z
Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1
- -9:30 - -0930
+ -9:30 - %z
Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete
- -10:00 - -10
+ -10:00 - %z
# Clipperton (near North America) is administered from French Polynesia;
# it is uninhabited.
@@ -468,7 +468,7 @@ Rule Guam 1977 only - Aug 28 2:00 0 S
Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
9:39:00 - LMT 1901 # Agana
10:00 - GST 1941 Dec 10 # Guam
- 9:00 - +09 1944 Jul 31
+ 9:00 - %z 1944 Jul 31
10:00 Guam G%sT 2000 Dec 23
10:00 - ChST # Chamorro Standard Time
@@ -480,30 +480,30 @@ Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
# Wallis & Futuna
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki
- 12:00 - +12
+ 12:00 - %z
# Kiribati (except Gilbert Is)
# See Pacific/Tarawa for the Gilbert Is.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kanton 0 - -00 1937 Aug 31
- -12:00 - -12 1979 Oct
- -11:00 - -11 1994 Dec 31
- 13:00 - +13
+ -12:00 - %z 1979 Oct
+ -11:00 - %z 1994 Dec 31
+ 13:00 - %z
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
- -10:40 - -1040 1979 Oct
- -10:00 - -10 1994 Dec 31
- 14:00 - +14
+ -10:40 - %z 1979 Oct
+ -10:00 - %z 1994 Dec 31
+ 14:00 - %z
# Marshall Is
# See Pacific/Tarawa for most locations.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kwajalein 11:09:20 - LMT 1901
- 11:00 - +11 1937
- 10:00 - +10 1941 Apr 1
- 9:00 - +09 1944 Feb 6
- 11:00 - +11 1969 Oct
- -12:00 - -12 1993 Aug 20 24:00
- 12:00 - +12
+ 11:00 - %z 1937
+ 10:00 - %z 1941 Apr 1
+ 9:00 - %z 1944 Feb 6
+ 11:00 - %z 1969 Oct
+ -12:00 - %z 1993 Aug 20 24:00
+ 12:00 - %z
# Micronesia
# For Chuuk and Yap see Pacific/Port_Moresby.
@@ -511,22 +511,22 @@ Zone Pacific/Kwajalein 11:09:20 - LMT 1901
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kosrae -13:08:04 - LMT 1844 Dec 31
10:51:56 - LMT 1901
- 11:00 - +11 1914 Oct
- 9:00 - +09 1919 Feb 1
- 11:00 - +11 1937
- 10:00 - +10 1941 Apr 1
- 9:00 - +09 1945 Aug
- 11:00 - +11 1969 Oct
- 12:00 - +12 1999
- 11:00 - +11
+ 11:00 - %z 1914 Oct
+ 9:00 - %z 1919 Feb 1
+ 11:00 - %z 1937
+ 10:00 - %z 1941 Apr 1
+ 9:00 - %z 1945 Aug
+ 11:00 - %z 1969 Oct
+ 12:00 - %z 1999
+ 11:00 - %z
# Nauru
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe
- 11:30 - +1130 1942 Aug 29
- 9:00 - +09 1945 Sep 8
- 11:30 - +1130 1979 Feb 10 2:00
- 12:00 - +12
+ 11:30 - %z 1942 Aug 29
+ 9:00 - %z 1945 Sep 8
+ 11:30 - %z 1979 Feb 10 2:00
+ 12:00 - %z
# New Caledonia
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@@ -537,7 +537,7 @@ Rule NC 1996 only - Dec 1 2:00s 1:00 -
Rule NC 1997 only - Mar 2 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa
- 11:00 NC +11/+12
+ 11:00 NC %z
###############################################################################
@@ -581,8 +581,8 @@ Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
12:00 NZ NZ%sT
Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2
- 12:15 - +1215 1946 Jan 1
- 12:45 Chatham +1245/+1345
+ 12:15 - %z 1946 Jan 1
+ 12:45 Chatham %z
# Auckland Is
# uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers,
@@ -635,8 +635,8 @@ Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
-10:39:04 - LMT 1952 Oct 16
- -10:30 - -1030 1978 Nov 12
- -10:00 Cook -10/-0930
+ -10:30 - %z 1978 Nov 12
+ -10:00 Cook %z
###############################################################################
@@ -653,30 +653,30 @@ Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Niue -11:19:40 - LMT 1952 Oct 16 # Alofi
- -11:20 - -1120 1964 Jul
- -11:00 - -11
+ -11:20 - %z 1964 Jul
+ -11:00 - %z
# Norfolk
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston
- 11:12 - +1112 1951
- 11:30 - +1130 1974 Oct 27 02:00s
- 11:30 1:00 +1230 1975 Mar 2 02:00s
- 11:30 - +1130 2015 Oct 4 02:00s
- 11:00 - +11 2019 Jul
- 11:00 AN +11/+12
+ 11:12 - %z 1951
+ 11:30 - %z 1974 Oct 27 02:00s
+ 11:30 1:00 %z 1975 Mar 2 02:00s
+ 11:30 - %z 2015 Oct 4 02:00s
+ 11:00 - %z 2019 Jul
+ 11:00 AN %z
# Palau (Belau)
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Palau -15:02:04 - LMT 1844 Dec 31 # Koror
8:57:56 - LMT 1901
- 9:00 - +09
+ 9:00 - %z
# Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
9:48:32 - PMMT 1895 # Port Moresby Mean Time
- 10:00 - +10
+ 10:00 - %z
#
# From Paul Eggert (2014-10-13):
# Base the Bougainville entry on the Arawa-Kieta region, which appears to have
@@ -697,16 +697,16 @@ Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
#
Zone Pacific/Bougainville 10:22:16 - LMT 1880
9:48:32 - PMMT 1895
- 10:00 - +10 1942 Jul
- 9:00 - +09 1945 Aug 21
- 10:00 - +10 2014 Dec 28 2:00
- 11:00 - +11
+ 10:00 - %z 1942 Jul
+ 9:00 - %z 1945 Aug 21
+ 10:00 - %z 2014 Dec 28 2:00
+ 11:00 - %z
# Pitcairn
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown
- -8:30 - -0830 1998 Apr 27 0:00
- -8:00 - -08
+ -8:30 - %z 1998 Apr 27 0:00
+ -8:00 - %z
# American Samoa
# Midway
@@ -795,15 +795,15 @@ Rule WS 2012 2020 - Sep lastSun 3:00 1 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
-11:26:56 - LMT 1911
- -11:30 - -1130 1950
- -11:00 WS -11/-10 2011 Dec 29 24:00
- 13:00 WS +13/+14
+ -11:30 - %z 1950
+ -11:00 WS %z 2011 Dec 29 24:00
+ 13:00 WS %z
# Solomon Is
# excludes Bougainville, for which see Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
- 11:00 - +11
+ 11:00 - %z
# Tokelau
#
@@ -826,8 +826,8 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fakaofo -11:24:56 - LMT 1901
- -11:00 - -11 2011 Dec 30
- 13:00 - +13
+ -11:00 - %z 2011 Dec 30
+ 13:00 - %z
# Tonga
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@@ -839,9 +839,9 @@ Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tongatapu 12:19:12 - LMT 1945 Sep 10
- 12:20 - +1220 1961
- 13:00 - +13 1999
- 13:00 Tonga +13/+14
+ 12:20 - %z 1961
+ 13:00 - %z 1999
+ 13:00 Tonga %z
# US minor outlying islands
@@ -930,7 +930,7 @@ Rule Vanuatu 1992 1993 - Jan Sat>=22 24:00 0 -
Rule Vanuatu 1992 only - Oct Sat>=22 24:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
- 11:00 Vanuatu +11/+12
+ 11:00 Vanuatu %z
###############################################################################
diff --git a/tz/backward b/tz/backward
index 65c711b..0236751 100644
--- a/tz/backward
+++ b/tz/backward
@@ -1,9 +1,10 @@
-# tzdb links for backward compatibility
+# Links and zones for backward compatibility
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
# This file provides links from old or merged timezone names to current ones.
+# It also provides a few zone entries for old naming conventions.
# Many names changed in 1993 and in 1995, and many merged names moved here
# in the period from 2013 through 2022. Several of these names are
# also present in the file 'backzone', which has data important only
@@ -44,6 +45,8 @@ Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
Link America/Noronha Brazil/DeNoronha
Link America/Sao_Paulo Brazil/East
Link America/Manaus Brazil/West
+Link Europe/Brussels CET
+Link America/Chicago CST6CDT
Link America/Halifax Canada/Atlantic
Link America/Winnipeg Canada/Central
# This line is commented out, as the name exceeded the 14-character limit
@@ -58,6 +61,9 @@ Link America/Whitehorse Canada/Yukon
Link America/Santiago Chile/Continental
Link Pacific/Easter Chile/EasterIsland
Link America/Havana Cuba
+Link Europe/Athens EET
+Link America/Panama EST
+Link America/New_York EST5EDT
Link Africa/Cairo Egypt
Link Europe/Dublin Eire
# Vanguard section, for most .zi parsers.
@@ -96,6 +102,9 @@ Link America/Jamaica Jamaica
Link Asia/Tokyo Japan
Link Pacific/Kwajalein Kwajalein
Link Africa/Tripoli Libya
+Link Europe/Brussels MET
+Link America/Phoenix MST
+Link America/Denver MST7MDT
Link America/Tijuana Mexico/BajaNorte
Link America/Mazatlan Mexico/BajaSur
Link America/Mexico_City Mexico/General
@@ -275,6 +284,7 @@ Link America/Denver America/Shiprock
Link America/Toronto America/Thunder_Bay
Link America/Edmonton America/Yellowknife
Link Pacific/Auckland Antarctica/South_Pole
+Link Asia/Ulaanbaatar Asia/Choibalsan
Link Asia/Shanghai Asia/Chongqing
Link Asia/Shanghai Asia/Harbin
Link Asia/Urumqi Asia/Kashgar
@@ -289,6 +299,7 @@ Link Europe/Kyiv Europe/Zaporozhye
Link Pacific/Kanton Pacific/Enderbury
Link Pacific/Honolulu Pacific/Johnston
Link Pacific/Port_Moresby Pacific/Yap
+Link Europe/Lisbon WET
# Alternate names for the same location
@@ -314,5 +325,7 @@ Link Europe/Kyiv Europe/Kiev
# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
# However, for various reasons many users expect to find it under Europe.
Link Asia/Nicosia Europe/Nicosia
+Link Pacific/Honolulu HST
+Link America/Los_Angeles PST8PDT
Link Pacific/Guadalcanal Pacific/Ponape #= Pacific/Pohnpei
Link Pacific/Port_Moresby Pacific/Truk #= Pacific/Chuuk
diff --git a/tz/backzone b/tz/backzone
index f452503..dd7a867 100644
--- a/tz/backzone
+++ b/tz/backzone
@@ -346,10 +346,8 @@ Zone Africa/Lome 0:04:52 - LMT 1893
# Angola
#
-# From Paul Eggert (2018-02-16):
-# Shanks gives 1911-05-26 for the transition to WAT,
-# evidently confusing the date of the Portuguese decree
-# (see Europe/Lisbon) with the date that it took effect.
+# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
+# For timestamps before independence, see commentary for Europe/Lisbon.
#
Zone Africa/Luanda 0:52:56 - LMT 1892
0:52:04 - LMT 1911 Dec 31 23:00u # Luanda MT?
@@ -1086,10 +1084,10 @@ Zone Asia/Muscat 3:54:24 - LMT 1920
4:00 - +04
# India
-# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
-# According to a Portuguese decree (1911-05-26)
-# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
-# Portuguese India switched to UT +05 on 1912-01-01.
+# From Tim Parenti (2024-07-01), per Paul Eggert (2014-08-11), after a
+# heads-up from Stephen Colebourne:
+# According to a Portuguese decree (1911-05-24), Portuguese India switched to
+# UT +05 on 1912-01-01 (see Europe/Lisbon).
#Zone Asia/Panaji [not enough info to complete]
# Cambodia
@@ -1829,6 +1827,27 @@ Zone Pacific/Wake 11:06:28 - LMT 1901
Zone Pacific/Wallis 12:15:20 - LMT 1901
12:00 - +12
+
+# From Paul Eggert (2024-05-22):
+# The following zones pretend that standard time extends backward
+# indefinitely into the past, and so are ahistorical.
+# In current TZDB these entries are links to geographical locations
+# that agree with the ahistorical zones since 1970.
+# These are in numeric rather than alphabetic order.
+
+# Zone NAME STDOFF RULES FORMAT [UNTIL]
+Zone HST -10:00 - HST
+Zone PST8PDT -8:00 US P%sT
+Zone MST -7:00 - MST
+Zone MST7MDT -7:00 US M%sT
+Zone CST6CDT -6:00 US C%sT
+Zone EST -5:00 - EST
+Zone EST5EDT -5:00 US E%sT
+Zone WET 0:00 EU WE%sT
+Zone CET 1:00 C-Eur CE%sT
+Zone MET 1:00 C-Eur ME%sT
+Zone EET 2:00 EU EE%sT
+
# Local Variables:
# coding: utf-8
# End:
diff --git a/tz/checknow.awk b/tz/checknow.awk
index 57ff3c0..8b7881d 100644
--- a/tz/checknow.awk
+++ b/tz/checknow.awk
@@ -14,7 +14,7 @@ BEGIN {
if ($0 ~ /^TZ/) {
record_zone(zone, data)
zone = $0
- sub(/.*\.dir\//, "", zone)
+ sub(/.*\.ckd\//, "", zone)
sub(/\/\//, "/", zone)
sub(/"/, "", zone)
data = ""
@@ -45,7 +45,7 @@ END {
for (zone in zone_data) {
data = zone_data[zone]
if (!zonenow[data]) {
- printf "zonenow.tab should have one of:%s\n", zones[data]
+ printf "Zone table should have one of:%s\n", zones[data]
zonenow[data] = zone # This suppresses duplicate diagnostics.
status = 1
}
diff --git a/tz/etcetera b/tz/etcetera
index 29fbed9..a5ecd6d 100644
--- a/tz/etcetera
+++ b/tz/etcetera
@@ -5,7 +5,7 @@
# These entries are for uses not otherwise covered by the tz database.
# Their main practical use is for platforms like Android that lack
-# support for POSIX.1-2017-style TZ strings. On such platforms these entries
+# support for POSIX proleptic TZ strings. On such platforms these entries
# can be useful if the timezone database is wrong or if a ship or
# aircraft at sea is not in a timezone.
@@ -51,29 +51,29 @@ Link Etc/GMT GMT
# so we moved the names into the Etc subdirectory.
# Also, the time zone abbreviations are now compatible with %z.
-Zone Etc/GMT-14 14 - +14
-Zone Etc/GMT-13 13 - +13
-Zone Etc/GMT-12 12 - +12
-Zone Etc/GMT-11 11 - +11
-Zone Etc/GMT-10 10 - +10
-Zone Etc/GMT-9 9 - +09
-Zone Etc/GMT-8 8 - +08
-Zone Etc/GMT-7 7 - +07
-Zone Etc/GMT-6 6 - +06
-Zone Etc/GMT-5 5 - +05
-Zone Etc/GMT-4 4 - +04
-Zone Etc/GMT-3 3 - +03
-Zone Etc/GMT-2 2 - +02
-Zone Etc/GMT-1 1 - +01
-Zone Etc/GMT+1 -1 - -01
-Zone Etc/GMT+2 -2 - -02
-Zone Etc/GMT+3 -3 - -03
-Zone Etc/GMT+4 -4 - -04
-Zone Etc/GMT+5 -5 - -05
-Zone Etc/GMT+6 -6 - -06
-Zone Etc/GMT+7 -7 - -07
-Zone Etc/GMT+8 -8 - -08
-Zone Etc/GMT+9 -9 - -09
-Zone Etc/GMT+10 -10 - -10
-Zone Etc/GMT+11 -11 - -11
-Zone Etc/GMT+12 -12 - -12
+Zone Etc/GMT-14 14 - %z
+Zone Etc/GMT-13 13 - %z
+Zone Etc/GMT-12 12 - %z
+Zone Etc/GMT-11 11 - %z
+Zone Etc/GMT-10 10 - %z
+Zone Etc/GMT-9 9 - %z
+Zone Etc/GMT-8 8 - %z
+Zone Etc/GMT-7 7 - %z
+Zone Etc/GMT-6 6 - %z
+Zone Etc/GMT-5 5 - %z
+Zone Etc/GMT-4 4 - %z
+Zone Etc/GMT-3 3 - %z
+Zone Etc/GMT-2 2 - %z
+Zone Etc/GMT-1 1 - %z
+Zone Etc/GMT+1 -1 - %z
+Zone Etc/GMT+2 -2 - %z
+Zone Etc/GMT+3 -3 - %z
+Zone Etc/GMT+4 -4 - %z
+Zone Etc/GMT+5 -5 - %z
+Zone Etc/GMT+6 -6 - %z
+Zone Etc/GMT+7 -7 - %z
+Zone Etc/GMT+8 -8 - %z
+Zone Etc/GMT+9 -9 - %z
+Zone Etc/GMT+10 -10 - %z
+Zone Etc/GMT+11 -11 - %z
+Zone Etc/GMT+12 -12 - %z
diff --git a/tz/europe b/tz/europe
index c6b5270..f906394 100644
--- a/tz/europe
+++ b/tz/europe
@@ -730,14 +730,6 @@ Rule Russia 1996 2010 - Oct lastSun 2:00s 0 -
# Take "abolishing daylight saving time" to mean that time is now considered
# to be standard.
-# These are for backward compatibility with older versions.
-
-# Zone NAME STDOFF RULES FORMAT [UNTIL]
-Zone WET 0:00 EU WE%sT
-Zone CET 1:00 C-Eur CE%sT
-Zone MET 1:00 C-Eur ME%sT
-Zone EET 2:00 EU EE%sT
-
# Previous editions of this database used abbreviations like MET DST
# for Central European Summer Time, but this didn't agree with common usage.
@@ -871,7 +863,7 @@ Zone Europe/Minsk 1:50:16 - LMT 1880
3:00 Russia MSK/MSD 1990
3:00 - MSK 1991 Mar 31 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s
- 3:00 - +03
+ 3:00 - %z
# Belgium
# Luxembourg
@@ -1176,22 +1168,22 @@ Rule Thule 2007 max - Nov Sun>=1 2:00 0 S
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28
- -3:00 - -03 1980 Apr 6 2:00
- -3:00 EU -03/-02 1996
+ -3:00 - %z 1980 Apr 6 2:00
+ -3:00 EU %z 1996
0:00 - GMT
#
# Use the old name Scoresbysund, as the current name Ittoqqortoormiit
# exceeds tzdb's 14-letter limit and has no common English abbreviation.
Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
- -2:00 - -02 1980 Apr 6 2:00
- -2:00 C-Eur -02/-01 1981 Mar 29
- -1:00 EU -01/+00 2024 Mar 31
- -2:00 EU -02/-01
+ -2:00 - %z 1980 Apr 6 2:00
+ -2:00 C-Eur %z 1981 Mar 29
+ -1:00 EU %z 2024 Mar 31
+ -2:00 EU %z
Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb
- -3:00 - -03 1980 Apr 6 2:00
- -3:00 EU -03/-02 2023 Mar 26 1:00u
- -2:00 - -02 2023 Oct 29 1:00u
- -2:00 EU -02/-01
+ -3:00 - %z 1980 Apr 6 2:00
+ -3:00 EU %z 2023 Mar 26 1:00u
+ -2:00 - %z 2023 Oct 29 1:00u
+ -2:00 EU %z
Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik
-4:00 Thule A%sT
@@ -2063,10 +2055,39 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# Portugal
-# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
-# According to a Portuguese decree (1911-05-26)
-# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
-# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
+# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07) and Michael
+# Deckers (2021-02-10):
+# http://oal.ul.pt/documentos/2018/01/hl1911a2018.pdf/
+# The Astronomical Observatory of Lisbon has published a list detailing the
+# historical transitions in legal time within continental Portugal. It
+# directly references many decrees and ordinances which are, in turn,
+# referenced below. They can be viewed in the public archives of the Diário da
+# República (until 1976-04-09 known as the Diário do Govêrno) at
+# https://dre.pt/ (in Portuguese).
+#
+# Most of the Rules below have been updated simply to match the Observatory's
+# listing for continental (mainland) Portugal. Although there are over 50
+# referenced decrees and ordinances, only the handful with comments below have
+# been verified against the text, typically to provide additional confidence
+# wherever dates provided by Whitman and Shanks & Pottenger had disagreed.
+# See further below for the Azores and Madeira.
+
+# From Tim Parenti (2024-07-01), per Paul Eggert (2014-08-11), after a
+# heads-up from Stephen Colebourne:
+# According to a 1911-05-24 Portuguese decree, Lisbon was at -0:36:44.68, but
+# switched to GMT on 1912-01-01 at 00:00.
+# https://dre.pt/dr/detalhe/decreto/593090
+# https://dre.pt/application/conteudo/593090
+# The decree made legal time throughout Portugal and her possessions
+# "subordinate to the Greenwich meridian, according to the principle adopted at
+# the Washington Convention in 1884" and eliminated the "difference of five
+# minutes between the internal and external clocks of railway stations".
+#
+# The decree was gazetted in the 1911-05-30 issue of Diário do Govêrno, and is
+# considered to be dated 1911-05-24 by that issue's summary; however, the text
+# of the decree itself is dated 1911-05-26. The Diário da República website
+# notes the discrepancy, but later laws and the Observatory all seem to refer
+# to this decree by the 1911-05-24 date.
#
# From Michael Deckers (2018-02-15):
# article 5 [of the 1911 decree; Deckers's translation] ...:
@@ -2074,37 +2095,62 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# according to the 2nd article, the civil day January 1, 1912 begins,
# all clocks therefore having to be advanced or set back correspondingly ...
-# From Rui Pedro Salgueiro (1992-11-12):
-# Portugal has recently (September, 27) changed timezone
-# (from WET to MET or CET) to harmonize with EEC.
-#
-# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
-# that Portugal is reverting to 0:00 by not moving its clocks this spring.
-# The new Prime Minister was fed up with getting up in the dark in the winter.
-#
-# From Paul Eggert (1996-11-12):
-# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
-# at 02:00u, not 01:00u. Assume that these are typos.
-# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
-# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
-# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
-# harmonized with EU rules), and that they stayed +0:00 that winter.
-#
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
-# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
-# done every year, depending on what Spain did, because of railroad schedules.
-# Go with Shanks & Pottenger.
+# From Tim Parenti (2024-07-01), per Paul Eggert (1999-01-30):
+# DSH writes in their history that Decreto 1469 of 1915-03-30 established
+# summer time and that, "despite" this, the change to the clocks was not done
+# every year, depending on what Spain did, because of railroad schedules.
+# In fact, that decree had nothing to do with DST; rather, it regulated the
+# sending of time signals. But we do see linkage to Spain in the 1920s below.
+# https://dre.pt/dr/detalhe/decreto/1469-1915-285721
+# https://dre.pt/application/conteudo/285721
+#
+# According to the Observatory, standard time was first advanced by Decreto
+# 2433 of 1916-06-09 and restored by Decreto 2712 of 1916-10-28. While Whitman
+# gives 1916-10-31 for the latter transition, Shanks & Pottenger agrees more
+# closely with the decree, which stated that its provision "will start sixty
+# minutes after the end of 31 October, according to the current time," i.e.,
+# 01:00 on 1 November.
+# https://dre.pt/dr/detalhe/decreto/2433-1916-267192
+# https://dre.pt/application/conteudo/267192
+# https://dre.pt/dr/detalhe/decreto/2712-1916-590937
+# https://dre.pt/application/conteudo/590937
Rule Port 1916 only - Jun 17 23:00 1:00 S
-# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
Rule Port 1916 only - Nov 1 1:00 0 -
-Rule Port 1917 only - Feb 28 23:00s 1:00 S
-Rule Port 1917 1921 - Oct 14 23:00s 0 -
-Rule Port 1918 only - Mar 1 23:00s 1:00 S
-Rule Port 1919 only - Feb 28 23:00s 1:00 S
-Rule Port 1920 only - Feb 29 23:00s 1:00 S
-Rule Port 1921 only - Feb 28 23:00s 1:00 S
+# From Tim Parenti (2024-07-01):
+# Article 7 of Decreto 2922 of 1916-12-30 stated that "the legal time will be
+# advanced by sixty minutes from 1 March to 31 October." Per Article 15, this
+# came into force from 1917-01-01. Just before the first fall back, Decreto
+# 3446 of 1917-10-11 changed the annual end date to 14 October.
+# https://dre.pt/dr/detalhe/decreto/2922-1916-261894
+# https://dre.pt/application/conteudo/261894
+# https://dre.pt/dr/detalhe/decreto/3446-1917-495161
+# https://dre.pt/application/conteudo/495161
+# This annual change was revoked by Decreto 8038 of 1922-02-18.
+# https://dre.pt/dr/detalhe/decreto/8038-1922-569751
+# https://dre.pt/application/conteudo/569751
+Rule Port 1917 1921 - Mar 1 0:00 1:00 S
+Rule Port 1917 1921 - Oct 14 24:00 0 -
+# From Tim Parenti (2024-07-01):
+# Decreto 9592 of 1924-04-14 noted that "France maintains the advance of legal
+# time in the summer and Spain has now adopted it for the first time" and
+# considered "that the absence of similar measures would cause serious
+# difficulties for international rail connections with consequent repercussions
+# on domestic service hours..." along with "inconvenient analogues...for postal
+# and telegraph services." Summer time would be in effect from 17 April to 4
+# October, with the spring change explicitly specified by bringing clocks
+# forward from 16 April 23:00.
+# https://dre.pt/dr/detalhe/decreto/9592-1924-652133
+# https://dre.pt/application/conteudo/652133
+#
+# Decreto 10700, issued 1925-04-16, noted that Spain had not continued summer
+# time, declared that "the current legal hour prior to 17 April remains
+# unchanged from that day forward", and revoked legislation to the contrary,
+# just a day before summer time would have otherwise resumed.
+# https://dre.pt/dr/detalhe/decreto/10700-1925-437826
+# https://dre.pt/application/conteudo/437826
Rule Port 1924 only - Apr 16 23:00s 1:00 S
-Rule Port 1924 only - Oct 14 23:00s 0 -
+Rule Port 1924 only - Oct 4 23:00s 0 -
Rule Port 1926 only - Apr 17 23:00s 1:00 S
Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 -
Rule Port 1927 only - Apr 9 23:00s 1:00 S
@@ -2116,6 +2162,8 @@ Rule Port 1931 1932 - Oct Sat>=1 23:00s 0 -
Rule Port 1932 only - Apr 2 23:00s 1:00 S
Rule Port 1934 only - Apr 7 23:00s 1:00 S
# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
+# Note: The 1935 law specified 10-06 00:00, not 10-05 24:00, but the following
+# is equivalent and more succinct.
Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 -
# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
Rule Port 1935 only - Mar 30 23:00s 1:00 S
@@ -2126,10 +2174,19 @@ Rule Port 1938 only - Mar 26 23:00s 1:00 S
Rule Port 1939 only - Apr 15 23:00s 1:00 S
# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
Rule Port 1939 only - Nov 18 23:00s 0 -
+# From Tim Parenti (2024-07-01):
+# Portaria 9465 of 1940-02-17 advanced clocks from Saturday 1940-02-24 23:00.
+# The clocks were restored by Portaria 9658, issued Monday 1940-10-07,
+# effective from 24:00 that very night, which agrees with Shanks & Pottenger;
+# Whitman gives Saturday 1940-10-05 instead.
+# https://dre.pt/dr/detalhe/portaria/9465-1940-189096
+# https://dre.pt/application/conteudo/189096
+# https://dre.pt/dr/detalhe/portaria/9658-1940-196729
+# https://dre.pt/application/conteudo/196729
Rule Port 1940 only - Feb 24 23:00s 1:00 S
-# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
-Rule Port 1940 1941 - Oct 5 23:00s 0 -
+Rule Port 1940 only - Oct 7 23:00s 0 -
Rule Port 1941 only - Apr 5 23:00s 1:00 S
+Rule Port 1941 only - Oct 5 23:00s 0 -
Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S
Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer
Rule Port 1942 only - Aug 15 22:00s 1:00 S
@@ -2139,66 +2196,195 @@ Rule Port 1943 1945 - Aug Sat>=25 22:00s 1:00 S
Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M
Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S
Rule Port 1946 only - Oct Sat>=1 23:00s 0 -
-# Whitman says DST was not observed in 1950; go with Shanks & Pottenger.
-# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
-Rule Port 1947 1965 - Apr Sun>=1 2:00s 1:00 S
+# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07):
+# The Astronomical Observatory of Lisbon cites Portaria 11767 of 1947-03-28 for
+# 1947 and Portaria 12286 of 1948-02-19 for 1948.
+# https://dre.pt/dr/detalhe/portaria/11767-1947-414787
+# https://dre.pt/application/conteudo/414787
+# https://dre.pt/dr/detalhe/portaria/12286-1948-152953
+# https://dre.pt/application/conteudo/152953
+#
+# Although the latter ordinance explicitly had the 1948-10-03 transition
+# scheduled for 02:00 rather than 03:00 as had been used in 1947, Decreto-Lei
+# 37048 of 1948-09-07 recognized "that it is advisable to definitely set...the
+# 'summer time' regime", and fixed the fall transition at 03:00 moving forward.
+# https://dre.pt/dr/detalhe/decreto-lei/37048-1948-373810
+# https://dre.pt/application/conteudo/373810
+# While the Observatory only cites this act for 1949-1965 and not for 1948, it
+# does not appear to have had any provision delaying its effect, so assume that
+# it overrode the prior ordinance for 1948-10-03.
+#
+# Whitman says DST was not observed in 1950 and gives Oct lastSun for 1952 on.
+# The Observatory, however, agrees with Shanks & Pottenger that 1950 was not an
+# exception and that Oct Sun>=1 was maintained through 1965.
+Rule Port 1947 1966 - Apr Sun>=1 2:00s 1:00 S
Rule Port 1947 1965 - Oct Sun>=1 2:00s 0 -
-Rule Port 1977 only - Mar 27 0:00s 1:00 S
-Rule Port 1977 only - Sep 25 0:00s 0 -
-Rule Port 1978 1979 - Apr Sun>=1 0:00s 1:00 S
-Rule Port 1978 only - Oct 1 0:00s 0 -
-Rule Port 1979 1982 - Sep lastSun 1:00s 0 -
-Rule Port 1980 only - Mar lastSun 0:00s 1:00 S
-Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S
-Rule Port 1983 only - Mar lastSun 2:00s 1:00 S
+# From Tim Parenti (2024-07-01):
+# Decreto-Lei 47233 of 1966-10-01 considered that the "duality" in time was
+# "the cause of serious disturbances" and noted that "the countries with which
+# we have the most frequent contacts...have already adopted" a solution
+# coinciding with the extant "summer time". It established that the former
+# "summer time" would apply year-round on the mainland and adjacent islands
+# with immediate effect, as the fall back would have otherwise occurred later
+# that evening.
+# https://dre.pt/dr/detalhe/decreto-lei/47233-1966-293729
+# Model this by changing zones without changing clocks at the
+# previously-appointed fall back time.
+#
+# Decreto-Lei 309/76 of 1976-04-27 acknowledged that those international
+# contacts had returned to adopting seasonal times, and considered that the
+# year-round advancement "entails considerable sacrifices for the vast majority
+# of the working population during the winter months", including morning
+# visibility concerns for schoolchildren. It specified, beginning 1976-09-26
+# 01:00, an annual return to UT+00 on the mainland from 00:00 UT on Sep lastSun
+# to 00:00 UT on Mar lastSun (unless the latter date fell on Easter, in which
+# case it was to be brought forward to the preceding Sunday). It also assigned
+# the Permanent Time Commission to study and propose revisions for the Azores
+# and Madeira, neither of which resumed DST until 1982 (as described further
+# below).
+# https://dre.pt/dr/detalhe/decreto-lei/309-1976-502063
+Rule Port 1976 only - Sep lastSun 1:00 0 -
+Rule Port 1977 only - Mar lastSun 0:00s 1:00 S
+Rule Port 1977 only - Sep lastSun 0:00s 0 -
+# From Tim Parenti (2024-07-01):
+# Beginning in 1978, rather than triggering the Easter rule of the 1976 decree
+# (Easter fell on 1978-03-26), Article 5 was used instead, which allowed DST
+# dates to be changed by order of the Minister of Education and Scientific
+# Research, upon consultation with the Permanent Time Commission, "whenever
+# considered convenient." As such, a series of one-off ordinances were
+# promulgated for the mainland in 1978 through 1980, after which the 1976
+# decree naturally came back into force from 1981.
+Rule Port 1978 1980 - Apr Sun>=1 1:00s 1:00 S
+Rule Port 1978 only - Oct 1 1:00s 0 -
+Rule Port 1979 1980 - Sep lastSun 1:00s 0 -
+Rule Port 1981 1986 - Mar lastSun 0:00s 1:00 S
+Rule Port 1981 1985 - Sep lastSun 0:00s 0 -
+# From Tim Parenti (2024-07-01):
+# Decreto-Lei 44-B/86 of 1986-03-07 switched mainland Portugal's transition
+# times from 0:00s to 1:00u to harmonize with the EEC from 1986-03-30.
+# https://dre.pt/dr/detalhe/decreto-lei/44-b-1986-628280
+# (Transitions of 1:00s as previously reported and used by the W-Eur rules,
+# though equivalent, appear to have been fiction here.) Madeira continued to
+# use 0:00s for spring 1986 before joining with the mainland using 1:00u in the
+# fall; meanwhile, in the Azores the two were equivalent, so the law specifying
+# 0:00s wasn't touched until 1992. (See below for more on the islands.)
+#
+# From Rui Pedro Salgueiro (1992-11-12):
+# Portugal has recently (September, 27) changed timezone
+# (from WET to MET or CET) to harmonize with EEC.
+#
+# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
+# that Portugal is reverting to 0:00 by not moving its clocks this spring.
+# The new Prime Minister was fed up with getting up in the dark in the winter.
+#
+# From Paul Eggert (1996-11-12):
+# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
+# at 02:00u, not 01:00u. Assume that these are typos.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
#STDOFF -0:36:44.68
Zone Europe/Lisbon -0:36:45 - LMT 1884
-0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
- 0:00 Port WE%sT 1966 Apr 3 2:00
+ 0:00 Port WE%sT 1966 Oct 2 2:00s
1:00 - CET 1976 Sep 26 1:00
- 0:00 Port WE%sT 1983 Sep 25 1:00s
- 0:00 W-Eur WE%sT 1992 Sep 27 1:00s
+ 0:00 Port WE%sT 1986
+ 0:00 EU WE%sT 1992 Sep 27 1:00u
1:00 EU CE%sT 1996 Mar 31 1:00u
0:00 EU WE%sT
+
+# From Tim Parenti (2024-07-01):
+# For the Azores and Madeira, legislation was followed from the laws currently
+# in force as listed at:
+# https://oal.ul.pt/hora-legal/legislacao/
+# working backward through references of revocation and abrogation to
+# Decreto-Lei 47233 of 1966-10-01, the last time DST was abolished across the
+# mainland and its adjacent islands. Because of that reference, it is
+# therefore assumed that DST rules in the islands prior to 1966 were like that
+# of the mainland, though most legislation of the time didn't explicitly
+# specify DST practices for the islands.
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
-1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
# Vanguard section, for zic and other parsers that support %z.
-# -2:00 Port %z 1966 Apr 3 2:00
-# -1:00 Port %z 1983 Sep 25 1:00s
-# -1:00 W-Eur %z 1992 Sep 27 1:00s
+ -2:00 Port %z 1966 Oct 2 2:00s
+# From Tim Parenti (2024-07-01):
+# While Decreto-Lei 309/76 of 1976-04-27 reintroduced DST on the mainland by
+# falling back on 1976-09-26, it assigned the Permanent Time Commission to
+# study and propose revisions for the Azores and Madeira. Decreto Regional
+# 9/77/A of 1977-05-17 affirmed that "the legal time remained unchanged in the
+# Azores" at UT-1, and would remain there year-round.
+# https://dre.pt/dr/detalhe/decreto-regional/9-1977-252066
+#
+# Decreto Regional 2/82/A, published 1982-03-02, adopted DST in the same
+# fashion as the mainland used at the time.
+# https://dre.pt/dr/detalhe/decreto-regional/2-1982-599965
+# Though transitions in the Azores officially remained at 0:00s through 1992,
+# this was equivalent to the EU-style 1:00u adopted by the mainland in 1986, so
+# model it as such.
+ -1:00 - %z 1982 Mar 28 0:00s
+ -1:00 Port %z 1986
# Rearguard section, for parsers lacking %z; see ziguard.awk.
- -2:00 Port -02/-01 1942 Apr 25 22:00s
- -2:00 Port +00 1942 Aug 15 22:00s
- -2:00 Port -02/-01 1943 Apr 17 22:00s
- -2:00 Port +00 1943 Aug 28 22:00s
- -2:00 Port -02/-01 1944 Apr 22 22:00s
- -2:00 Port +00 1944 Aug 26 22:00s
- -2:00 Port -02/-01 1945 Apr 21 22:00s
- -2:00 Port +00 1945 Aug 25 22:00s
- -2:00 Port -02/-01 1966 Apr 3 2:00
- -1:00 Port -01/+00 1983 Sep 25 1:00s
- -1:00 W-Eur -01/+00 1992 Sep 27 1:00s
+# -2:00 Port -02/-01 1942 Apr 25 22:00s
+# -2:00 Port +00 1942 Aug 15 22:00s
+# -2:00 Port -02/-01 1943 Apr 17 22:00s
+# -2:00 Port +00 1943 Aug 28 22:00s
+# -2:00 Port -02/-01 1944 Apr 22 22:00s
+# -2:00 Port +00 1944 Aug 26 22:00s
+# -2:00 Port -02/-01 1945 Apr 21 22:00s
+# -2:00 Port +00 1945 Aug 25 22:00s
+# -2:00 Port -02/-01 1966 Oct 2 2:00s
+# -1:00 - -01 1982 Mar 28 0:00s
+# -1:00 Port -01/+00 1986
# End of rearguard section.
- 0:00 EU WE%sT 1993 Mar 28 1:00u
- -1:00 EU -01/+00
+#
+# From Paul Eggert (1996-11-12):
+# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
+# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
+#
+# From Tim Parenti (2024-07-01):
+# After mainland Portugal had shifted forward an hour from 1992-09-27, Decreto
+# Legislativo Regional 29/92/A of 1992-12-23 sought to "reduce the time
+# difference" by shifting the Azores forward as well from 1992-12-27. Just six
+# months later, this was revoked by Decreto Legislativo Regional 9/93/A, citing
+# "major changes in work habits and way of life." Though the revocation didn't
+# give a transition time, it was signed Wednesday 1993-06-16; assume it took
+# effect later that evening, and that an EU-style spring forward (to +01) was
+# still observed in the interim on 1993-03-28.
+# https://dre.pt/dr/detalhe/decreto-legislativo-regional/29-1992-621553
+# https://dre.pt/dr/detalhe/decreto-legislativo-regional/9-1993-389633
+ -1:00 EU %z 1992 Dec 27 1:00s
+ 0:00 EU WE%sT 1993 Jun 17 1:00u
+ -1:00 EU %z
+
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
-1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
# Vanguard section, for zic and other parsers that support %z.
-# -1:00 Port %z 1966 Apr 3 2:00
+ -1:00 Port %z 1966 Oct 2 2:00s
# Rearguard section, for parsers lacking %z; see ziguard.awk.
- -1:00 Port -01/+00 1942 Apr 25 22:00s
- -1:00 Port +01 1942 Aug 15 22:00s
- -1:00 Port -01/+00 1943 Apr 17 22:00s
- -1:00 Port +01 1943 Aug 28 22:00s
- -1:00 Port -01/+00 1944 Apr 22 22:00s
- -1:00 Port +01 1944 Aug 26 22:00s
- -1:00 Port -01/+00 1945 Apr 21 22:00s
- -1:00 Port +01 1945 Aug 25 22:00s
- -1:00 Port -01/+00 1966 Apr 3 2:00
+# -1:00 Port -01/+00 1942 Apr 25 22:00s
+# -1:00 Port +01 1942 Aug 15 22:00s
+# -1:00 Port -01/+00 1943 Apr 17 22:00s
+# -1:00 Port +01 1943 Aug 28 22:00s
+# -1:00 Port -01/+00 1944 Apr 22 22:00s
+# -1:00 Port +01 1944 Aug 26 22:00s
+# -1:00 Port -01/+00 1945 Apr 21 22:00s
+# -1:00 Port +01 1945 Aug 25 22:00s
+# -1:00 Port -01/+00 1966 Oct 2 2:00s
# End of rearguard section.
- 0:00 Port WE%sT 1983 Sep 25 1:00s
+#
+# From Tim Parenti (2024-07-01):
+# Decreto Regional 5/82/M, published 1982-04-03, established DST transitions at
+# 0:00u, which for Madeira is equivalent to the mainland's rules (0:00s) at the
+# time. It came into effect the day following its publication, Sunday
+# 1982-04-04, thus resuming Madeira's DST practice about a week later than the
+# mainland and the Azores.
+# https://dre.pt/dr/detalhe/decreto-regional/5-1982-608273
+#
+# Decreto Legislativo Regional 18/86/M, published 1986-10-01, adopted EU-style
+# rules (1:00u) and entered into immediate force after being signed on
+# 1986-07-31.
+# https://dre.pt/dr/detalhe/decreto-legislativo-regional/18-1986-221705
+ 0:00 - WET 1982 Apr 4
+ 0:00 Port WE%sT 1986 Jul 31
0:00 EU WE%sT
# Romania
@@ -2410,7 +2596,7 @@ Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
2:00 Poland EE%sT 1946 Apr 7
3:00 Russia MSK/MSD 1989 Mar 26 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s
- 3:00 - +03 2014 Oct 26 2:00s
+ 3:00 - %z 2014 Oct 26 2:00s
2:00 - EET
@@ -2660,14 +2846,14 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201602150056
Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
- 3:00 - +03 1930 Jun 21
- 4:00 Russia +04/+05 1989 Mar 26 2:00s
- 3:00 Russia +03/+04 1991 Mar 31 2:00s
- 4:00 - +04 1992 Mar 29 2:00s
- 3:00 Russia +03/+04 2011 Mar 27 2:00s
- 4:00 - +04 2014 Oct 26 2:00s
- 3:00 - +03 2016 Mar 27 2:00s
- 4:00 - +04
+ 3:00 - %z 1930 Jun 21
+ 4:00 Russia %z 1989 Mar 26 2:00s
+ 3:00 Russia %z 1991 Mar 31 2:00s
+ 4:00 - %z 1992 Mar 29 2:00s
+ 3:00 Russia %z 2011 Mar 27 2:00s
+ 4:00 - %z 2014 Oct 26 2:00s
+ 3:00 - %z 2016 Mar 27 2:00s
+ 4:00 - %z
# From Paul Eggert (2016-11-11):
# Europe/Volgograd covers:
@@ -2697,15 +2883,15 @@ Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
# http://publication.pravo.gov.ru/Document/View/0001202012220002
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
- 3:00 - +03 1930 Jun 21
- 4:00 - +04 1961 Nov 11
- 4:00 Russia +04/+05 1988 Mar 27 2:00s
+ 3:00 - %z 1930 Jun 21
+ 4:00 - %z 1961 Nov 11
+ 4:00 Russia %z 1988 Mar 27 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
- 4:00 - +04 1992 Mar 29 2:00s
+ 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK 2018 Oct 28 2:00s
- 4:00 - +04 2020 Dec 27 2:00s
+ 4:00 - %z 2020 Dec 27 2:00s
3:00 - MSK
# From Paul Eggert (2016-11-11):
@@ -2720,14 +2906,14 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
# http://publication.pravo.gov.ru/Document/View/0001201611220031
Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
- 3:00 - +03 1930 Jun 21
- 4:00 Russia +04/+05 1988 Mar 27 2:00s
- 3:00 Russia +03/+04 1991 Mar 31 2:00s
- 4:00 - +04 1992 Mar 29 2:00s
- 3:00 Russia +03/+04 2011 Mar 27 2:00s
- 4:00 - +04 2014 Oct 26 2:00s
- 3:00 - +03 2016 Dec 4 2:00s
- 4:00 - +04
+ 3:00 - %z 1930 Jun 21
+ 4:00 Russia %z 1988 Mar 27 2:00s
+ 3:00 Russia %z 1991 Mar 31 2:00s
+ 4:00 - %z 1992 Mar 29 2:00s
+ 3:00 Russia %z 2011 Mar 27 2:00s
+ 4:00 - %z 2014 Oct 26 2:00s
+ 3:00 - %z 2016 Dec 4 2:00s
+ 4:00 - %z
# From Paul Eggert (2016-03-18):
# Europe/Kirov covers:
@@ -2735,10 +2921,10 @@ Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14).
#
Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
- 3:00 - +03 1930 Jun 21
- 4:00 Russia +04/+05 1989 Mar 26 2:00s
+ 3:00 - %z 1930 Jun 21
+ 4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
- 4:00 - +04 1992 Mar 29 2:00s
+ 4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK
@@ -2753,15 +2939,15 @@ Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
- 3:00 - +03 1930 Jun 21
- 4:00 - +04 1935 Jan 27
- 4:00 Russia +04/+05 1989 Mar 26 2:00s
- 3:00 Russia +03/+04 1991 Mar 31 2:00s
- 2:00 Russia +02/+03 1991 Sep 29 2:00s
- 3:00 - +03 1991 Oct 20 3:00
- 4:00 Russia +04/+05 2010 Mar 28 2:00s
- 3:00 Russia +03/+04 2011 Mar 27 2:00s
- 4:00 - +04
+ 3:00 - %z 1930 Jun 21
+ 4:00 - %z 1935 Jan 27
+ 4:00 Russia %z 1989 Mar 26 2:00s
+ 3:00 Russia %z 1991 Mar 31 2:00s
+ 2:00 Russia %z 1991 Sep 29 2:00s
+ 3:00 - %z 1991 Oct 20 3:00
+ 4:00 Russia %z 2010 Mar 28 2:00s
+ 3:00 Russia %z 2011 Mar 27 2:00s
+ 4:00 - %z
# From Paul Eggert (2016-03-18):
# Europe/Ulyanovsk covers:
@@ -2777,14 +2963,14 @@ Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
# http://publication.pravo.gov.ru/Document/View/0001201603090051
Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
- 3:00 - +03 1930 Jun 21
- 4:00 Russia +04/+05 1989 Mar 26 2:00s
- 3:00 Russia +03/+04 1991 Mar 31 2:00s
- 2:00 Russia +02/+03 1992 Jan 19 2:00s
- 3:00 Russia +03/+04 2011 Mar 27 2:00s
- 4:00 - +04 2014 Oct 26 2:00s
- 3:00 - +03 2016 Mar 27 2:00s
- 4:00 - +04
+ 3:00 - %z 1930 Jun 21
+ 4:00 Russia %z 1989 Mar 26 2:00s
+ 3:00 Russia %z 1991 Mar 31 2:00s
+ 2:00 Russia %z 1992 Jan 19 2:00s
+ 3:00 Russia %z 2011 Mar 27 2:00s
+ 4:00 - %z 2014 Oct 26 2:00s
+ 3:00 - %z 2016 Mar 27 2:00s
+ 4:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Yekaterinburg covers...
@@ -2809,12 +2995,12 @@ Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
#STDOFF 4:02:32.9
Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
3:45:05 - PMT 1919 Jul 15 4:00
- 4:00 - +04 1930 Jun 21
- 5:00 Russia +05/+06 1991 Mar 31 2:00s
- 4:00 Russia +04/+05 1992 Jan 19 2:00s
- 5:00 Russia +05/+06 2011 Mar 27 2:00s
- 6:00 - +06 2014 Oct 26 2:00s
- 5:00 - +05
+ 4:00 - %z 1930 Jun 21
+ 5:00 Russia %z 1991 Mar 31 2:00s
+ 4:00 Russia %z 1992 Jan 19 2:00s
+ 5:00 Russia %z 2011 Mar 27 2:00s
+ 6:00 - %z 2014 Oct 26 2:00s
+ 5:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@@ -2824,12 +3010,12 @@ Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
# Byalokoz 1919 says Omsk was 4:53:30.
Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
- 5:00 - +05 1930 Jun 21
- 6:00 Russia +06/+07 1991 Mar 31 2:00s
- 5:00 Russia +05/+06 1992 Jan 19 2:00s
- 6:00 Russia +06/+07 2011 Mar 27 2:00s
- 7:00 - +07 2014 Oct 26 2:00s
- 6:00 - +06
+ 5:00 - %z 1930 Jun 21
+ 6:00 Russia %z 1991 Mar 31 2:00s
+ 5:00 Russia %z 1992 Jan 19 2:00s
+ 6:00 Russia %z 2011 Mar 27 2:00s
+ 7:00 - %z 2014 Oct 26 2:00s
+ 6:00 - %z
# From Paul Eggert (2016-02-22):
# Asia/Barnaul covers:
@@ -2862,14 +3048,14 @@ Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
# http://publication.pravo.gov.ru/Document/View/0001201603090038
Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
- 6:00 - +06 1930 Jun 21
- 7:00 Russia +07/+08 1991 Mar 31 2:00s
- 6:00 Russia +06/+07 1992 Jan 19 2:00s
- 7:00 Russia +07/+08 1995 May 28
- 6:00 Russia +06/+07 2011 Mar 27 2:00s
- 7:00 - +07 2014 Oct 26 2:00s
- 6:00 - +06 2016 Mar 27 2:00s
- 7:00 - +07
+ 6:00 - %z 1930 Jun 21
+ 7:00 Russia %z 1991 Mar 31 2:00s
+ 6:00 Russia %z 1992 Jan 19 2:00s
+ 7:00 Russia %z 1995 May 28
+ 6:00 Russia %z 2011 Mar 27 2:00s
+ 7:00 - %z 2014 Oct 26 2:00s
+ 6:00 - %z 2016 Mar 27 2:00s
+ 7:00 - %z
# From Paul Eggert (2016-03-18):
# Asia/Novosibirsk covers:
@@ -2883,14 +3069,14 @@ Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
# http://publication.pravo.gov.ru/Document/View/0001201607040064
Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
- 6:00 - +06 1930 Jun 21
- 7:00 Russia +07/+08 1991 Mar 31 2:00s
- 6:00 Russia +06/+07 1992 Jan 19 2:00s
- 7:00 Russia +07/+08 1993 May 23 # say Shanks & P.
- 6:00 Russia +06/+07 2011 Mar 27 2:00s
- 7:00 - +07 2014 Oct 26 2:00s
- 6:00 - +06 2016 Jul 24 2:00s
- 7:00 - +07
+ 6:00 - %z 1930 Jun 21
+ 7:00 Russia %z 1991 Mar 31 2:00s
+ 6:00 Russia %z 1992 Jan 19 2:00s
+ 7:00 Russia %z 1993 May 23 # say Shanks & P.
+ 6:00 Russia %z 2011 Mar 27 2:00s
+ 7:00 - %z 2014 Oct 26 2:00s
+ 6:00 - %z 2016 Jul 24 2:00s
+ 7:00 - %z
# From Paul Eggert (2016-03-18):
# Asia/Tomsk covers:
@@ -2935,14 +3121,14 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
# http://publication.pravo.gov.ru/Document/View/0001201604260048
Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
- 6:00 - +06 1930 Jun 21
- 7:00 Russia +07/+08 1991 Mar 31 2:00s
- 6:00 Russia +06/+07 1992 Jan 19 2:00s
- 7:00 Russia +07/+08 2002 May 1 3:00
- 6:00 Russia +06/+07 2011 Mar 27 2:00s
- 7:00 - +07 2014 Oct 26 2:00s
- 6:00 - +06 2016 May 29 2:00s
- 7:00 - +07
+ 6:00 - %z 1930 Jun 21
+ 7:00 Russia %z 1991 Mar 31 2:00s
+ 6:00 Russia %z 1992 Jan 19 2:00s
+ 7:00 Russia %z 2002 May 1 3:00
+ 6:00 Russia %z 2011 Mar 27 2:00s
+ 7:00 - %z 2014 Oct 26 2:00s
+ 6:00 - %z 2016 May 29 2:00s
+ 7:00 - %z
# From Tim Parenti (2014-07-03):
@@ -2973,12 +3159,12 @@ Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
# realigning itself with KRAT.
Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
- 6:00 - +06 1930 Jun 21
- 7:00 Russia +07/+08 1991 Mar 31 2:00s
- 6:00 Russia +06/+07 1992 Jan 19 2:00s
- 7:00 Russia +07/+08 2010 Mar 28 2:00s
- 6:00 Russia +06/+07 2011 Mar 27 2:00s
- 7:00 - +07
+ 6:00 - %z 1930 Jun 21
+ 7:00 Russia %z 1991 Mar 31 2:00s
+ 6:00 Russia %z 1992 Jan 19 2:00s
+ 7:00 Russia %z 2010 Mar 28 2:00s
+ 6:00 Russia %z 2011 Mar 27 2:00s
+ 7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Krasnoyarsk covers...
@@ -2992,12 +3178,12 @@ Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
# Byalokoz 1919 says Krasnoyarsk was 6:11:26.
Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
- 6:00 - +06 1930 Jun 21
- 7:00 Russia +07/+08 1991 Mar 31 2:00s
- 6:00 Russia +06/+07 1992 Jan 19 2:00s
- 7:00 Russia +07/+08 2011 Mar 27 2:00s
- 8:00 - +08 2014 Oct 26 2:00s
- 7:00 - +07
+ 6:00 - %z 1930 Jun 21
+ 7:00 Russia %z 1991 Mar 31 2:00s
+ 6:00 Russia %z 1992 Jan 19 2:00s
+ 7:00 Russia %z 2011 Mar 27 2:00s
+ 8:00 - %z 2014 Oct 26 2:00s
+ 7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@@ -3014,12 +3200,12 @@ Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
Zone Asia/Irkutsk 6:57:05 - LMT 1880
6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time
- 7:00 - +07 1930 Jun 21
- 8:00 Russia +08/+09 1991 Mar 31 2:00s
- 7:00 Russia +07/+08 1992 Jan 19 2:00s
- 8:00 Russia +08/+09 2011 Mar 27 2:00s
- 9:00 - +09 2014 Oct 26 2:00s
- 8:00 - +08
+ 7:00 - %z 1930 Jun 21
+ 8:00 Russia %z 1991 Mar 31 2:00s
+ 7:00 Russia %z 1992 Jan 19 2:00s
+ 8:00 Russia %z 2011 Mar 27 2:00s
+ 9:00 - %z 2014 Oct 26 2:00s
+ 8:00 - %z
# From Tim Parenti (2014-07-06):
@@ -3036,13 +3222,13 @@ Zone Asia/Irkutsk 6:57:05 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201512300107
Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
- 8:00 - +08 1930 Jun 21
- 9:00 Russia +09/+10 1991 Mar 31 2:00s
- 8:00 Russia +08/+09 1992 Jan 19 2:00s
- 9:00 Russia +09/+10 2011 Mar 27 2:00s
- 10:00 - +10 2014 Oct 26 2:00s
- 8:00 - +08 2016 Mar 27 2:00
- 9:00 - +09
+ 8:00 - %z 1930 Jun 21
+ 9:00 Russia %z 1991 Mar 31 2:00s
+ 8:00 Russia %z 1992 Jan 19 2:00s
+ 9:00 Russia %z 2011 Mar 27 2:00s
+ 10:00 - %z 2014 Oct 26 2:00s
+ 8:00 - %z 2016 Mar 27 2:00
+ 9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@@ -3082,12 +3268,12 @@ Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
# Byalokoz 1919 says Yakutsk was 8:38:58.
Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
- 8:00 - +08 1930 Jun 21
- 9:00 Russia +09/+10 1991 Mar 31 2:00s
- 8:00 Russia +08/+09 1992 Jan 19 2:00s
- 9:00 Russia +09/+10 2011 Mar 27 2:00s
- 10:00 - +10 2014 Oct 26 2:00s
- 9:00 - +09
+ 8:00 - %z 1930 Jun 21
+ 9:00 Russia %z 1991 Mar 31 2:00s
+ 8:00 Russia %z 1992 Jan 19 2:00s
+ 9:00 Russia %z 2011 Mar 27 2:00s
+ 10:00 - %z 2014 Oct 26 2:00s
+ 9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@@ -3105,12 +3291,12 @@ Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
# Go with Byalokoz.
Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
- 9:00 - +09 1930 Jun 21
- 10:00 Russia +10/+11 1991 Mar 31 2:00s
- 9:00 Russia +09/+10 1992 Jan 19 2:00s
- 10:00 Russia +10/+11 2011 Mar 27 2:00s
- 11:00 - +11 2014 Oct 26 2:00s
- 10:00 - +10
+ 9:00 - %z 1930 Jun 21
+ 10:00 Russia %z 1991 Mar 31 2:00s
+ 9:00 Russia %z 1992 Jan 19 2:00s
+ 10:00 Russia %z 2011 Mar 27 2:00s
+ 11:00 - %z 2014 Oct 26 2:00s
+ 10:00 - %z
# From Tim Parenti (2014-07-03):
@@ -3128,14 +3314,14 @@ Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
# This transition is no doubt wrong, but we have no better info.
Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
- 8:00 - +08 1930 Jun 21
- 9:00 Russia +09/+10 1991 Mar 31 2:00s
- 8:00 Russia +08/+09 1992 Jan 19 2:00s
- 9:00 Russia +09/+10 2004
- 10:00 Russia +10/+11 2011 Mar 27 2:00s
- 11:00 - +11 2011 Sep 13 0:00s # Decree 725?
- 10:00 - +10 2014 Oct 26 2:00s
- 9:00 - +09
+ 8:00 - %z 1930 Jun 21
+ 9:00 Russia %z 1991 Mar 31 2:00s
+ 8:00 Russia %z 1992 Jan 19 2:00s
+ 9:00 Russia %z 2004
+ 10:00 Russia %z 2011 Mar 27 2:00s
+ 11:00 - %z 2011 Sep 13 0:00s # Decree 725?
+ 10:00 - %z 2014 Oct 26 2:00s
+ 9:00 - %z
# From Tim Parenti (2014-07-03):
@@ -3151,14 +3337,14 @@ Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
# The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long.
Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
- 9:00 - +09 1945 Aug 25
- 11:00 Russia +11/+12 1991 Mar 31 2:00s # Sakhalin T
- 10:00 Russia +10/+11 1992 Jan 19 2:00s
- 11:00 Russia +11/+12 1997 Mar lastSun 2:00s
- 10:00 Russia +10/+11 2011 Mar 27 2:00s
- 11:00 - +11 2014 Oct 26 2:00s
- 10:00 - +10 2016 Mar 27 2:00s
- 11:00 - +11
+ 9:00 - %z 1945 Aug 25
+ 11:00 Russia %z 1991 Mar 31 2:00s # Sakhalin T
+ 10:00 Russia %z 1992 Jan 19 2:00s
+ 11:00 Russia %z 1997 Mar lastSun 2:00s
+ 10:00 Russia %z 2011 Mar 27 2:00s
+ 11:00 - %z 2014 Oct 26 2:00s
+ 10:00 - %z 2016 Mar 27 2:00s
+ 11:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@@ -3181,13 +3367,13 @@ Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
# http://publication.pravo.gov.ru/Document/View/0001201604050038
Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
- 10:00 - +10 1930 Jun 21 # Magadan Time
- 11:00 Russia +11/+12 1991 Mar 31 2:00s
- 10:00 Russia +10/+11 1992 Jan 19 2:00s
- 11:00 Russia +11/+12 2011 Mar 27 2:00s
- 12:00 - +12 2014 Oct 26 2:00s
- 10:00 - +10 2016 Apr 24 2:00s
- 11:00 - +11
+ 10:00 - %z 1930 Jun 21 # Magadan Time
+ 11:00 Russia %z 1991 Mar 31 2:00s
+ 10:00 Russia %z 1992 Jan 19 2:00s
+ 11:00 Russia %z 2011 Mar 27 2:00s
+ 12:00 - %z 2014 Oct 26 2:00s
+ 10:00 - %z 2016 Apr 24 2:00s
+ 11:00 - %z
# From Tim Parenti (2014-07-06):
@@ -3232,12 +3418,12 @@ Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
# Go with Srednekolymsk.
Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
- 10:00 - +10 1930 Jun 21
- 11:00 Russia +11/+12 1991 Mar 31 2:00s
- 10:00 Russia +10/+11 1992 Jan 19 2:00s
- 11:00 Russia +11/+12 2011 Mar 27 2:00s
- 12:00 - +12 2014 Oct 26 2:00s
- 11:00 - +11
+ 10:00 - %z 1930 Jun 21
+ 11:00 Russia %z 1991 Mar 31 2:00s
+ 10:00 Russia %z 1992 Jan 19 2:00s
+ 11:00 Russia %z 2011 Mar 27 2:00s
+ 12:00 - %z 2014 Oct 26 2:00s
+ 11:00 - %z
# From Tim Parenti (2014-07-03):
@@ -3255,14 +3441,14 @@ Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
# UTC+12 since at least then, too.
Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
- 8:00 - +08 1930 Jun 21
- 9:00 Russia +09/+10 1981 Apr 1
- 11:00 Russia +11/+12 1991 Mar 31 2:00s
- 10:00 Russia +10/+11 1992 Jan 19 2:00s
- 11:00 Russia +11/+12 2011 Mar 27 2:00s
- 12:00 - +12 2011 Sep 13 0:00s # Decree 725?
- 11:00 - +11 2014 Oct 26 2:00s
- 10:00 - +10
+ 8:00 - %z 1930 Jun 21
+ 9:00 Russia %z 1981 Apr 1
+ 11:00 Russia %z 1991 Mar 31 2:00s
+ 10:00 Russia %z 1992 Jan 19 2:00s
+ 11:00 Russia %z 2011 Mar 27 2:00s
+ 12:00 - %z 2011 Sep 13 0:00s # Decree 725?
+ 11:00 - %z 2014 Oct 26 2:00s
+ 10:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@@ -3275,12 +3461,12 @@ Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
# The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps
# Asia/Petropavlovsk-Kamchatsky, but these are too long.
Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
- 11:00 - +11 1930 Jun 21
- 12:00 Russia +12/+13 1991 Mar 31 2:00s
- 11:00 Russia +11/+12 1992 Jan 19 2:00s
- 12:00 Russia +12/+13 2010 Mar 28 2:00s
- 11:00 Russia +11/+12 2011 Mar 27 2:00s
- 12:00 - +12
+ 11:00 - %z 1930 Jun 21
+ 12:00 Russia %z 1991 Mar 31 2:00s
+ 11:00 Russia %z 1992 Jan 19 2:00s
+ 12:00 Russia %z 2010 Mar 28 2:00s
+ 11:00 Russia %z 2011 Mar 27 2:00s
+ 12:00 - %z
# From Tim Parenti (2014-07-03):
@@ -3288,13 +3474,13 @@ Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
# 87 RU-CHU Chukotka Autonomous Okrug
Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
- 12:00 - +12 1930 Jun 21
- 13:00 Russia +13/+14 1982 Apr 1 0:00s
- 12:00 Russia +12/+13 1991 Mar 31 2:00s
- 11:00 Russia +11/+12 1992 Jan 19 2:00s
- 12:00 Russia +12/+13 2010 Mar 28 2:00s
- 11:00 Russia +11/+12 2011 Mar 27 2:00s
- 12:00 - +12
+ 12:00 - %z 1930 Jun 21
+ 13:00 Russia %z 1982 Apr 1 0:00s
+ 12:00 Russia %z 1991 Mar 31 2:00s
+ 11:00 Russia %z 1992 Jan 19 2:00s
+ 12:00 Russia %z 2010 Mar 28 2:00s
+ 11:00 Russia %z 2011 Mar 27 2:00s
+ 12:00 - %z
# Bosnia & Herzegovina
# Croatia
@@ -3413,7 +3599,7 @@ Zone Africa/Ceuta -0:21:16 - LMT 1901 Jan 1 0:00u
1:00 - CET 1986
1:00 EU CE%sT
Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
- -1:00 - -01 1946 Sep 30 1:00
+ -1:00 - %z 1946 Sep 30 1:00
0:00 - WET 1980 Apr 6 0:00s
0:00 1:00 WEST 1980 Sep 28 1:00u
0:00 EU WE%sT
@@ -3494,8 +3680,8 @@ Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
# but if no one is present after 11 at night, could be postponed until one
# hour before the beginning of service.
-# From Paul Eggert (2013-09-11):
-# Round BMT to the nearest even second, 0:29:46.
+# From Paul Eggert (2024-05-24):
+# Express BMT as 0:29:45.500, approximately the same precision 7° 26' 22.50".
#
# We can find no reliable source for Shanks's assertion that all of Switzerland
# except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book:
@@ -3534,6 +3720,7 @@ Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S
Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment.
+ #STDOFF 0:29:45.500
0:29:46 - BMT 1894 Jun # Bern Mean Time
1:00 Swiss CE%sT 1981
1:00 EU CE%sT
@@ -3731,7 +3918,7 @@ Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
Zone Europe/Istanbul 1:55:52 - LMT 1880
1:56:56 - IMT 1910 Oct # Istanbul Mean Time?
2:00 Turkey EE%sT 1978 Jun 29
- 3:00 Turkey +03/+04 1984 Nov 1 2:00
+ 3:00 Turkey %z 1984 Nov 1 2:00
2:00 Turkey EE%sT 2007
2:00 EU EE%sT 2011 Mar 27 1:00u
2:00 - EET 2011 Mar 28 1:00u
@@ -3740,7 +3927,7 @@ Zone Europe/Istanbul 1:55:52 - LMT 1880
2:00 EU EE%sT 2015 Oct 25 1:00u
2:00 1:00 EEST 2015 Nov 8 1:00u
2:00 EU EE%sT 2016 Sep 7
- 3:00 - +03
+ 3:00 - %z
# Ukraine
#
diff --git a/tz/leap-seconds.list b/tz/leap-seconds.list
index e52effc..da0efc8 100644
--- a/tz/leap-seconds.list
+++ b/tz/leap-seconds.list
@@ -1,5 +1,5 @@
-# ATOMIC TIME.
-# The Coordinated Universal Time (UTC) is the reference time scale derived
+# ATOMIC TIME
+# Coordinated Universal Time (UTC) is the reference time scale derived
# from The "Temps Atomique International" (TAI) calculated by the Bureau
# International des Poids et Mesures (BIPM) using a worldwide network of atomic
# clocks. UTC differs from TAI by an integer number of seconds; it is the basis
@@ -8,34 +8,34 @@
#
# ASTRONOMICAL TIME (UT1) is the time scale based on the rate of rotation of the earth.
# It is now mainly derived from Very Long Baseline Interferometry (VLBI). The various
-# irregular fluctuations progressively detected in the rotation rate of the Earth lead
+# irregular fluctuations progressively detected in the rotation rate of the Earth led
# in 1972 to the replacement of UT1 by UTC as the reference time scale.
#
#
# LEAP SECOND
-# Atomic clocks are more stable than the rate of the earth rotation since the latter
+# Atomic clocks are more stable than the rate of the earth's rotation since the latter
# undergoes a full range of geophysical perturbations at various time scales: lunisolar
-# and core-mantle torques, atmospheric and oceanic effetcs, etc.
+# and core-mantle torques, atmospheric and oceanic effects, etc.
# Leap seconds are needed to keep the two time scales in agreement, i.e. UT1-UTC smaller
-# than 0.9 second. Therefore, when necessary a "leap second" is applied to UTC.
+# than 0.9 seconds. Therefore, when necessary a "leap second" is applied to UTC.
# Since the adoption of this system in 1972 it has been necessary to add a number of seconds to UTC,
# firstly due to the initial choice of the value of the second (1/86400 mean solar day of
# the year 1820) and secondly to the general slowing down of the Earth's rotation. It is
-# theorically possible to have a negative leap second (a second removed from UTC), but so far,
+# theoretically possible to have a negative leap second (a second removed from UTC), but so far,
# all leap seconds have been positive (a second has been added to UTC). Based on what we know about
# the earth's rotation, it is unlikely that we will ever have a negative leap second.
#
#
# HISTORY
-# The first leap second was added on June 30, 1972. Until yhe year 2000, it was necessary in average to add a
+# The first leap second was added on June 30, 1972. Until the year 2000, it was necessary in average to add a
# leap second at a rate of 1 to 2 years. Since the year 2000 leap seconds are introduced with an
-# average interval of 3 to 4 years due to the acceleration of the Earth rotation speed.
+# average interval of 3 to 4 years due to the acceleration of the Earth's rotation speed.
#
#
-# RESPONSABILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC
+# RESPONSIBILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC
# The decision to introduce a leap second in UTC is the responsibility of the Earth Orientation Center of
# the International Earth Rotation and reference System Service (IERS). This center is located at Paris
-# Observatory. According to international agreements, leap seconds should only be scheduled for certain dates:
+# Observatory. According to international agreements, leap seconds should be scheduled only for certain dates:
# first preference is given to the end of December and June, and second preference at the end of March
# and September. Since the introduction of leap seconds in 1972, only dates in June and December were used.
#
@@ -60,15 +60,15 @@
#
# The following line shows the last update of this file in NTP timestamp:
#
-#$ 3913697179
+#$ 3929093563
#
# 2) Expiration date of the file given on a semi-annual basis: last June or last December
#
-# File expires on 28 December 2024
+# File expires on 28 June 2025
#
# Expire date in NTP timestamp:
#
-#@ 3944332800
+#@ 3960057600
#
#
# LIST OF LEAP SECONDS
@@ -117,4 +117,4 @@
# please see the readme file in the 'source' directory :
# https://hpiers.obspm.fr/iers/bul/bulc/ntp/sources/README
#
-#h 9dac5845 8acd32c0 2947d462 daf4a943 f58d9391
+#h be738595 57b0cf1b b0218343 fb77062f 5a775e7
diff --git a/tz/localtime.c b/tz/localtime.c
index 940a04f..7ae9ce5 100644
--- a/tz/localtime.c
+++ b/tz/localtime.c
@@ -106,7 +106,7 @@ static char const UNSPEC[] = "-00";
for ttunspecified to work without crashing. */
enum { CHARS_EXTRA = max(sizeof UNSPEC, 2) - 1 };
-/* Limit to time zone abbreviation length in POSIX.1-2017-style TZ strings.
+/* Limit to time zone abbreviation length in proleptic TZ strings.
This is distinct from TZ_MAX_CHARS, which limits TZif file contents. */
#ifndef TZNAME_MAXIMUM
# define TZNAME_MAXIMUM 255
@@ -130,11 +130,6 @@ struct state {
char chars[max(max(TZ_MAX_CHARS + CHARS_EXTRA, sizeof "UTC"),
2 * (TZNAME_MAXIMUM + 1))];
struct lsinfo lsis[TZ_MAX_LEAPS];
-
- /* The time type to use for early times or if no transitions.
- It is always zero for recent tzdb releases.
- It might be nonzero for data from tzdb 2018e or earlier. */
- int defaulttype;
};
enum r_type {
@@ -187,8 +182,9 @@ static int lcl_is_set;
** objects: a broken-down time structure and an array of char.
** Thanks to Paul Eggert for noting this.
**
-** This requirement was removed in C99, so support it only if requested,
-** as support is more likely to lead to bugs in badly written programs.
+** Although this requirement was removed in C99 it is still present in POSIX.
+** Follow the requirement if SUPPORT_C89, even though this is more likely to
+** trigger latent bugs in programs.
*/
#if SUPPORT_C89
@@ -710,58 +706,6 @@ tzloadbody(char const *name, struct state *sp, bool doextend,
if (sp->typecnt == 0)
return EINVAL;
- /* Infer sp->defaulttype from the data. Although this default
- type is always zero for data from recent tzdb releases,
- things are trickier for data from tzdb 2018e or earlier.
-
- The first set of heuristics work around bugs in 32-bit data
- generated by tzdb 2013c or earlier. The workaround is for
- zones like Australia/Macquarie where timestamps before the
- first transition have a time type that is not the earliest
- standard-time type. See:
- https://mm.icann.org/pipermail/tz/2013-May/019368.html */
- /*
- ** If type 0 does not specify local time, or is unused in transitions,
- ** it's the type to use for early times.
- */
- for (i = 0; i < sp->timecnt; ++i)
- if (sp->types[i] == 0)
- break;
- i = i < sp->timecnt && ! ttunspecified(sp, 0) ? -1 : 0;
- /*
- ** Absent the above,
- ** if there are transition times
- ** and the first transition is to a daylight time
- ** find the standard type less than and closest to
- ** the type of the first transition.
- */
- if (i < 0 && sp->timecnt > 0 && sp->ttis[sp->types[0]].tt_isdst) {
- i = sp->types[0];
- while (--i >= 0)
- if (!sp->ttis[i].tt_isdst)
- break;
- }
- /* The next heuristics are for data generated by tzdb 2018e or
- earlier, for zones like EST5EDT where the first transition
- is to DST. */
- /*
- ** If no result yet, find the first standard type.
- ** If there is none, punt to type zero.
- */
- if (i < 0) {
- i = 0;
- while (sp->ttis[i].tt_isdst)
- if (++i >= sp->typecnt) {
- i = 0;
- break;
- }
- }
- /* A simple 'sp->defaulttype = 0;' would suffice here if we
- didn't have to worry about 2018e-or-earlier data. Even
- simpler would be to remove the defaulttype member and just
- use 0 in its place. */
- sp->defaulttype = i;
-
return 0;
}
@@ -807,7 +751,7 @@ is_digit(char c)
** Return a pointer to that character.
*/
-ATTRIBUTE_REPRODUCIBLE static const char *
+ATTRIBUTE_PURE_114833 static const char *
getzname(register const char *strp)
{
register char c;
@@ -828,7 +772,7 @@ getzname(register const char *strp)
** We don't do any checking here; checking is done later in common-case code.
*/
-ATTRIBUTE_REPRODUCIBLE static const char *
+ATTRIBUTE_PURE_114833 static const char *
getqzname(register const char *strp, const int delim)
{
register int c;
@@ -1080,7 +1024,7 @@ transtime(const int year, register const struct rule *const rulep,
}
/*
-** Given a POSIX.1-2017-style TZ string, fill in the rule tables as
+** Given a POSIX.1 proleptic TZ string, fill in the rule tables as
** appropriate.
*/
@@ -1183,11 +1127,13 @@ tzparse(const char *name, struct state *sp, struct state const *basep)
do {
int_fast32_t yearsecs
= year_lengths[isleap(yearbeg - 1)] * SECSPERDAY;
+ time_t janfirst1 = janfirst;
yearbeg--;
- if (increment_overflow_time(&janfirst, -yearsecs)) {
+ if (increment_overflow_time(&janfirst1, -yearsecs)) {
janoffset = -yearsecs;
break;
}
+ janfirst = janfirst1;
} while (atlo < janfirst
&& EPOCH_YEAR - YEARSPERREPEAT / 2 < yearbeg);
@@ -1313,7 +1259,7 @@ tzparse(const char *name, struct state *sp, struct state const *basep)
/*
** Transitions from DST to DDST
** will effectively disappear since
- ** POSIX.1-2017 provides for only one
+ ** proleptic TZ strings have only one
** DST offset.
*/
if (isdst && !sp->ttis[j].tt_ttisstd) {
@@ -1342,7 +1288,6 @@ tzparse(const char *name, struct state *sp, struct state const *basep)
sp->timecnt = 0;
init_ttinfo(&sp->ttis[0], -stdoffset, false, 0);
}
- sp->defaulttype = 0;
sp->charcnt = charcnt;
cp = sp->chars;
memcpy(cp, stdname, stdlen);
@@ -1378,7 +1323,6 @@ zoneinit(struct state *sp, char const *name)
sp->goback = sp->goahead = false;
init_ttinfo(&sp->ttis[0], 0, false, 0);
strcpy(sp->chars, utc);
- sp->defaulttype = 0;
return 0;
} else {
int err = tzload(name, sp, true);
@@ -1465,8 +1409,8 @@ tzfree(timezone_t sp)
}
/*
-** NetBSD 6.1.4 has ctime_rz, but omit it because POSIX says ctime and
-** ctime_r are obsolescent and have potential security problems that
+** NetBSD 6.1.4 has ctime_rz, but omit it because C23 deprecates ctime and
+** POSIX.1-2024 removes ctime_r. Both have potential security problems that
** ctime_rz would share. Callers can instead use localtime_rz + strftime.
**
** NetBSD 6.1.4 has tzgetname, but omit it because it doesn't work
@@ -1484,8 +1428,7 @@ tzfree(timezone_t sp)
**
** If successful and SETNAME is nonzero,
** set the applicable parts of tzname, timezone and altzone;
-** however, it's OK to omit this step
-** if the timezone is compatible with POSIX.1-2017
+** however, it's OK to omit this step for proleptic TZ strings
** since in that case tzset should have already done this step correctly.
** SETNAME's type is int_fast32_t for compatibility with gmtsub,
** but it is actually a boolean and its value should be 0 or 1.
@@ -1553,7 +1496,7 @@ localsub(struct state const *sp, time_t const *timep, int_fast32_t setname,
return result;
}
if (sp->timecnt == 0 || t < sp->ats[0]) {
- i = sp->defaulttype;
+ i = 0;
} else {
register int lo = 1;
register int hi = sp->timecnt;
@@ -2285,7 +2228,7 @@ mktime(struct tm *tmp)
}
#if STD_INSPIRED
-/* This function is obsolescent and may disapper in future releases.
+/* This function is obsolescent and may disappear in future releases.
Callers can instead use mktime. */
time_t
timelocal(struct tm *tmp)
@@ -2303,7 +2246,7 @@ timelocal(struct tm *tmp)
# define EXTERN_TIMEOFF static
#endif
-/* This function is obsolescent and may disapper in future releases.
+/* This function is obsolescent and may disappear in future releases.
Callers can instead use mktime_z with a fixed-offset zone. */
EXTERN_TIMEOFF time_t
timeoff(struct tm *tmp, long offset)
diff --git a/tz/newctime.3 b/tz/newctime.3
index 3b54d4a..d19fd25 100644
--- a/tz/newctime.3
+++ b/tz/newctime.3
@@ -9,16 +9,16 @@ asctime, ctime, difftime, gmtime, localtime, mktime \- convert date and time
.el .ds - \-
.B #include
.PP
-.BR "extern char *tzname[];" " /\(** (optional) \(**/"
-.PP
.B [[deprecated]] char *ctime(time_t const *clock);
.PP
+/* Only in POSIX.1-2017 and earlier. */
.B char *ctime_r(time_t const *clock, char *buf);
.PP
.B double difftime(time_t time1, time_t time0);
.PP
.B [[deprecated]] char *asctime(struct tm const *tm);
.PP
+/* Only in POSIX.1-2017 and earlier. */
.B "char *asctime_r(struct tm const *restrict tm,"
.B " char *restrict result);"
.PP
@@ -112,17 +112,6 @@ The
function
corrects for the time zone and any time zone adjustments
(such as Daylight Saving Time in the United States).
-After filling in the
-.q "tm"
-structure,
-.B localtime
-sets the
-.BR tm_isdst 'th
-element of
-.B tzname
-to a pointer to a string that's the time zone abbreviation to be used with
-.BR localtime 's
-return value.
.PP
The
.B gmtime
@@ -191,9 +180,19 @@ are determined.
The
.B mktime
function
-returns the specified calendar time;
+returns the specified calendar time.
If the calendar time cannot be represented,
-it returns \-1.
+it returns \-1 without updating the structure.
+To distinguish failure from a valid \-1 return,
+you can set
+.B tm_wday
+or
+.B tm_yday
+to a negative value before calling
+.BR mktime ;
+if that value is still negative when
+.B mktime
+returns, the calendar time could not be represented.
.PP
The
.B difftime
@@ -213,6 +212,13 @@ and
functions
are like their unsuffixed counterparts, except that they accept an
additional argument specifying where to store the result if successful.
+The
+.B ctime_r
+and
+.B asctime_r
+functions are present only on systems supporting POSIX.1-2017 and earlier,
+as they are removed in POSIX.1-2024 and user code can define these
+functions with other meanings.
.PP
The
.B localtime_rz
@@ -275,21 +281,43 @@ from UT, with positive values indicating east
of the Prime Meridian.
The field's name is derived from Greenwich Mean Time, a precursor of UT.
.PP
-In
+In platforms conforming to POSIX.1-2024 the
.B "struct tm"
the
.B tm_zone
and
.B tm_gmtoff
-fields exist, and are filled in, only if arrangements to do
-so were made when the library containing these functions was
-created.
-Similarly, the
-.B tzname
-variable is optional; also, there is no guarantee that
-.B tzname
-will
-continue to exist in this form in future releases of this code.
+fields exist, and are filled in.
+For
+.B localtime_rz
+and
+.B mktime_rz
+the storage lifetime of the strings addressed by
+.B tm_zone
+extends until the corresponding
+.B timezone_t
+object is freed via
+.BR tzfree .
+For the other functions the lifetime extends until the
+.I TZ
+environment variable changes state and
+.B tzset
+is then called.
+.PP
+As a side effect, the
+.BR ctime ,
+.B localtime
+and
+.B mktime
+functions also behave as if
+.B tzset
+were called.
+The
+.B ctime_r
+and
+.B localtime_r
+functions might (or might not) also behave this way.
+This is for compatibility with older platforms, as required by POSIX.
.SH FILES
.ta \w'/usr/share/zoneinfo/posixrules\0\0'u
/etc/localtime local timezone file
@@ -303,11 +331,11 @@ continue to exist in this form in future releases of this code.
If /usr/share/zoneinfo/GMT is absent,
UTC leap seconds are loaded from /usr/share/zoneinfo/GMT0 if present.
.SH SEE ALSO
-getenv(3),
-newstrftime(3),
-newtzset(3),
-time(2),
-tzfile(5)
+.BR getenv (3),
+.BR newstrftime (3),
+.BR newtzset (3),
+.BR time (2),
+.BR tzfile (5).
.SH NOTES
The return values of
.BR asctime ,
@@ -317,20 +345,6 @@ and
.B localtime
point to static data
overwritten by each call.
-The
-.B tzname
-variable (once set) and the
-.B tm_zone
-field of a returned
-.B "struct tm"
-both point to an array of characters that
-can be freed or overwritten by later calls to the functions
-.BR localtime ,
-.BR tzfree ,
-and
-.BR tzset ,
-if these functions affect the timezone information that specifies the
-abbreviation in question.
The remaining functions and data are thread-safe.
.PP
The
diff --git a/tz/newstrftime.3 b/tz/newstrftime.3
index 704318e..a9997a0 100644
--- a/tz/newstrftime.3
+++ b/tz/newstrftime.3
@@ -91,11 +91,11 @@ as specified by brackets in the description.
If a bracketed member name is followed by
.q + ,
.B strftime
-can use the named member even though POSIX.1-2017 does not list it;
+can use the named member even though POSIX.1-2024 does not list it;
if the name is followed by
.q \*- ,
.B strftime
-ignores the member even though POSIX.1-2017 lists it
+ignores the member even though POSIX.1-2024 lists it
which means portable code should set it.
For portability,
.BI * timeptr
@@ -137,8 +137,8 @@ is replaced by the locale's appropriate date and time representation.
.IR tm_hour ,
.IR tm_min ,
.IR tm_sec ,
-.IR tm_gmtoff +,
-.IR tm_zone +,
+.IR tm_gmtoff ,
+.IR tm_zone ,
.IR tm_isdst \*-].
.TP
%D
@@ -326,8 +326,8 @@ is replaced by the locale's appropriate time representation.
.IR tm_hour ,
.IR tm_min ,
.IR tm_sec ,
-.IR tm_gmtoff +,
-.IR tm_zone +,
+.IR tm_gmtoff ,
+.IR tm_zone ,
.IR tm_isdst \*-].
.TP
%x
@@ -355,7 +355,7 @@ is replaced by the year without century as a decimal number [00,99].
%Z
is replaced by the time zone abbreviation,
or by the empty string if this is not determinable.
-.RI [ tm_zone +,
+.RI [ tm_zone ,
.IR tm_isdst \*-]
.TP
%z
@@ -369,7 +369,7 @@ but local time is indeterminate; by convention this is used for
locations while uninhabited, and corresponds to a zero offset when the
time zone abbreviation begins with
.q "\*-" .
-.RI [ tm_gmtoff +,
+.RI [ tm_gmtoff ,
.IR tm_zone +,
.IR tm_isdst \*-]
.TP
@@ -398,7 +398,7 @@ also behaves as if
were called.
This is for compatibility with older platforms, as required by POSIX;
it is not needed for
-.BR tzset 's
+.BR strftime 's
own use.
.SH "RETURN VALUE"
If the conversion is successful,
@@ -428,11 +428,11 @@ conversion and the number of seconds since the Epoch cannot be represented
in a
.c time_t .
.SH SEE ALSO
-date(1),
-getenv(3),
-newctime(3),
-newtzset(3),
-time(2),
-tzfile(5)
+.BR date (1),
+.BR getenv (3),
+.BR newctime (3),
+.BR newtzset (3),
+.BR time (2),
+.BR tzfile (5).
.SH BUGS
There is no conversion specification for the phase of the moon.
diff --git a/tz/newtzset.3 b/tz/newtzset.3
index b1384f3..661fb25 100644
--- a/tz/newtzset.3
+++ b/tz/newtzset.3
@@ -15,6 +15,14 @@ tzset \- initialize time conversion information
.PP
.B void tzset(void);
.PP
+/\(** Optional and obsolescent: \(**/
+.br
+.B extern char *tzname[];
+.br
+.B extern long timezone;
+.br
+.B extern int daylight;
+.PP
.B cc ... \*-ltz
.fi
.SH DESCRIPTION
@@ -165,7 +173,7 @@ describes when the change back happens. Each
.I time
field describes when, in current local time, the change to the other
time is made.
-As an extension to POSIX.1-2017, daylight saving is assumed to be in effect
+Daylight saving is assumed to be in effect
all year if it begins January 1 at 00:00 and ends December 31 at
24:00 plus the difference between daylight saving and standard time,
leaving no room for standard time in the calendar.
@@ -212,11 +220,7 @@ The
.I time
has the same format as
.I offset
-except that POSIX.1-2017 does not allow a leading sign (\c
-.q "\*-"
-or
-.q "+" ).
-As an extension to POSIX.1-2017, the hours part of
+except that the hours part of
.I time
can range from \-167 through 167; this allows for unusual rules such
as
@@ -229,8 +233,7 @@ is not given, is
.LP
Here are some examples of
.I TZ
-values that directly specify the timezone; they use some of the
-extensions to POSIX.1-2017.
+values that directly specify the timezone.
.TP
.B EST5
stands for US Eastern Standard
@@ -346,6 +349,22 @@ if the implied call to
fails,
.B tzset
falls back on UT.
+.PP
+As a side effect, the
+.B tzset
+function sets some external variables if the platform defines them.
+It sets
+.BR tzname [0]
+and
+.BR tzname [1]
+to pointers to strings that are time zone abbreviations to be used with
+standard and daylight saving time, respectively.
+It also sets
+.B timezone
+to be the number of seconds that standard time is west of the Prime Meridian,
+and
+.B daylight
+to be zero if daylight saving time is never in effect, non-zero otherwise.
.SH "RETURN VALUE"
If successful, the
.B tzalloc
@@ -384,8 +403,29 @@ and
If /usr/share/zoneinfo/GMT is absent,
UTC leap seconds are loaded from /usr/share/zoneinfo/GMT0 if present.
.SH SEE ALSO
-getenv(3),
-newctime(3),
-newstrftime(3),
-time(2),
-tzfile(5)
+.BR getenv (3),
+.BR newctime (3),
+.BR newstrftime (3),
+.BR time (2),
+.BR tzfile (5).
+.SH NOTES
+Portable code should not rely on the contents of the external variables
+.BR tzname ,
+.B timezone
+and
+.B daylight
+as their contents are unspecified (and do not make sense in general)
+when a geographical TZ is used.
+In multithreaded applications behavior is undefined if one thread accesses
+one of these variables while another thread invokes
+.BR tzset .
+A future version of POSIX is planned to remove these variables;
+callers can instead use the
+.I tm_gmtoff
+and
+.I tm_zone
+members of
+.B struct tm,
+or use
+.B strftime
+with "%z" or "%Z".
diff --git a/tz/northamerica b/tz/northamerica
index bbfce49..01f392e 100644
--- a/tz/northamerica
+++ b/tz/northamerica
@@ -185,26 +185,6 @@ Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
Rule US 2007 max - Nov Sun>=1 2:00 0 S
-# From Arthur David Olson, 2005-12-19
-# We generate the files specified below to guard against old files with
-# obsolete information being left in the time zone binary directory.
-# We limit the list to names that have appeared in previous versions of
-# this time zone package.
-# We do these as separate Zones rather than as Links to avoid problems if
-# a particular place changes whether it observes DST.
-# We put these specifications here in the northamerica file both to
-# increase the chances that they'll actually get compiled and to
-# avoid the need to duplicate the US rules in another file.
-
-# Zone NAME STDOFF RULES FORMAT [UNTIL]
-Zone EST -5:00 - EST
-Zone MST -7:00 - MST
-Zone HST -10:00 - HST
-Zone EST5EDT -5:00 US E%sT
-Zone CST6CDT -6:00 US C%sT
-Zone MST7MDT -7:00 US M%sT
-Zone PST8PDT -8:00 US P%sT
-
# From U. S. Naval Observatory (1989-01-19):
# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
@@ -2373,6 +2353,81 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# the researchers who prepared the Decrees page failed to find some of
# the relevant documents.
+# From Heitor David Pinto (2024-08-04):
+# In 1931, the decree implementing DST specified that it would take
+# effect on 30 April....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192270&pagina=2&seccion=1
+#
+# In 1981, the decree changing Campeche, Yucatán and Quintana Roo to UTC-5
+# specified that it would enter into force on 26 December 1981 at 2:00....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4705667&fecha=23/12/1981&cod_diario=202796
+#
+# In 1982, the decree returning Campeche and Yucatán to UTC-6 specified that
+# it would enter into force on 2 November 1982 at 2:00....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=205689&pagina=3&seccion=0
+#
+# Quintana Roo changed to UTC-6 on 4 January 1983 at 0:00, and again
+# to UTC-5 on 26 October 1997 at 2:00....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4787355&fecha=28/12/1982&cod_diario=206112
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=209559&pagina=15&seccion=0
+#
+# Durango, Coahuila, Nuevo León and Tamaulipas were set to UTC-7 on 1 January
+# 1922, and changed to UTC-6 on 10 June 1927. Then Durango, Coahuila and
+# Nuevo León (but not Tamaulipas) returned to UTC-7 on 15 November 1930,
+# observed DST in 1931, and changed again to UTC-6 on 1 April 1932....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4441846&fecha=29/12/1921&cod_diario=187468
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4491963&fecha=15/11/1930&cod_diario=190835
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4418437&fecha=21/01/1932&cod_diario=185588
+#
+# ... the ... 10 June 1927 ... decree only said 10 June 1927, without
+# specifying a time, so I suppose that it should be considered at 0:00.
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
+#
+# In 1942, the decree changing Baja California, Baja California Sur, Sonora,
+# Sinaloa and Nayarit to UTC-7 was published on 24 April, but it said that it
+# would apply from 1 April, so it's unclear when the change actually
+# occurred. The database currently shows 24 April 1942.
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192203&pagina=2&seccion=1
+#
+# Baja California Sur, Sonora, Sinaloa and Nayarit never used UTC-8. The ...
+# 14 January 1949 ... change [to UTC-8] only occurred in Baja California.
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
+#
+# In 1945, the decree changing Baja California to UTC-8 specified that it
+# would take effect on the third day from its publication.
+# It was published on 12 November, so it would take effect on 15 November....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4555049&fecha=12/11/1945&cod_diario=194763
+#
+# In 1948, the decree changing Baja California to UTC-7 specified that it
+# would take effect on "this date". The decree was made on 13 March,
+# but published on 5 April, so it's unclear when the change actually occurred.
+# The database currently shows 5 April 1948.
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=188624&pagina=2&seccion=0
+#
+# In 1949, the decree changing Baja California to UTC-8 was published on 13
+# January, but it said that it would apply from 1 January, so it's unclear when
+# the change actually occurred. The database currently shows 14 January 1949.
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
+#
+# Baja California also observed UTC-7 from 1 May to 24 September 1950,
+# from 29 April to 30 September 1951 at 2:00,
+# and from 27 April to 28 September 1952 at 2:00....
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4600403&fecha=29/04/1950&cod_diario=197505
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4623553&fecha=23/09/1950&cod_diario=198805
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4469444&fecha=27/04/1951&cod_diario=189317
+# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4533868&fecha=10/03/1952&cod_diario=193465
+#
+# All changes in Baja California from 1948 to 1952 match those in California,
+# on the same dates or with a difference of one day.
+# So it may be easier to implement these changes as DST with rule CA
+# during this whole period.
+#
+# From Paul Eggert (2024-08-18):
+# For now, maintain the slightly-different history for Baja California,
+# as we have no information on whether 1948/1952 clocks in Tijuana followed
+# the decrees or followed San Diego.
+
# From Alan Perry (1996-02-15):
# A guy from our Mexico subsidiary finally found the Presidential Decree
# outlining the timezone changes in Mexico.
@@ -2576,7 +2631,7 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# http://puentelibre.mx/noticia/ciudad_juarez_cambio_horario_noviembre_2022/
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
-Rule Mexico 1931 only - May 1 23:00 1:00 D
+Rule Mexico 1931 only - April 30 0:00 1:00 D
Rule Mexico 1931 only - Oct 1 0:00 0 S
Rule Mexico 1939 only - Feb 5 0:00 1:00 D
Rule Mexico 1939 only - Jun 25 0:00 0 S
@@ -2595,14 +2650,16 @@ Rule Mexico 2002 2022 - Oct lastSun 2:00 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
# Quintana Roo; represented by Cancún
Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 6:00u
- -6:00 - CST 1981 Dec 23
+ -6:00 - CST 1981 Dec 26 2:00
+ -5:00 - EST 1983 Jan 4 0:00
+ -6:00 Mexico C%sT 1997 Oct 26 2:00
-5:00 Mexico E%sT 1998 Aug 2 2:00
-6:00 Mexico C%sT 2015 Feb 1 2:00
-5:00 - EST
# Campeche, Yucatán; represented by Mérida
Zone America/Merida -5:58:28 - LMT 1922 Jan 1 6:00u
- -6:00 - CST 1981 Dec 23
- -5:00 - EST 1982 Dec 2
+ -6:00 - CST 1981 Dec 26 2:00
+ -5:00 - EST 1982 Nov 2 2:00
-6:00 Mexico C%sT
# Coahuila, Nuevo León, Tamaulipas (near US border)
# This includes the following municipios:
@@ -2619,12 +2676,15 @@ Zone America/Matamoros -6:30:00 - LMT 1922 Jan 1 6:00u
-6:00 US C%sT
# Durango; Coahuila, Nuevo León, Tamaulipas (away from US border)
Zone America/Monterrey -6:41:16 - LMT 1922 Jan 1 6:00u
+ -7:00 - MST 1927 Jun 10
+ -6:00 - CST 1930 Nov 15
+ -7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1988
-6:00 US C%sT 1989
-6:00 Mexico C%sT
# Central Mexico
Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 Mexico C%sT 2001 Sep 30 2:00
@@ -2635,7 +2695,7 @@ Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
# Práxedis G Guerrero.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@@ -2650,7 +2710,7 @@ Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
# Benavides.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@@ -2662,7 +2722,7 @@ Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
-6:00 US C%sT
# Chihuahua (away from US border)
Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@@ -2672,23 +2732,21 @@ Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
-6:00 - CST
# Sonora
Zone America/Hermosillo -7:23:52 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
- -7:00 - MST 1949 Jan 14
- -8:00 - PST 1970
+ -7:00 - MST 1996
-7:00 Mexico M%sT 1999
-7:00 - MST
# Baja California Sur, Nayarit (except Bahía de Banderas), Sinaloa
Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
- -7:00 - MST 1949 Jan 14
- -8:00 - PST 1970
+ -7:00 - MST 1970
-7:00 Mexico M%sT
# Bahía de Banderas
@@ -2721,27 +2779,32 @@ Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
# Use "Bahia_Banderas" to keep the name to fourteen characters.
Zone America/Bahia_Banderas -7:01:00 - LMT 1922 Jan 1 7:00u
- -7:00 - MST 1927 Jun 10 23:00
+ -7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
- -7:00 - MST 1949 Jan 14
- -8:00 - PST 1970
+ -7:00 - MST 1970
-7:00 Mexico M%sT 2010 Apr 4 2:00
-6:00 Mexico C%sT
# Baja California
Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1924
- -8:00 - PST 1927 Jun 10 23:00
+ -8:00 - PST 1927 Jun 10
-7:00 - MST 1930 Nov 15
-8:00 - PST 1931 Apr 1
-8:00 1:00 PDT 1931 Sep 30
-8:00 - PST 1942 Apr 24
-8:00 1:00 PWT 1945 Aug 14 23:00u
- -8:00 1:00 PPT 1945 Nov 12 # Peace
+ -8:00 1:00 PPT 1945 Nov 15 # Peace
-8:00 - PST 1948 Apr 5
-8:00 1:00 PDT 1949 Jan 14
+ -8:00 - PST 1950 May 1
+ -8:00 1:00 PDT 1950 Sep 24
+ -8:00 - PST 1951 Apr 29 2:00
+ -8:00 1:00 PDT 1951 Sep 30 2:00
+ -8:00 - PST 1952 Apr 27 2:00
+ -8:00 1:00 PDT 1952 Sep 28 2:00
-8:00 - PST 1954
-8:00 CA P%sT 1961
-8:00 - PST 1976
@@ -3550,8 +3613,8 @@ Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre
-4:00 - AST 1980 May
- -3:00 - -03 1987
- -3:00 Canada -03/-02
+ -3:00 - %z 1987
+ -3:00 Canada %z
# Turks and Caicos
#
diff --git a/tz/private.h b/tz/private.h
index 0dac6af..c330410 100644
--- a/tz/private.h
+++ b/tz/private.h
@@ -19,19 +19,22 @@
/* PORT_TO_C89 means the code should work even if the underlying
compiler and library support only C89 plus C99's 'long long'
- and perhaps a few other extensions to C89. SUPPORT_C89 means the
- tzcode library should support C89 callers in addition to the usual
- support for C99-and-later callers; however, C89 support can trigger
- latent bugs in C99-and-later callers. These macros are obsolescent,
- and the plan is to remove them along with any code needed only when
- they are nonzero. A good time to do that might be in the year 2029
+ and perhaps a few other extensions to C89.
+
+ This macro is obsolescent, and the plan is to remove it along with
+ associated code. A good time to do that might be in the year 2029
because RHEL 7 (whose GCC defaults to C89) extended life cycle
support (ELS) is scheduled to end on 2028-06-30. */
#ifndef PORT_TO_C89
# define PORT_TO_C89 0
#endif
+
+/* SUPPORT_C89 means the tzcode library should support C89 callers
+ in addition to the usual support for C99-and-later callers.
+ This defaults to 1 as POSIX requires, even though that can trigger
+ latent bugs in callers. */
#ifndef SUPPORT_C89
-# define SUPPORT_C89 0
+# define SUPPORT_C89 1
#endif
#ifndef __STDC_VERSION__
@@ -69,10 +72,6 @@
** You can override these in your C compiler options, e.g. '-DHAVE_GETTEXT=1'.
*/
-#ifndef HAVE_DECL_ASCTIME_R
-# define HAVE_DECL_ASCTIME_R 1
-#endif
-
#if !defined HAVE__GENERIC && defined __has_extension
# if !__has_extension(c_generic_selections)
# define HAVE__GENERIC 0
@@ -236,6 +235,31 @@
# include /* for R_OK, and other POSIX goodness */
#endif /* HAVE_UNISTD_H */
+/* SUPPORT_POSIX2008 means the tzcode library should support
+ POSIX.1-2017-and-earlier callers in addition to the usual support for
+ POSIX.1-2024-and-later callers; however, this can be
+ incompatible with POSIX.1-2024-and-later callers.
+ This macro is obsolescent, and the plan is to remove it
+ along with any code needed only when it is nonzero.
+ A good time to do that might be in the year 2034.
+ This macro's name is SUPPORT_POSIX2008 because _POSIX_VERSION == 200809
+ in POSIX.1-2017, a minor revision of POSIX.1-2008. */
+#ifndef SUPPORT_POSIX2008
+# if defined _POSIX_VERSION && _POSIX_VERSION <= 200809
+# define SUPPORT_POSIX2008 1
+# else
+# define SUPPORT_POSIX2008 0
+# endif
+#endif
+
+#ifndef HAVE_DECL_ASCTIME_R
+# if SUPPORT_POSIX2008
+# define HAVE_DECL_ASCTIME_R 1
+# else
+# define HAVE_DECL_ASCTIME_R 0
+# endif
+#endif
+
#ifndef HAVE_STRFTIME_L
# if _POSIX_VERSION < 200809
# define HAVE_STRFTIME_L 0
@@ -460,14 +484,6 @@ typedef unsigned long uintmax_t;
# define ckd_mul(r, a, b) __builtin_mul_overflow(a, b, r)
#endif
-#if 3 <= __GNUC__
-# define ATTRIBUTE_MALLOC __attribute__((malloc))
-# define ATTRIBUTE_FORMAT(spec) __attribute__((format spec))
-#else
-# define ATTRIBUTE_MALLOC /* empty */
-# define ATTRIBUTE_FORMAT(spec) /* empty */
-#endif
-
#if (defined __has_c_attribute \
&& (202311 <= __STDC_VERSION__ || !defined __STRICT_ANSI__))
# define HAVE___HAS_C_ATTRIBUTE true
@@ -535,24 +551,27 @@ typedef unsigned long uintmax_t;
# endif
#endif
#ifndef ATTRIBUTE_REPRODUCIBLE
-# if 3 <= __GNUC__
-# define ATTRIBUTE_REPRODUCIBLE __attribute__((pure))
-# else
-# define ATTRIBUTE_REPRODUCIBLE /* empty */
-# endif
+# define ATTRIBUTE_REPRODUCIBLE /* empty */
#endif
-#if HAVE___HAS_C_ATTRIBUTE
-# if __has_c_attribute(unsequenced)
-# define ATTRIBUTE_UNSEQUENCED [[unsequenced]]
-# endif
+/* GCC attributes that are useful in tzcode.
+ __attribute__((pure)) is stricter than [[reproducible]],
+ so the latter is an adequate substitute in non-GCC C23 platforms. */
+#if __GNUC__ < 3
+# define ATTRIBUTE_FORMAT(spec) /* empty */
+# define ATTRIBUTE_PURE ATTRIBUTE_REPRODUCIBLE
+#else
+# define ATTRIBUTE_FORMAT(spec) __attribute__((format spec))
+# define ATTRIBUTE_PURE __attribute__((pure))
#endif
-#ifndef ATTRIBUTE_UNSEQUENCED
-# if 3 <= __GNUC__
-# define ATTRIBUTE_UNSEQUENCED __attribute__((const))
-# else
-# define ATTRIBUTE_UNSEQUENCED /* empty */
-# endif
+
+/* Avoid GCC bug 114833 .
+ Remove this macro and its uses when the bug is fixed in a GCC release,
+ because only the latest GCC matters for $(GCC_DEBUG_FLAGS). */
+#ifdef GCC_LINT
+# define ATTRIBUTE_PURE_114833 ATTRIBUTE_PURE
+#else
+# define ATTRIBUTE_PURE_114833 /* empty */
#endif
#if (__STDC_VERSION__ < 199901 && !defined restrict \
@@ -604,12 +623,8 @@ typedef time_tz tz_time_t;
# undef asctime
# define asctime tz_asctime
-# undef asctime_r
-# define asctime_r tz_asctime_r
# undef ctime
# define ctime tz_ctime
-# undef ctime_r
-# define ctime_r tz_ctime_r
# undef difftime
# define difftime tz_difftime
# undef gmtime
@@ -654,6 +669,12 @@ typedef time_tz tz_time_t;
# define tzfree tz_tzfree
# undef tzset
# define tzset tz_tzset
+# if SUPPORT_POSIX2008
+# undef asctime_r
+# define asctime_r tz_asctime_r
+# undef ctime_r
+# define ctime_r tz_ctime_r
+# endif
# if HAVE_STRFTIME_L
# undef strftime_l
# define strftime_l tz_strftime_l
@@ -679,10 +700,12 @@ typedef time_tz tz_time_t;
# define DEPRECATED_IN_C23 ATTRIBUTE_DEPRECATED
# endif
DEPRECATED_IN_C23 char *asctime(struct tm const *);
-char *asctime_r(struct tm const *restrict, char *restrict);
DEPRECATED_IN_C23 char *ctime(time_t const *);
+#if SUPPORT_POSIX2008
+char *asctime_r(struct tm const *restrict, char *restrict);
char *ctime_r(time_t const *, char *);
-ATTRIBUTE_UNSEQUENCED double difftime(time_t, time_t);
+#endif
+double difftime(time_t, time_t);
size_t strftime(char *restrict, size_t, char const *restrict,
struct tm const *restrict);
# if HAVE_STRFTIME_L
@@ -713,7 +736,7 @@ void tzset(void);
time_t timegm(struct tm *);
#endif
-#if !HAVE_DECL_ASCTIME_R && !defined asctime_r
+#if !HAVE_DECL_ASCTIME_R && !defined asctime_r && SUPPORT_POSIX2008
extern char *asctime_r(struct tm const *restrict, char *restrict);
#endif
@@ -798,10 +821,10 @@ timezone_t tzalloc(char const *);
void tzfree(timezone_t);
# if STD_INSPIRED
# if TZ_TIME_T || !defined posix2time_z
-ATTRIBUTE_REPRODUCIBLE time_t posix2time_z(timezone_t, time_t);
+ATTRIBUTE_PURE time_t posix2time_z(timezone_t, time_t);
# endif
# if TZ_TIME_T || !defined time2posix_z
-ATTRIBUTE_REPRODUCIBLE time_t time2posix_z(timezone_t, time_t);
+ATTRIBUTE_PURE time_t time2posix_z(timezone_t, time_t);
# endif
# endif
#endif
@@ -973,8 +996,9 @@ enum {
/* How many years to generate (in zic.c) or search through (in localtime.c).
This is two years larger than the obvious 400, to avoid edge cases.
- E.g., suppose a non-POSIX.1-2017 rule applies from 2012 on with transitions
- in March and September, plus one-off transitions in November 2013.
+ E.g., suppose a rule applies from 2012 on with transitions
+ in March and September, plus one-off transitions in November 2013,
+ and suppose the rule cannot be expressed as a proleptic TZ string.
If zic looked only at the last 400 years, it would set max_year=2413,
with the intent that the 400 years 2014 through 2413 will be repeated.
The last transition listed in the tzfile would be in 2413-09,
diff --git a/tz/southamerica b/tz/southamerica
index 344e67f..c8d9097 100644
--- a/tz/southamerica
+++ b/tz/southamerica
@@ -402,11 +402,11 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May # Córdoba Mean Time
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 Arg -03/-02
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 Arg %z
#
# Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN),
# Chaco (CC), Formosa (FM), Santiago del Estero (SE)
@@ -421,120 +421,120 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 3
- -4:00 - -04 1991 Oct 20
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 Arg -03/-02
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 3
+ -4:00 - %z 1991 Oct 20
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 Arg %z
#
# Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN)
Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 3
- -4:00 - -04 1991 Oct 20
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 3
+ -4:00 - %z 1991 Oct 20
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# Tucumán (TM)
Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 3
- -4:00 - -04 1991 Oct 20
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 Jun 1
- -4:00 - -04 2004 Jun 13
- -3:00 Arg -03/-02
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 3
+ -4:00 - %z 1991 Oct 20
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 Jun 1
+ -4:00 - %z 2004 Jun 13
+ -3:00 Arg %z
#
# La Rioja (LR)
Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 1
- -4:00 - -04 1991 May 7
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 Jun 1
- -4:00 - -04 2004 Jun 20
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 1
+ -4:00 - %z 1991 May 7
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 Jun 1
+ -4:00 - %z 2004 Jun 20
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# San Juan (SJ)
Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 1
- -4:00 - -04 1991 May 7
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 May 31
- -4:00 - -04 2004 Jul 25
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 1
+ -4:00 - %z 1991 May 7
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 May 31
+ -4:00 - %z 2004 Jul 25
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# Jujuy (JY)
Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1990 Mar 4
- -4:00 - -04 1990 Oct 28
- -4:00 1:00 -03 1991 Mar 17
- -4:00 - -04 1991 Oct 6
- -3:00 1:00 -02 1992
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1990 Mar 4
+ -4:00 - %z 1990 Oct 28
+ -4:00 1:00 %z 1991 Mar 17
+ -4:00 - %z 1991 Oct 6
+ -3:00 1:00 %z 1992
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# Catamarca (CT), Chubut (CH)
Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1991 Mar 3
- -4:00 - -04 1991 Oct 20
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 Jun 1
- -4:00 - -04 2004 Jun 20
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1991 Mar 3
+ -4:00 - %z 1991 Oct 20
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 Jun 1
+ -4:00 - %z 2004 Jun 20
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# Mendoza (MZ)
Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1990 Mar 4
- -4:00 - -04 1990 Oct 15
- -4:00 1:00 -03 1991 Mar 1
- -4:00 - -04 1991 Oct 15
- -4:00 1:00 -03 1992 Mar 1
- -4:00 - -04 1992 Oct 18
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 May 23
- -4:00 - -04 2004 Sep 26
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1990 Mar 4
+ -4:00 - %z 1990 Oct 15
+ -4:00 1:00 %z 1991 Mar 1
+ -4:00 - %z 1991 Oct 15
+ -4:00 1:00 %z 1992 Mar 1
+ -4:00 - %z 1992 Oct 18
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 May 23
+ -4:00 - %z 2004 Sep 26
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# San Luis (SL)
@@ -544,53 +544,53 @@ Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1990
- -3:00 1:00 -02 1990 Mar 14
- -4:00 - -04 1990 Oct 15
- -4:00 1:00 -03 1991 Mar 1
- -4:00 - -04 1991 Jun 1
- -3:00 - -03 1999 Oct 3
- -4:00 1:00 -03 2000 Mar 3
- -3:00 - -03 2004 May 31
- -4:00 - -04 2004 Jul 25
- -3:00 Arg -03/-02 2008 Jan 21
- -4:00 SanLuis -04/-03 2009 Oct 11
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1990
+ -3:00 1:00 %z 1990 Mar 14
+ -4:00 - %z 1990 Oct 15
+ -4:00 1:00 %z 1991 Mar 1
+ -4:00 - %z 1991 Jun 1
+ -3:00 - %z 1999 Oct 3
+ -4:00 1:00 %z 2000 Mar 3
+ -3:00 - %z 2004 May 31
+ -4:00 - %z 2004 Jul 25
+ -3:00 Arg %z 2008 Jan 21
+ -4:00 SanLuis %z 2009 Oct 11
+ -3:00 - %z
#
# Santa Cruz (SC)
Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 Jun 1
- -4:00 - -04 2004 Jun 20
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 Jun 1
+ -4:00 - %z 2004 Jun 20
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
#
# Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF)
Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
- -4:00 - -04 1930 Dec
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1999 Oct 3
- -4:00 Arg -04/-03 2000 Mar 3
- -3:00 - -03 2004 May 30
- -4:00 - -04 2004 Jun 20
- -3:00 Arg -03/-02 2008 Oct 18
- -3:00 - -03
+ -4:00 - %z 1930 Dec
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1999 Oct 3
+ -4:00 Arg %z 2000 Mar 3
+ -3:00 - %z 2004 May 30
+ -4:00 - %z 2004 Jun 20
+ -3:00 Arg %z 2008 Oct 18
+ -3:00 - %z
# Bolivia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/La_Paz -4:32:36 - LMT 1890
-4:32:36 - CMT 1931 Oct 15 # Calamarca MT
-4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST
- -4:00 - -04
+ -4:00 - %z
# Brazil
@@ -961,12 +961,12 @@ Rule Brazil 2018 only - Nov Sun>=1 0:00 1:00 -
#
# Fernando de Noronha (administratively part of PE)
Zone America/Noronha -2:09:40 - LMT 1914
- -2:00 Brazil -02/-01 1990 Sep 17
- -2:00 - -02 1999 Sep 30
- -2:00 Brazil -02/-01 2000 Oct 15
- -2:00 - -02 2001 Sep 13
- -2:00 Brazil -02/-01 2002 Oct 1
- -2:00 - -02
+ -2:00 Brazil %z 1990 Sep 17
+ -2:00 - %z 1999 Sep 30
+ -2:00 Brazil %z 2000 Oct 15
+ -2:00 - %z 2001 Sep 13
+ -2:00 Brazil %z 2002 Oct 1
+ -2:00 - %z
# Other Atlantic islands have no permanent settlement.
# These include Trindade and Martim Vaz (administratively part of ES),
# Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE).
@@ -979,119 +979,119 @@ Zone America/Noronha -2:09:40 - LMT 1914
# In the north a very small part from the river Javary (now Jari I guess,
# the border with Amapá) to the Amazon, then to the Xingu.
Zone America/Belem -3:13:56 - LMT 1914
- -3:00 Brazil -03/-02 1988 Sep 12
- -3:00 - -03
+ -3:00 Brazil %z 1988 Sep 12
+ -3:00 - %z
#
# west Pará (PA)
# West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém.
Zone America/Santarem -3:38:48 - LMT 1914
- -4:00 Brazil -04/-03 1988 Sep 12
- -4:00 - -04 2008 Jun 24 0:00
- -3:00 - -03
+ -4:00 Brazil %z 1988 Sep 12
+ -4:00 - %z 2008 Jun 24 0:00
+ -3:00 - %z
#
# Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN),
# Paraíba (PB)
Zone America/Fortaleza -2:34:00 - LMT 1914
- -3:00 Brazil -03/-02 1990 Sep 17
- -3:00 - -03 1999 Sep 30
- -3:00 Brazil -03/-02 2000 Oct 22
- -3:00 - -03 2001 Sep 13
- -3:00 Brazil -03/-02 2002 Oct 1
- -3:00 - -03
+ -3:00 Brazil %z 1990 Sep 17
+ -3:00 - %z 1999 Sep 30
+ -3:00 Brazil %z 2000 Oct 22
+ -3:00 - %z 2001 Sep 13
+ -3:00 Brazil %z 2002 Oct 1
+ -3:00 - %z
#
# Pernambuco (PE) (except Atlantic islands)
Zone America/Recife -2:19:36 - LMT 1914
- -3:00 Brazil -03/-02 1990 Sep 17
- -3:00 - -03 1999 Sep 30
- -3:00 Brazil -03/-02 2000 Oct 15
- -3:00 - -03 2001 Sep 13
- -3:00 Brazil -03/-02 2002 Oct 1
- -3:00 - -03
+ -3:00 Brazil %z 1990 Sep 17
+ -3:00 - %z 1999 Sep 30
+ -3:00 Brazil %z 2000 Oct 15
+ -3:00 - %z 2001 Sep 13
+ -3:00 Brazil %z 2002 Oct 1
+ -3:00 - %z
#
# Tocantins (TO)
Zone America/Araguaina -3:12:48 - LMT 1914
- -3:00 Brazil -03/-02 1990 Sep 17
- -3:00 - -03 1995 Sep 14
- -3:00 Brazil -03/-02 2003 Sep 24
- -3:00 - -03 2012 Oct 21
- -3:00 Brazil -03/-02 2013 Sep
- -3:00 - -03
+ -3:00 Brazil %z 1990 Sep 17
+ -3:00 - %z 1995 Sep 14
+ -3:00 Brazil %z 2003 Sep 24
+ -3:00 - %z 2012 Oct 21
+ -3:00 Brazil %z 2013 Sep
+ -3:00 - %z
#
# Alagoas (AL), Sergipe (SE)
Zone America/Maceio -2:22:52 - LMT 1914
- -3:00 Brazil -03/-02 1990 Sep 17
- -3:00 - -03 1995 Oct 13
- -3:00 Brazil -03/-02 1996 Sep 4
- -3:00 - -03 1999 Sep 30
- -3:00 Brazil -03/-02 2000 Oct 22
- -3:00 - -03 2001 Sep 13
- -3:00 Brazil -03/-02 2002 Oct 1
- -3:00 - -03
+ -3:00 Brazil %z 1990 Sep 17
+ -3:00 - %z 1995 Oct 13
+ -3:00 Brazil %z 1996 Sep 4
+ -3:00 - %z 1999 Sep 30
+ -3:00 Brazil %z 2000 Oct 22
+ -3:00 - %z 2001 Sep 13
+ -3:00 Brazil %z 2002 Oct 1
+ -3:00 - %z
#
# Bahia (BA)
# There are too many Salvadors elsewhere, so use America/Bahia instead
# of America/Salvador.
Zone America/Bahia -2:34:04 - LMT 1914
- -3:00 Brazil -03/-02 2003 Sep 24
- -3:00 - -03 2011 Oct 16
- -3:00 Brazil -03/-02 2012 Oct 21
- -3:00 - -03
+ -3:00 Brazil %z 2003 Sep 24
+ -3:00 - %z 2011 Oct 16
+ -3:00 Brazil %z 2012 Oct 21
+ -3:00 - %z
#
# Goiás (GO), Distrito Federal (DF), Minas Gerais (MG),
# Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR),
# Santa Catarina (SC), Rio Grande do Sul (RS)
Zone America/Sao_Paulo -3:06:28 - LMT 1914
- -3:00 Brazil -03/-02 1963 Oct 23 0:00
- -3:00 1:00 -02 1964
- -3:00 Brazil -03/-02
+ -3:00 Brazil %z 1963 Oct 23 0:00
+ -3:00 1:00 %z 1964
+ -3:00 Brazil %z
#
# Mato Grosso do Sul (MS)
Zone America/Campo_Grande -3:38:28 - LMT 1914
- -4:00 Brazil -04/-03
+ -4:00 Brazil %z
#
# Mato Grosso (MT)
Zone America/Cuiaba -3:44:20 - LMT 1914
- -4:00 Brazil -04/-03 2003 Sep 24
- -4:00 - -04 2004 Oct 1
- -4:00 Brazil -04/-03
+ -4:00 Brazil %z 2003 Sep 24
+ -4:00 - %z 2004 Oct 1
+ -4:00 Brazil %z
#
# Rondônia (RO)
Zone America/Porto_Velho -4:15:36 - LMT 1914
- -4:00 Brazil -04/-03 1988 Sep 12
- -4:00 - -04
+ -4:00 Brazil %z 1988 Sep 12
+ -4:00 - %z
#
# Roraima (RR)
Zone America/Boa_Vista -4:02:40 - LMT 1914
- -4:00 Brazil -04/-03 1988 Sep 12
- -4:00 - -04 1999 Sep 30
- -4:00 Brazil -04/-03 2000 Oct 15
- -4:00 - -04
+ -4:00 Brazil %z 1988 Sep 12
+ -4:00 - %z 1999 Sep 30
+ -4:00 Brazil %z 2000 Oct 15
+ -4:00 - %z
#
# east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto
# The great circle line from Tabatinga to Porto Acre divides
# east from west Amazonas.
Zone America/Manaus -4:00:04 - LMT 1914
- -4:00 Brazil -04/-03 1988 Sep 12
- -4:00 - -04 1993 Sep 28
- -4:00 Brazil -04/-03 1994 Sep 22
- -4:00 - -04
+ -4:00 Brazil %z 1988 Sep 12
+ -4:00 - %z 1993 Sep 28
+ -4:00 Brazil %z 1994 Sep 22
+ -4:00 - %z
#
# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
# Eirunepé, Envira, Ipixuna
Zone America/Eirunepe -4:39:28 - LMT 1914
- -5:00 Brazil -05/-04 1988 Sep 12
- -5:00 - -05 1993 Sep 28
- -5:00 Brazil -05/-04 1994 Sep 22
- -5:00 - -05 2008 Jun 24 0:00
- -4:00 - -04 2013 Nov 10
- -5:00 - -05
+ -5:00 Brazil %z 1988 Sep 12
+ -5:00 - %z 1993 Sep 28
+ -5:00 Brazil %z 1994 Sep 22
+ -5:00 - %z 2008 Jun 24 0:00
+ -4:00 - %z 2013 Nov 10
+ -5:00 - %z
#
# Acre (AC)
Zone America/Rio_Branco -4:31:12 - LMT 1914
- -5:00 Brazil -05/-04 1988 Sep 12
- -5:00 - -05 2008 Jun 24 0:00
- -4:00 - -04 2013 Nov 10
- -5:00 - -05
+ -5:00 Brazil %z 1988 Sep 12
+ -5:00 - %z 2008 Jun 24 0:00
+ -4:00 - %z 2013 Nov 10
+ -5:00 - %z
# Chile
@@ -1359,36 +1359,36 @@ Rule Chile 2023 max - Sep Sun>=2 4:00u 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Santiago -4:42:45 - LMT 1890
-4:42:45 - SMT 1910 Jan 10 # Santiago Mean Time
- -5:00 - -05 1916 Jul 1
+ -5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10
- -4:00 - -04 1919 Jul 1
+ -4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1
- -5:00 Chile -05/-04 1932 Sep 1
- -4:00 - -04 1942 Jun 1
- -5:00 - -05 1942 Aug 1
- -4:00 - -04 1946 Jul 14 24:00
- -4:00 1:00 -03 1946 Aug 28 24:00 # central CL
- -5:00 1:00 -04 1947 Mar 31 24:00
- -5:00 - -05 1947 May 21 23:00
- -4:00 Chile -04/-03
+ -5:00 Chile %z 1932 Sep 1
+ -4:00 - %z 1942 Jun 1
+ -5:00 - %z 1942 Aug 1
+ -4:00 - %z 1946 Jul 14 24:00
+ -4:00 1:00 %z 1946 Aug 28 24:00 # central CL
+ -5:00 1:00 %z 1947 Mar 31 24:00
+ -5:00 - %z 1947 May 21 23:00
+ -4:00 Chile %z
Zone America/Punta_Arenas -4:43:40 - LMT 1890
-4:42:45 - SMT 1910 Jan 10
- -5:00 - -05 1916 Jul 1
+ -5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10
- -4:00 - -04 1919 Jul 1
+ -4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1
- -5:00 Chile -05/-04 1932 Sep 1
- -4:00 - -04 1942 Jun 1
- -5:00 - -05 1942 Aug 1
- -4:00 - -04 1946 Aug 28 24:00
- -5:00 1:00 -04 1947 Mar 31 24:00
- -5:00 - -05 1947 May 21 23:00
- -4:00 Chile -04/-03 2016 Dec 4
- -3:00 - -03
+ -5:00 Chile %z 1932 Sep 1
+ -4:00 - %z 1942 Jun 1
+ -5:00 - %z 1942 Aug 1
+ -4:00 - %z 1946 Aug 28 24:00
+ -5:00 1:00 %z 1947 Mar 31 24:00
+ -5:00 - %z 1947 May 21 23:00
+ -4:00 Chile %z 2016 Dec 4
+ -3:00 - %z
Zone Pacific/Easter -7:17:28 - LMT 1890
-7:17:28 - EMT 1932 Sep # Easter Mean Time
- -7:00 Chile -07/-06 1982 Mar 14 3:00u # Easter Time
- -6:00 Chile -06/-05
+ -7:00 Chile %z 1982 Mar 14 3:00u # Easter Time
+ -6:00 Chile %z
#
# Salas y Gómez Island is uninhabited.
# Other Chilean locations, including Juan Fernández Is, Desventuradas Is,
@@ -1408,10 +1408,10 @@ Zone Pacific/Easter -7:17:28 - LMT 1890
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Palmer 0 - -00 1965
- -4:00 Arg -04/-03 1969 Oct 5
- -3:00 Arg -03/-02 1982 May
- -4:00 Chile -04/-03 2016 Dec 4
- -3:00 - -03
+ -4:00 Arg %z 1969 Oct 5
+ -3:00 Arg %z 1982 May
+ -4:00 Chile %z 2016 Dec 4
+ -3:00 - %z
# Colombia
@@ -1430,7 +1430,7 @@ Rule CO 1993 only - Feb 6 24:00 0 -
#STDOFF -4:56:16.4
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
-4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time
- -5:00 CO -05/-04
+ -5:00 CO %z
# Malpelo, Providencia, San Andres
# no information; probably like America/Bogota
@@ -1461,10 +1461,10 @@ Rule Ecuador 1993 only - Feb 5 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guayaquil -5:19:20 - LMT 1890
-5:14:00 - QMT 1931 # Quito Mean Time
- -5:00 Ecuador -05/-04
+ -5:00 Ecuador %z
Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno
- -5:00 - -05 1986
- -6:00 Ecuador -06/-05
+ -5:00 - %z 1986
+ -6:00 Ecuador %z
# Falklands
@@ -1564,10 +1564,10 @@ Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Stanley -3:51:24 - LMT 1890
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
- -4:00 Falk -04/-03 1983 May
- -3:00 Falk -03/-02 1985 Sep 15
- -4:00 Falk -04/-03 2010 Sep 5 2:00
- -3:00 - -03
+ -4:00 Falk %z 1983 May
+ -3:00 Falk %z 1985 Sep 15
+ -4:00 Falk %z 2010 Sep 5 2:00
+ -3:00 - %z
# French Guiana
# For the 1911/1912 establishment of standard time in French possessions, see:
@@ -1575,8 +1575,8 @@ Zone Atlantic/Stanley -3:51:24 - LMT 1890
# page 752, 18b.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
- -4:00 - -04 1967 Oct
- -3:00 - -03
+ -4:00 - %z 1967 Oct
+ -3:00 - %z
# Guyana
@@ -1610,10 +1610,10 @@ Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guyana -3:52:39 - LMT 1911 Aug 1 # Georgetown
- -4:00 - -04 1915 Mar 1
- -3:45 - -0345 1975 Aug 1
- -3:00 - -03 1992 Mar 29 1:00
- -4:00 - -04
+ -4:00 - %z 1915 Mar 1
+ -3:45 - %z 1975 Aug 1
+ -3:00 - %z 1992 Mar 29 1:00
+ -4:00 - %z
# Paraguay
#
@@ -1711,9 +1711,9 @@ Rule Para 2013 max - Mar Sun>=22 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Asuncion -3:50:40 - LMT 1890
-3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time
- -4:00 - -04 1972 Oct
- -3:00 - -03 1974 Apr
- -4:00 Para -04/-03
+ -4:00 - %z 1972 Oct
+ -3:00 - %z 1974 Apr
+ -4:00 Para %z
# Peru
#
@@ -1740,12 +1740,12 @@ Rule Peru 1994 only - Apr 1 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Lima -5:08:12 - LMT 1890
-5:08:36 - LMT 1908 Jul 28 # Lima Mean Time?
- -5:00 Peru -05/-04
+ -5:00 Peru %z
# South Georgia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
- -2:00 - -02
+ -2:00 - %z
# South Sandwich Is
# uninhabited; scientific personnel have wintered
@@ -1755,8 +1755,8 @@ Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
Zone America/Paramaribo -3:40:40 - LMT 1911
-3:40:52 - PMT 1935 # Paramaribo Mean Time
-3:40:36 - PMT 1945 Oct # The capital moved?
- -3:30 - -0330 1984 Oct
- -3:00 - -03
+ -3:30 - %z 1984 Oct
+ -3:00 - %z
# Uruguay
# From Paul Eggert (1993-11-18):
@@ -1971,15 +1971,15 @@ Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
# This Zone can be simplified once we assume zic %z.
Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
-3:44:51 - MMT 1920 May 1 # Montevideo MT
- -4:00 - -04 1923 Oct 1
- -3:30 Uruguay -0330/-03 1942 Dec 14
- -3:00 Uruguay -03/-0230 1960
- -3:00 Uruguay -03/-02 1968
- -3:00 Uruguay -03/-0230 1970
- -3:00 Uruguay -03/-02 1974
- -3:00 Uruguay -03/-0130 1974 Mar 10
- -3:00 Uruguay -03/-0230 1974 Dec 22
- -3:00 Uruguay -03/-02
+ -4:00 - %z 1923 Oct 1
+ -3:30 Uruguay %z 1942 Dec 14
+ -3:00 Uruguay %z 1960
+ -3:00 Uruguay %z 1968
+ -3:00 Uruguay %z 1970
+ -3:00 Uruguay %z 1974
+ -3:00 Uruguay %z 1974 Mar 10
+ -3:00 Uruguay %z 1974 Dec 22
+ -3:00 Uruguay %z
# Venezuela
#
@@ -2013,7 +2013,7 @@ Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Caracas -4:27:44 - LMT 1890
-4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
- -4:30 - -0430 1965 Jan 1 0:00
- -4:00 - -04 2007 Dec 9 3:00
- -4:30 - -0430 2016 May 1 2:30
- -4:00 - -04
+ -4:30 - %z 1965 Jan 1 0:00
+ -4:00 - %z 2007 Dec 9 3:00
+ -4:30 - %z 2016 May 1 2:30
+ -4:00 - %z
diff --git a/tz/theory.html b/tz/theory.html
index 516d2a5..d3573ed 100644
--- a/tz/theory.html
+++ b/tz/theory.html
@@ -89,13 +89,15 @@ Scope of the tz
database
href="https://en.wikipedia.org/wiki/POSIX">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.1-2017.
+Edition), POSIX.1-2024 requires support for the
+tz
database, which has a
+model for describing civil time that is more complex than the
+standard and daylight saving times required by POSIX.1-2017.
A tz
timezone 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
@@ -159,7 +161,7 @@ Timezone identifiers
-Names normally have the form
+Names normally have the format
AREA/
LOCATION, where
AREA is a continent or ocean, and
LOCATION is a specific location within the area.
@@ -187,7 +189,7 @@
Timezone identifiers
href="https://en.wikipedia.org/wiki/ASCII">ASCII letters,
'.
', '-
' and '_
'.
Do not use digits, as that might create an ambiguity with POSIX.1-2017
+ href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03">POSIX's proleptic
TZ
strings.
A file name component must not exceed 14 characters or start with
'-
'.
@@ -378,7 +380,8 @@ Timezone identifiers
and no great weight should be attached to whether a link
is defined in backward
or in some other file.
The source file etcetera
defines names that may be useful
-on platforms that do not support POSIX.1-2017-style TZ
strings;
+on platforms that do not support proleptic TZ
strings
+like <+08>-8
;
no other source file other than backward
contains links to its zones.
One of etcetera
's names is Etc/UTC
,
@@ -425,8 +428,8 @@ Time zone abbreviations
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.1-2017 TZ
string.
+ This guarantees that all abbreviations could have been specified
+ explicitly by a POSIX proleptic TZ
string.
@@ -578,6 +581,11 @@ Time zone abbreviations
some sense undefined; this notation is derived
from Internet
RFC 3339.
+ (The abbreviation 'Z' that
+ Internet
+ RFC 9557 uses for this concept
+ would violate the POSIX requirement
+ of at least three characters in an abbreviation.)
@@ -775,7 +783,7 @@ Accuracy of the tz
database
the Western 06:00 to be 12:00. These practices are largely outside
the scope of the tz
code and data, which
provide only limited support for date and time localization
- such as that required by POSIX.1-2017.
+ such as that required by POSIX.
If DST is not used a different time zone
can often do the trick; for example, in Kenya a TZ
setting
like <-03>3
or America/Cayenne
starts
@@ -866,29 +874,62 @@ Time and date functions
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
+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.1-2017 properties and limitations
+
+In POSIX, time display in a process is controlled by the
+environment variable TZ
, which can have two forms:
+
+ -
+ A proleptic
TZ
value
+ like CET-1CEST,M3.5.0,M10.5.0/3
uses a complex
+ notation that specifies a single standard time along with daylight
+ saving rules that apply to all years past, present, and future.
+
+ -
+ A geographical
TZ
value
+ like Europe/Berlin
names a location that stands for
+ civil time near that location, which can have more than
+ one standard time and more than one set of daylight saving rules,
+ to record timekeeping practice more accurately.
+ These names are defined by the tz
database.
+
+
+
+POSIX.1-2017 properties and limitations
+
+Some platforms support only the features required by POSIX.1-2017,
+and have not yet upgraded to POSIX.1-2024.
+Code intended to be portable to these platforms must deal
+with problems that were fixed in later POSIX editions.
+
+
+
+ -
+ POSIX.1-2017 does not require support for geographical
TZ
,
+ and there is no convenient and efficient way to determine
+ the UT offset and time zone abbreviation of arbitrary
+ timestamps, particularly for timezones
+ that do not fit into the POSIX model.
+
-
- In POSIX.1-2017, time display in a process is controlled by the
- environment variable TZ
.
- Unfortunately, the POSIX.1-2017
- TZ
string takes a form that is hard to describe and
- is error-prone in practice.
- Also, POSIX.1-2017 TZ
strings cannot deal with daylight
+ The proleptic TZ
string,
+ which is all that POSIX.1-2017 requires,
+ has a format that is hard to describe and is error-prone in practice.
+ Also, proleptic TZ
strings cannot deal with daylight
saving time rules not based on the Gregorian calendar (as in
Morocco), or with situations where more than two time zone
abbreviations or UT offsets are used in an area.
- The POSIX.1-2017 TZ
string takes the following form:
+ A proleptic TZ
string has the following format:
@@ -955,7 +996,7 @@
POSIX.1-2017 properties and limitations
- Here is an example POSIX.1-2017 TZ
string for New
+ Here is an example proleptic TZ
string for New
Zealand after 2007.
It says that standard time (NZST) is 12 hours ahead
of UT, and that daylight saving time
@@ -966,26 +1007,46 @@
POSIX.1-2017 properties and limitations
TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'
- This POSIX.1-2017 TZ
string is hard to remember, and
+ This proleptic TZ
string is hard to remember, and
mishandles some timestamps before 2008.
- With this package you can use this instead:
+ With this package you can use a geographical TZ
instead:
TZ='Pacific/Auckland'
+
+
+
+POSIX.1-2017 also has the limitations of POSIX.1-2024,
+discussed in the next section.
+
+
+POSIX.1-2024 properties and limitations
+
+POSIX.1-2024 extends POSIX.1-2017 in the following significant ways:
+
+
-
- POSIX does not define the DST transitions
- for
TZ
values like
- "EST5EDT
".
- Traditionally the current US DST rules
- were used to interpret such values, but this meant that the
- US DST rules were compiled into each
- time conversion package, and when
- US time conversion rules changed (as in the United
- States in 1987 and again in 2007), all packages that
- interpreted TZ
values had to be updated
- to ensure proper results.
+ POSIX.1-2024 requires support for geographical TZ
.
+ Earlier POSIX editions require support only for proleptic TZ
.
+
+ -
+ POSIX.1-2024 requires
struct tm
+ to have a UT offset member tm_gmtoff
+ and a time zone abbreviation member tm_zone
.
+ Earlier POSIX editions lack this requirement.
+
+ -
+ DST transition times can range from −167:59:59
+ to 167:59:59 instead of merely from 00:00:00 to 24:59:59.
+ This allows for proleptic TZ strings
+ like
"<-02>2<-01>,M3.5.0/-1,M10.5.0/0"
+ where the transition time −1:00 means 23:00 the previous day.
+
+
+However POSIX.1-2024, like earlier POSIX editions, has some limitations:
+
-
The
TZ
environment variable is process-global, which
makes it hard to write efficient, thread-safe applications that
@@ -1003,16 +1064,34 @@ POSIX.1-2017 properties and limitations
handling daylight saving time shifts – as might be required to
limit phone calls to off-peak hours.
- -
- POSIX.1-2017 provides no convenient and efficient way to determine
- the UT offset and time zone abbreviation of arbitrary
- timestamps, particularly for timezones
- that do not fit into the POSIX model.
-
-
POSIX requires that
time_t
clock counts exclude leap
seconds.
+ -
+ POSIX does not define the DST transitions
+ for
TZ
values like
+ "EST5EDT
".
+ Traditionally the current US DST rules
+ were used to interpret such values, but this meant that the
+ US DST rules were compiled into each
+ time conversion package, and when
+ US time conversion rules changed (as in the United
+ States in 1987 and again in 2007), all packages that
+ interpreted TZ
values had to be updated
+ to ensure proper results.
+
+
+
+Extensions to POSIX in the
+tz
code
+
+ The tz
code defines some properties
+ left unspecified by POSIX, and attempts to support some
+ extensions to POSIX.
+
+
+
-
The
tz
code attempts to support all the
time_t
implementations allowed by POSIX.
@@ -1026,21 +1105,14 @@ POSIX.1-2017 properties and limitations
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 system,
- and POSIX.1-2013 and the tz
code both
+ and POSIX.1-2013+ and the tz
code both
require time_t
to be an integer type.
-
-
-Extensions to POSIX.1-2017 in the
-tz
code
-
-
- The TZ
environment variable is used in generating
- the name of a file from which time-related information is read
- (or is interpreted à la POSIX.1-2017); TZ
is no longer
- constrained to be a string containing abbreviations
- and numeric data as described above.
+ If the TZ
environment variable uses the geographical format,
+ it is used in generating
+ the name of a file from which time-related information is read.
The file's format is TZif,
a timezone information format that contains binary data; see
Internet
@@ -1053,10 +1125,11 @@ Extensions to POSIX.1-2017 in the
abbreviations are used.
- It was recognized that allowing the TZ
environment
+ When the tz
code was developed in the 1980s,
+ 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
+ certain format) to operate incorrectly; consideration was given to using
some other environment variable (for example, TIMEZONE
)
to hold the string used to generate the TZif file's name.
In the end, however, it was decided to continue using
@@ -1069,15 +1142,6 @@
Extensions to POSIX.1-2017 in the
assume pre-POSIX TZ
values.
- -
- The code supports platforms with a UT offset member
- in
struct tm
, e.g., tm_gmtoff
,
- or with a time zone abbreviation member in
- struct tm
, e.g., tm_zone
. As noted
- in Austin
- Group defect 1533, a future version of POSIX is planned to
- require tm_gmtoff
and tm_zone
.
-
-
Functions
tzalloc
, tzfree
,
localtime_rz
, and mktime_z
for
@@ -1088,7 +1152,7 @@ Extensions to POSIX.1-2017 in the
and localtime_rz
and mktime_z
are
like localtime_r
and mktime
with an
extra timezone_t
argument.
- The functions were inspired by NetBSD.
+ The functions were inspired by NetBSD.
-
Negative
time_t
values are supported, on systems
@@ -1116,6 +1180,7 @@ POSIX features no longer needed
-
The POSIX
tzname
variable does not suffice and is no
longer needed.
+ It is planned to be removed in a future edition of POSIX.
To get a timestamp's time zone abbreviation, consult
the tm_zone
member if available; otherwise,
use strftime
's "%Z"
conversion
@@ -1124,6 +1189,7 @@ POSIX features no longer needed
-
The POSIX
daylight
and timezone
variables do not suffice and are no longer needed.
+ They are planned to be removed in a future edition of POSIX.
To get a timestamp's UT offset, consult
the tm_gmtoff
member if available; otherwise,
subtract values returned by localtime
@@ -1278,13 +1344,13 @@ Leap seconds
Leap seconds were introduced in 1972 to accommodate the
difference between atomic time and the less regular rotation of the earth.
-Unfortunately they caused so many problems with civil
-timekeeping that they
-are planned
-to be discontinued by 2035, with some as-yet-undetermined
-mechanism replacing them, perhaps after the year 2135.
-Despite their impending obsolescence, a record of leap seconds is still
-needed to resolve timestamps from 1972 through 2035.
+Unfortunately they have caused so many problems with civil
+timekeeping that there are
+plans
+to discontinue them by 2035.
+Even if these plans come to fruition, a record of leap seconds will still be
+needed to resolve timestamps from 1972 through 2035,
+and there may also be a need to record whatever mechanism replaces them.
@@ -1374,6 +1440,12 @@
Time and time zones off Earth
the establishment of a reference timescale for the Moon, which has
days roughly equivalent to 29.5 Earth days, and where relativistic
effects cause clocks to tick slightly faster than on Earth.
+Also, NASA
+has been ordered
+to consider the establishment of Coordinated Lunar Time (LTC).
+It is not yet known whether the US and European efforts will result in
+multiple timescales on the Moon.
diff --git a/tz/tz-art.html b/tz/tz-art.html
index 3ee1eb2..15ba7f4 100644
--- a/tz/tz-art.html
+++ b/tz/tz-art.html
@@ -228,6 +228,11 @@
Books, plays, and magazines
magazine's 2002-11-11 issue; among other things, it proposed
year-round DST as a way of lessening wintertime despair.
+-
+Cory Doctorow, Eastern Standard Tribe,
+2004. The world splinters into tribes characterized by their timezones.
+
Music
diff --git a/tz/tz-link.html b/tz/tz-link.html
index 9fb57c9..be2aae5 100644
--- a/tz/tz-link.html
+++ b/tz/tz-link.html
@@ -81,10 +81,11 @@ The tz
database
title="Berkeley Software Distribution">BSD,
NetBSD,
OpenBSD,
-Chromium OS,
+ChromiumOS,
Cygwin,
MariaDB,
MINIX,
+musl libc,
MySQL,
webOS,
@@ -112,9 +113,9 @@ The tz
database
and other entries represent smaller regions like Starke County,
Indiana, which switched from central to eastern time in 1991
and switched back in 2006.
-To use the database on an extended POSIX.1-2017
+title="Portable Operating System Interface">POSIX.1-2024
implementation set the TZ
environment variable to the location's full name,
e.g., TZ="America/New_York"
.
@@ -192,9 +193,10 @@ Downloading the tz
database
README
file for what to do next.
The code lets you compile the tz
source files into
machine-readable binary files, one for each location. The binary files
-are in a special timezone information format (TZif)
-specified by Internet
-RFC 8536.
+are in a special format specified by
+The
+Time Zone Information Format (TZif)
+(Internet RFC 8536).
The code also lets
you read a TZif file and interpret timestamps for that
location.
@@ -205,13 +207,11 @@ Changes to the tz
database
The tz
code and data
are by no means authoritative. If you find errors, please
-send changes to tz@iana.org
,
-the time zone mailing list. You can also subscribe to it
-and browse the archive of old
-messages.
-Metadata for mailing list
+email changes to tz@iana.org
,
+the time zone mailing list. See
+the mailing
+list's main page to subscribe or to browse its archive of old messages.
+Metadata for mailing list
discussions and corresponding data changes can be
generated automatically.
@@ -226,7 +226,7 @@ Changes to the tz
database
the tz README
file and installing the latest
data yourself. System-specific instructions for installing the
latest tz
data have also been published
-for AIX,
+for AIX,
Android,
Changes to the tz
database
title="linefeed">LF,
which can be modified by common text editors such
as GNU Emacs,
-gedit, and
+gedit, and
vim.
Specialized source-file editing can be done via the
Sublime
@@ -261,8 +261,8 @@ Changes to the tz
database
For further information about updates, please see
Procedures for
-Maintaining the Time Zone Database (Internet RFC 6557). More detail can be
+Maintaining the Time Zone Database
(Internet RFC 6557).
+More detail can be
found in Theory and pragmatics of the
tz
code and data.
A0 TimeZone Migration
@@ -400,7 +400,7 @@ Network protocols for tz
data
title="Extensible Markup Language">XML format, and a variant
jCal
(Internet RFC 7265)
-uses JSON format.
@@ -413,7 +413,7 @@ Other tz
compilers
running the command make rearguard_tarballs
and compiling
from the resulting tarballs instead.
-- Vzic is a Vzic is a C
program that compiles
tz
source into iCalendar-compatible VTIMEZONE files.
@@ -440,11 +440,9 @@ Other tz
compilers
- The Time Zone
Database Parser is a
C++ parser and
-runtime library with API
-adopted by
-C++20,
-the current iteration of the C++ standard.
+runtime library with a
std::chrono
API
+that is a standard part of C++.
It is freely available under the
MIT license.
- International Components for
@@ -467,8 +465,8 @@
Other tz
compilers
- The TZUpdater
tool compiles
tz
source into the format used by
-OpenJDK and
-Oracle JDK.
+OpenJDK and
+Oracle JDK.
Although its source code is proprietary, its executable is available under the
Java SE
Timezone Updater License Agreement.
@@ -490,7 +488,7 @@ Other tz
compilers
ZIUpdater is licensed under the GPL.
- Time4A: Advanced date and
time library for Android and
-Time4J: Advanced date,
+Time4J: Advanced date,
time and interval library for Java compile
tz
source into a binary format.
Time4A is available under the Apache License and Time4J is
@@ -516,7 +514,7 @@ Other tz
compilers
href="https://github.com/formatjs/date-time-format-timezone">Intl.DateTimeFormat
timezone polyfill
is freely available under a BSD-style license.
-- The date-fns
+
- The date-fns
library manipulates timezone-aware timestamps in browsers and
in Node.js.
It is freely available under the MIT license.
@@ -552,9 +550,9 @@ Other tz
compilers
tzdb
data, and are designed to replace JavaScript's
problematic Date
objects when working with dates and times.
-- JuliaTime contains a
+
- JuliaTime contains a
compiler from
tz
source into
-Julia. It is freely available
+Julia. It is freely available
under the MIT license.
- TZDB –
IANA Time Zone Database for Delphi/Other
tz
compilers
and FPC.
It is freely available under a BSD-style license.
-- pytz – World Timezone
+
- pytz – World Timezone
Definitions for Python compiles
tz
source into
Python.
It is freely available under a BSD-style license.
@@ -621,11 +619,11 @@ Other TZif readers
posix_tz_db
package contains Python code
to generate CSV and JSON tables that map
-tz
settings to POSIX.1-2017-like approximations.
+tz
settings to proleptic TZ approximations.
For example, it maps "Africa/Cairo"
to "EET-2EEST,M4.5.5/0,M10.5.4/24"
,
an approximation valid for Cairo timestamps from 2023 on.
-This can help porting to platforms that support only POSIX.1-2017.
+This can help porting to platforms that support only proleptic TZ.
The package is freely available under the MIT license.
- Timelib is a C
library that reads TZif files and converts
@@ -649,7 +647,7 @@
Other TZif readers
Python is freely available under the
Python Software Foundation
License.
-A companion PyPI module
+A companion PyPI module
tzdata
supplies TZif data if the underlying system data cannot be found;
it is freely available under the Apache License.
@@ -897,9 +895,10 @@ National histories of legal time
href="https://www.ptb.de/cms/en/fachabteilungen/abt4/fb-44/ag-441/realisation-of-legal-time-in-germany.html">Realisation
of Legal Time in Germany.
- Israel
-- The Interior Ministry periodically issues announcements (in Hebrew).
+- Israel Timezone Files
+lists official time-change announcements and laws since 1940,
+almost all in Hebrew.
- Malaysia
- See Singapore below.
- Mexico
@@ -1081,6 +1080,20 @@ Precision timekeeping
1972 even though the historical situation is messy, partly because
neither UTC nor TAI
is well-defined for sufficiently old timestamps.
+- The
+NTP Leap Second File covers the text file
+
leap-seconds.list
, which lists the currently known leap seconds.
+The IERS maintains this file, and a copy is distributed by
+tzdb
for use by NTP implementations like
+classic
+ntpd
+and NTPsec.
+The tz
database also distributes leap second
+information in a differently-formatted leapseconds
text file,
+as well as in the "right
" configuration in binary form; for
+example, right/UTC
can be used
+by chrony
,
+another NTP implementation.
- Leap Smear
discusses how to gradually adjust POSIX clocks near a
leap second so that they disagree with UTC by at most a
@@ -1088,7 +1101,7 @@
Precision timekeeping
sixty seconds. This approach works with the default tz
"posix
" configuration, is supported by
-the NTP reference implementation, NTP implementations, supports conversion between
UTC and smeared POSIX timestamps, and is used by major
cloud service providers. However, according to
@@ -1111,11 +1124,18 @@ Precision timekeeping
contentious issue.
The General Conference on Weights and Measures
decided in 2022
-to discontinue the use of leap seconds by 2035, replacing them with an
-as-yet-undetermined scheme some time after the year 2135.
+to discontinue the use of leap seconds by 2035, and requested that no
+discontinuous adjustments be made to UTC for at least a century.
The World Radiocommunication Conference resolved
in 2023 to cooperate with this process.
+A proposal
+to change the leap-second adjustments to Coordinated Universal Time
+(doi:10.1088/1681-7575/ad6266)
+would replace leap seconds with 13-second leap smears occurring once per
+decade until 2100, with leap smears after that gradually increasing in size.
+However, there is still no consensus on whether this is the best way
+to replace leap seconds.
@@ -1153,9 +1173,12 @@ Time notation
Date and Time
on the Internet: Timestamps (Internet RFC 3339)
-specifies an ISO 8601
-profile for use in new Internet
-protocols.
+specifies an ISO 8601 profile for use in new Internet protocols.
+An extension, Date
+and Time on the Internet: Timestamps with Additional Information
+(Internet RFC 9557) extends this profile
+to let you specify the tzdb
timezone of a timestamp
+via suffixes like "[Asia/Tokyo]
".
Date & Time
Formats on the Web surveys web- and Internet-oriented date and time
@@ -1173,8 +1196,8 @@ Time notation
inventions, and these have been removed when possible.
Numeric time zone abbreviations typically count hours east of
UT, e.g., +09 for Japan and
-−10 for Hawaii. However, the POSIX
-TZ
environment variable uses the opposite convention.
+−10 for Hawaii. However, POSIX proleptic
+TZ
settings use the opposite convention.
For example, one might use TZ="JST-9"
and
TZ="HST10"
diff --git a/tz/tzfile.5 b/tz/tzfile.5
index 867348d..6e2fd70 100644
--- a/tz/tzfile.5
+++ b/tz/tzfile.5
@@ -42,7 +42,7 @@ or
Fifteen bytes containing zeros reserved for future use.
.IP \(bu
Six four-byte integer values, in the following order:
-.RS "\w' \(bu 'u"
+.RS "\w'\(bu 'u"
.TP "\w' 'u"
.B tzh_ttisutcnt
The number of UT/local indicators stored in the file.
@@ -66,6 +66,7 @@ in the file (must not be zero).
The number of bytes of time zone abbreviation strings
stored in the file.
.RE
+.RE
.PP
The above header is followed by the following fields, whose lengths
depend on the contents of the header:
@@ -85,7 +86,7 @@ described in the file is associated with the time period
starting with the same-indexed transition time
and continuing up to but not including the next transition time.
(The last time type is present only for consistency checking with the
-POSIX.1-2017-style TZ string described below.)
+proleptic TZ string described below.)
These values serve as indices into the next field.
.IP \(bu
.B tzh_typecnt
@@ -134,8 +135,7 @@ Also, in realistic applications
is in the range [\-89999, 93599] (i.e., more than \-25 hours and less
than 26 hours); this allows easy support by implementations that
already support the POSIX-required range [\-24:59:59, 25:59:59].
-.RS "\w' 'u"
-.IP \(bu "\w'\(bu 'u"
+.IP \(bu
.B tzh_charcnt
bytes that represent time zone designations,
which are null-terminated byte strings, each indexed by the
@@ -187,12 +187,12 @@ must also be set.
The standard/wall and UT/local indicators were designed for
transforming a TZif file's transition times into transitions appropriate
for another time zone specified via
-a POSIX.1-2017-style TZ string that lacks rules.
+a proleptic TZ string that lacks rules.
For example, when TZ="EET\*-2EEST" and there is no TZif file "EET\*-2EEST",
the idea was to adapt the transition times from a TZif file with the
well-known name "posixrules" that is present only for this purpose and
is a copy of the file "Europe/Brussels", a file with a different UT offset.
-POSIX does not specify this obsolete transformational behavior,
+POSIX does not specify the details of this obsolete transformational behavior,
the default rules are installation-dependent, and no implementation
is known to support this feature for timestamps past 2037,
so users desiring (say) Greek time should instead specify
@@ -217,12 +217,12 @@ identical in format except that
eight bytes are used for each transition time or leap second time.
(Leap second counts remain four bytes.)
After the second header and data comes a newline-enclosed string
-in the style of the contents of a POSIX.1-2017 TZ environment variable,
+in the style of the contents of a proleptic TZ,
for use in handling instants
after the last transition time stored in the file
or for all instants if the file has no transitions.
The TZ string is empty (i.e., nothing between the newlines)
-if there is no POSIX.1-2017-style representation for such instants.
+if there is no proleptic representation for such instants.
If nonempty, the TZ string must agree with the local time
type after the last transition time if present in the eight-byte data;
for example, given the string
@@ -235,13 +235,14 @@ Also, if there is at least one transition, time type 0 is associated
with the time period from the indefinite past up to but not including
the earliest transition time.
.SS Version 3 format
-For version-3-format timezone files, the TZ string may
-use two minor extensions to the POSIX.1-2017 TZ format, as described in
-.BR newtzset (3).
-First, the hours part of its transition times may be signed and range from
-\-167 through 167 instead of the POSIX-required unsigned values
+For version-3-format timezone files, a TZ string (see
+.BR newtzset (3))
+may use the following POSIX.1-2024 extensions to POSIX.1-2017:
+First, as in TZ="<\*-02>2<\*-01>,M3.5.0/\*-1,M10.5.0/0",
+the hours part of its transition times may be signed and range from
+\-167 through 167 instead of being limited to unsigned values
from 0 through 24.
-Second, DST is in effect all year if it starts
+Second, as in TZ="XXX3EDT4,0/0,J365/23", DST is in effect all year if it starts
January 1 at 00:00 and ends December 31 at 24:00 plus the difference
between daylight saving and standard time.
.SS Version 4 format
@@ -354,7 +355,8 @@ version 2+ data even if the reader's native timestamps have only
.IP \(bu
Some readers designed for version 2 might mishandle
timestamps after a version 3 or higher file's last transition, because
-they cannot parse extensions to POSIX.1-2017 in the TZ-like string.
+they cannot parse the POSIX.1-2024 extensions to POSIX.1-2017
+in the proleptic TZ string.
As a partial workaround, a writer can output more transitions
than necessary, so that only far-future timestamps are
mishandled by version 2 readers.
@@ -386,6 +388,18 @@ timestamps from the time type of the last transition.
As a partial workaround, a writer can output more transitions
than necessary.
.IP \(bu
+Some stripped-down readers ignore everything but the footer,
+and use its proleptic TZ string to calculate all timestamps.
+Although this approach often works for current and future timestamps,
+it obviously has problems with past timestamps,
+and even for current timestamps it can fail for settings like
+TZ="Africa/Casablanca". This corresponds to a TZif file
+containing explicit transitions through the year 2087,
+followed by a footer containing the TZ string
+.q <+01>\*-1 ,
+which should be used only for timestamps after the last
+explicit transition.
+.IP \(bu
Some readers do not use time type 0 for timestamps before
the first transition, in that they infer a time type using a
heuristic that does not always select time type 0.
diff --git a/tz/tzfile.h b/tz/tzfile.h
index 3155010..b154146 100644
--- a/tz/tzfile.h
+++ b/tz/tzfile.h
@@ -76,14 +76,16 @@ struct tzhead {
** If tzh_version is '2' or greater, the above is followed by a second instance
** of tzhead and a second instance of the data in which each coded transition
** time uses 8 rather than 4 chars,
-** then a POSIX-TZ-environment-variable-style string for use in handling
+** then a POSIX.1-2017 proleptic TZ string for use in handling
** instants after the last transition time stored in the file
** (with nothing between the newlines if there is no POSIX.1-2017
** representation for such instants).
**
-** If tz_version is '3' or greater, the above is extended as follows.
+** If tz_version is '3' or greater, the TZ string can be any POSIX.1-2024
+** proleptic TZ string, which means the above is extended as follows.
** First, the TZ string's hour offset may range from -167
-** through 167 as compared to the POSIX-required 0 through 24.
+** through 167 as compared to the range 0 through 24 required
+** by POSIX.1-2017 and earlier.
** Second, its DST start time may be January 1 at 00:00 and its stop
** time December 31 at 24:00 plus the difference between DST and
** standard time, indicating DST all year.
diff --git a/tz/tzselect.ksh b/tz/tzselect.ksh
index 38941bb..ca3d82c 100644
--- a/tz/tzselect.ksh
+++ b/tz/tzselect.ksh
@@ -20,12 +20,6 @@ REPORT_BUGS_TO=tz@iana.org
# Korn Shell
# MirBSD Korn Shell
#
-# For portability to Solaris 10 /bin/sh (supported by Oracle through
-# January 2027) this script avoids some POSIX features and common
-# extensions, such as $(...), $((...)), ! CMD, unquoted ^, ${#ID},
-# ${ID##PAT}, ${ID%%PAT}, and $10. Although some of these constructs
-# work sometimes, it's simpler to avoid them entirely.
-#
# This script also uses several features of POSIX awk.
# If your host lacks awk, or has an old awk that does not conform to POSIX,
# you can use any of the following free programs instead:
@@ -45,7 +39,6 @@ set -f
# Specify default values for environment variables if they are unset.
: ${AWK=awk}
-: ${PWD=`pwd`}
: ${TZDIR=$PWD}
# Output one argument as-is to standard output, with trailing newline.
@@ -54,13 +47,6 @@ say() {
printf '%s\n' "$1"
}
-# Check for awk POSIX compliance.
-($AWK -v x=y 'BEGIN { exit 123 }') <>/dev/null >&0 2>&0
-[ $? = 123 ] || {
- say >&2 "$0: Sorry, your '$AWK' program is not POSIX compatible."
- exit 1
-}
-
coord=
location_limit=10
zonetabtype=zone1970
@@ -117,8 +103,7 @@ then
else
doselect() {
# Field width of the prompt numbers.
- print_nargs_length="BEGIN {print length(\"$#\");}"
- select_width=`$AWK "$print_nargs_length"`
+ select_width=${##}
select_i=
@@ -129,14 +114,14 @@ else
select_i=0
for select_word
do
- select_i=`$AWK "BEGIN { print $select_i + 1 }"`
+ select_i=$(($select_i + 1))
printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word"
done;;
*[!0-9]*)
echo >&2 'Please enter a number in range.';;
*)
if test 1 -le $select_i && test $select_i -le $#; then
- shift `$AWK "BEGIN { print $select_i - 1 }"`
+ shift $(($select_i - 1))
select_result=$1
break
fi
@@ -170,7 +155,7 @@ do
esac
done
-shift `$AWK "BEGIN { print $OPTIND - 1 }"`
+shift $(($OPTIND - 1))
case $# in
0) ;;
*) say >&2 "$0: $1: unknown argument"; exit 1
@@ -178,11 +163,13 @@ esac
# translit=true to try transliteration.
# This is false if U+12345 CUNEIFORM SIGN URU TIMES KI has length 1
-# which means awk (and presumably the shell) do not need transliteration.
-if $AWK 'BEGIN { u12345 = "\360\222\215\205"; exit length(u12345) == 1 }'; then
- translit=true
-else
- translit=false
+# which means the shell and (presumably) awk do not need transliteration.
+# It is true if the byte string has some other length in characters, or
+# if this is a POSIX.1-2017 or earlier shell that does not support $'...'.
+CUNEIFORM_SIGN_URU_TIMES_KI=$'\360\222\215\205'
+if test ${#CUNEIFORM_SIGN_URU_TIMES_KI} = 1
+then translit=false
+else translit=true
fi
# Read into shell variable $1 the contents of file $2.
@@ -192,10 +179,10 @@ fi
# if that does not work, fall back on 'cat'.
read_file() {
{ $translit && {
- eval "$1=\`(iconv -f UTF-8 -t //TRANSLIT) 2>/dev/null <\"\$2\"\`" ||
- eval "$1=\`(iconv -f UTF-8) 2>/dev/null <\"\$2\"\`"
+ eval "$1=\$( (iconv -f UTF-8 -t //TRANSLIT) 2>/dev/null <\"\$2\")" ||
+ eval "$1=\$( (iconv -f UTF-8) 2>/dev/null <\"\$2\")"
}; } ||
- eval "$1=\`cat <\"\$2\"\`" || {
+ eval "$1=\$(cat <\"\$2\")" || {
say >&2 "$0: time zone files are not set up correctly"
exit 1
}
@@ -403,7 +390,7 @@ while
echo >&2 \
'Please select a continent, ocean, "coord", "TZ", "time", or "now".'
- quoted_continents=`
+ quoted_continents=$(
$AWK '
function handle_entry(entry) {
entry = substr(entry, 1, index(entry, "/") - 1)
@@ -433,12 +420,12 @@ while
sort -u |
tr '\n' ' '
echo ''
- `
+ )
eval '
doselect '"$quoted_continents"' \
"coord - I want to use geographical coordinates." \
- "TZ - I want to specify the timezone using a POSIX.1-2017 TZ string." \
+ "TZ - I want to specify the timezone using a proleptic TZ string." \
"time - I know local time already." \
"now - Like \"time\", but configure only for timestamps from now on."
continent=$select_result
@@ -462,16 +449,17 @@ while
case $continent in
TZ)
- # Ask the user for a POSIX.1-2017 TZ string. Check that it conforms.
+ # Ask the user for a proleptic TZ string. Check that it conforms.
check_POSIX_TZ_string='
BEGIN {
tz = substr(ARGV[1], 2)
ARGV[1] = ""
tzname = ("(<[[:alnum:]+-][[:alnum:]+-][[:alnum:]+-]+>" \
"|[[:alpha:]][[:alpha:]][[:alpha:]]+)")
- time = ("(2[0-4]|[0-1]?[0-9])" \
- "(:[0-5][0-9](:[0-5][0-9])?)?")
- offset = "[-+]?" time
+ sign = "[-+]?"
+ hhmm = "(:[0-5][0-9](:[0-5][0-9])?)?"
+ offset = sign "(2[0-4]|[0-1]?[0-9])" hhmm
+ time = sign "(16[0-7]|(1[0-5]|[0-9]?)[0-9])" hhmm
mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
jdate = ("((J[1-9]|[0-9]|J?[1-9][0-9]" \
"|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])")
@@ -492,7 +480,7 @@ while
read tz
$AWK "$check_POSIX_TZ_string" ="$tz"
do
- say >&2 "'$tz' is not a conforming POSIX.1-2017 timezone string."
+ say >&2 "'$tz' is not a conforming POSIX proleptic TZ string."
done
TZ_for_date=$tz;;
*)
@@ -507,14 +495,14 @@ while
'74 degrees 3 minutes west.'
read coord
esac
- distance_table=`
+ distance_table=$(
$AWK \
"$output_distances_or_times" \
="$coord" ="$TZ_COUNTRY_TABLE" ="$TZ_ZONE_TABLE" |
sort -n |
$AWK "{print} NR == $location_limit { exit }"
- `
- regions=`
+ )
+ regions=$(
$AWK '
BEGIN {
distance_table = substr(ARGV[1], 2)
@@ -526,13 +514,13 @@ while
}
}
' ="$distance_table"
- `
+ )
echo >&2 'Please select one of the following timezones,'
echo >&2 'listed roughly in increasing order' \
"of distance from $coord".
doselect $regions
region=$select_result
- tz=`
+ tz=$(
$AWK '
BEGIN {
distance_table = substr(ARGV[1], 2)
@@ -546,22 +534,22 @@ while
}
}
' ="$distance_table" ="$region"
- `;;
+ );;
*)
case $continent in
now|time)
minute_format='%a %b %d %H:%M'
- old_minute=`TZ=UTC0 date +"$minute_format"`
+ old_minute=$(TZ=UTC0 date +"$minute_format")
for i in 1 2 3
do
- time_table_command=`
+ time_table_command=$(
$AWK \
-v output_times=1 \
"$output_distances_or_times" \
= = ="$TZ_ZONE_TABLE"
- `
- time_table=`eval "$time_table_command"`
- new_minute=`TZ=UTC0 date +"$minute_format"`
+ )
+ time_table=$(eval "$time_table_command")
+ new_minute=$(TZ=UTC0 date +"$minute_format")
case $old_minute in
"$new_minute") break
esac
@@ -569,11 +557,11 @@ while
done
echo >&2 "The system says Universal Time is $new_minute."
echo >&2 "Assuming that's correct, what is the local time?"
- sorted_table=`say "$time_table" | sort -k2n -k2,5 -k1n` || {
+ sorted_table=$(say "$time_table" | sort -k2n -k2,5 -k1n) || {
say >&2 "$0: cannot sort time table"
exit 1
}
- eval doselect `
+ eval doselect $(
$AWK '
BEGIN {
sorted_table = substr(ARGV[1], 2)
@@ -590,10 +578,10 @@ while
}
}
' ="$sorted_table"
- `
+ )
time=$select_result
continent_re='^'
- zone_table=`
+ zone_table=$(
$AWK '
BEGIN {
time = substr(ARGV[1], 2)
@@ -609,13 +597,13 @@ while
}
}
' ="$time" ="$time_table"
- `
- countries=`
+ )
+ countries=$(
$AWK \
"$output_country_list" \
="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
sort -f
- `
+ )
;;
*)
continent_re="^$continent/"
@@ -623,16 +611,16 @@ while
esac
# Get list of names of countries in the continent or ocean.
- countries=`
+ countries=$(
$AWK \
"$output_country_list" \
="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
sort -f
- `
+ )
# If all zone table entries have comments, and there are
# at most 22 entries, asked based on those comments.
# This fits the prompt onto old-fashioned 24-line screens.
- regions=`
+ regions=$(
$AWK '
BEGIN {
TZ_ZONE_TABLE = substr(ARGV[1], 2)
@@ -653,7 +641,7 @@ while
print comment[i]
}
' ="$zone_table"
- `
+ )
# If there's more than one country, ask the user which one.
case $countries in
@@ -669,7 +657,7 @@ while
# Get list of timezones in the country.
- regions=`
+ regions=$(
$AWK '
BEGIN {
country = substr(ARGV[1], 2)
@@ -696,7 +684,7 @@ while
}
}
' ="$country" ="$TZ_COUNTRY_TABLE" ="$zone_table"
- `
+ )
# If there's more than one region, ask the user which one.
case $regions in
@@ -707,7 +695,7 @@ while
esac
# Determine tz from country and region.
- tz=`
+ tz=$(
$AWK '
BEGIN {
country = substr(ARGV[1], 2)
@@ -735,7 +723,7 @@ while
}
}
' ="$country" ="$region" ="$TZ_COUNTRY_TABLE" ="$zone_table"
- `
+ )
esac
# Make sure the corresponding zoneinfo file exists.
@@ -754,14 +742,11 @@ while
extra_info=
for i in 1 2 3 4 5 6 7 8
do
- TZdate=`LANG=C TZ="$TZ_for_date" date`
- UTdate=`LANG=C TZ=UTC0 date`
- if $AWK '
- function getsecs(d) {
- return match(d, /.*:[0-5][0-9]/) ? substr(d, RLENGTH - 1, 2) : ""
- }
- BEGIN { exit getsecs(ARGV[1]) != getsecs(ARGV[2]) }
- ' ="$TZdate" ="$UTdate"
+ TZdate=$(LANG=C TZ="$TZ_for_date" date)
+ UTdate=$(LANG=C TZ=UTC0 date)
+ TZsecsetc=${TZdate##*[0-5][0-9]:}
+ UTsecsetc=${UTdate##*[0-5][0-9]:}
+ if test "${TZsecsetc%%[!0-9]*}" = "${UTsecsetc%%[!0-9]*}"
then
extra_info="
Selected time is now: $TZdate.
@@ -801,7 +786,7 @@ done
case $SHELL in
*csh) file=.login line="setenv TZ '$tz'";;
-*) file=.profile line="TZ='$tz'; export TZ"
+*) file=.profile line="export TZ='$tz'"
esac
test -t 1 && say >&2 "
diff --git a/tz/workman.sh b/tz/workman.sh
index 6e2da3a..29f317c 100644
--- a/tz/workman.sh
+++ b/tz/workman.sh
@@ -7,8 +7,7 @@
if (type nroff && type perl) >/dev/null 2>&1; then
# Tell groff not to emit SGR escape sequences (ANSI color escapes).
- GROFF_NO_SGR=1
- export GROFF_NO_SGR
+ export GROFF_NO_SGR=1
echo ".am TH
.hy 0
diff --git a/tz/zdump.8 b/tz/zdump.8
index c3f0bba..38dd861 100644
--- a/tz/zdump.8
+++ b/tz/zdump.8
@@ -152,7 +152,8 @@ tabbed columns line up.)
.nf
.sp
.if \n(.g .ft CR
-.in +2
+.if t .in +.5i
+.if n .in +2
.nr w \w'1896-01-13 'u+\n(.i
.ta \w'1896-01-13\0\0'u +\w'12:01:26\0\0'u +\w'-103126\0\0'u +\w'HWT\0\0'u
TZ="Pacific/Honolulu"
diff --git a/tz/zdump.c b/tz/zdump.c
index 7d99cc7..e817873 100644
--- a/tz/zdump.c
+++ b/tz/zdump.c
@@ -89,7 +89,7 @@ static bool warned;
static bool errout;
static char const *abbr(struct tm const *);
-ATTRIBUTE_REPRODUCIBLE static intmax_t delta(struct tm *, struct tm *);
+static intmax_t delta(struct tm *, struct tm *);
static void dumptime(struct tm const *);
static time_t hunt(timezone_t, time_t, time_t, bool);
static void show(timezone_t, char *, time_t, bool);
@@ -97,7 +97,7 @@ static void showextrema(timezone_t, char *, time_t, struct tm *, time_t);
static void showtrans(char const *, struct tm const *, time_t, char const *,
char const *);
static const char *tformat(void);
-ATTRIBUTE_REPRODUCIBLE static time_t yeartot(intmax_t);
+ATTRIBUTE_PURE_114833 static time_t yeartot(intmax_t);
/* Is C an ASCII digit? */
static bool
@@ -134,7 +134,7 @@ size_overflow(void)
/* Return A + B, exiting if the result would overflow either ptrdiff_t
or size_t. A and B are both nonnegative. */
-ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
+ATTRIBUTE_PURE_114833 static ptrdiff_t
sumsize(ptrdiff_t a, ptrdiff_t b)
{
#ifdef ckd_add
@@ -162,7 +162,7 @@ xstrsize(char const *str)
/* Return a pointer to a newly allocated buffer of size SIZE, exiting
on failure. SIZE should be positive. */
-ATTRIBUTE_MALLOC static void *
+static void *
xmalloc(ptrdiff_t size)
{
void *p = malloc(size);
@@ -932,7 +932,7 @@ showextrema(timezone_t tz, char *zone, time_t lo, struct tm *lotmp, time_t hi)
# include
/* A substitute for snprintf that is good enough for zdump. */
-ATTRIBUTE_FORMAT((printf, 3, 4)) static int
+static int
my_snprintf(char *s, size_t size, char const *format, ...)
{
int n;
diff --git a/tz/zic.8 b/tz/zic.8
index 0ad373a..00e2536 100644
--- a/tz/zic.8
+++ b/tz/zic.8
@@ -171,7 +171,7 @@ boundaries, particularly if
causes a TZif file to contain explicit entries for
.RI pre- hi
transitions rather than concisely representing them
-with an extended POSIX.1-2017 TZ string.
+with a proleptic TZ string.
Also see the
.B "\*-b slim"
option for another way to shrink output size.
@@ -181,10 +181,10 @@ Generate redundant trailing explicit transitions for timestamps
that occur less than
.I hi
seconds since the Epoch, even though the transitions could be
-more concisely represented via the extended POSIX.1-2017 TZ string.
+more concisely represented via the proleptic TZ string.
This option does not affect the represented timestamps.
Although it accommodates nonstandard TZif readers
-that ignore the extended POSIX.1-2017 TZ string,
+that ignore the proleptic TZ string,
it increases the size of the altered output files.
.TP
.BI "\*-t " file
@@ -245,10 +245,10 @@ for
.PP
The output file does not contain all the information about the
long-term future of a timezone, because the future cannot be summarized as
-an extended POSIX.1-2017 TZ string. For example, as of 2023 this problem
+a proleptic TZ string. For example, as of 2023 this problem
occurs for Morocco's daylight-saving rules, as these rules are based
on predictions for when Ramadan will be observed, something that
-an extended POSIX.1-2017 TZ string cannot represent.
+a proleptic TZ string cannot represent.
.PP
The output contains data that may not be handled properly by client
code designed for older
@@ -558,12 +558,14 @@ begin the field with a minus sign if time must be subtracted from UT.
.TP
.B RULES
The name of the rules that apply in the timezone or,
-alternatively, a field in the same format as a rule-line SAVE column,
+alternatively, a field in the same format as a rule-line
+.B SAVE
+field,
giving the amount of time to be added to local standard time
and whether the resulting time is standard or daylight saving.
-If this field is
+Standard time applies if this field is
.B \*-
-then standard time always applies.
+or for timestamps occurring before any rule takes effect.
When an amount of time is given, only the sum of standard time and
this amount matters.
.TP
@@ -571,9 +573,13 @@ this amount matters.
The format for time zone abbreviations.
The pair of characters
.B %s
-is used to show where the
-.q "variable part"
-of the time zone abbreviation goes.
+shows where to put the time zone abbreviation's variable part,
+which is taken from the
+.B LETTER/S
+field of the corresponding rule;
+any timestamps that precede the earliest rule use the
+.B LETTER/S
+of the earliest standard-time rule (which in this case must exist).
Alternatively, a format can use the pair of characters
.B %z
to stand for the UT offset in the form
@@ -663,7 +669,7 @@ Rule US 1967 1973 - Apr lastSun 2:00 1:00 D
.ta \w'# Zone\0\0'u +\w'America/Menominee\0\0'u +\w'STDOFF\0\0'u +\w'RULES\0\0'u +\w'FORMAT\0\0'u
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Menominee \*-5:00 \*- EST 1973 Apr 29 2:00
- \*-6:00 US C%sT
+ \*-6:00 US C%sT
.sp
.in
.fi
@@ -767,16 +773,16 @@ or
if the leap second time given by the other fields should be interpreted as
local (wall clock) time.
.PP
-Rolling leap seconds were implemented back when it was not
-clear whether common practice was rolling or stationary,
-with concerns that one would see
+Rolling leap seconds would let one see
Times Square ball drops where there'd be a
.q "3... 2... 1... leap... Happy New Year"
countdown, placing the leap second at
midnight New York time rather than midnight UTC.
-However, this countdown style does not seem to have caught on,
-which means rolling leap seconds are not used in practice;
-also, they are not supported if the
+Although stationary leap seconds are the common practice,
+rolling leap seconds can be useful in specialized applications
+like SMPTE timecodes that may prefer to put leap second
+discontinuities at the end of a local broadcast day.
+However, rolling leap seconds are not supported if the
.B \*-r
option is used.
.PP
diff --git a/tz/zic.c b/tz/zic.c
index 00f00e3..cf8e79d 100644
--- a/tz/zic.c
+++ b/tz/zic.c
@@ -470,7 +470,7 @@ size_overflow(void)
memory_exhausted(_("size overflow"));
}
-ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
+ATTRIBUTE_PURE_114833 static ptrdiff_t
size_sum(size_t a, size_t b)
{
#ifdef ckd_add
@@ -484,7 +484,7 @@ size_sum(size_t a, size_t b)
size_overflow();
}
-ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
+ATTRIBUTE_PURE_114833 static ptrdiff_t
size_product(ptrdiff_t nitems, ptrdiff_t itemsize)
{
#ifdef ckd_mul
@@ -499,7 +499,7 @@ size_product(ptrdiff_t nitems, ptrdiff_t itemsize)
size_overflow();
}
-ATTRIBUTE_REPRODUCIBLE static ptrdiff_t
+ATTRIBUTE_PURE_114833 static ptrdiff_t
align_to(ptrdiff_t size, ptrdiff_t alignment)
{
ptrdiff_t lo_bits = alignment - 1, sum = size_sum(size, lo_bits);
@@ -523,7 +523,7 @@ memcheck(void *ptr)
return ptr;
}
-ATTRIBUTE_MALLOC static void *
+static void *
emalloc(size_t size)
{
return memcheck(malloc(size));
@@ -535,7 +535,7 @@ erealloc(void *ptr, size_t size)
return memcheck(realloc(ptr, size));
}
-ATTRIBUTE_MALLOC static char *
+static char *
estrdup(char const *str)
{
return memcheck(strdup(str));
@@ -1435,7 +1435,7 @@ relname(char const *target, char const *linkname)
/* Return true if A and B must have the same parent dir if A and B exist.
Return false if this is not necessarily true (though it might be true).
Keep it simple, and do not inspect the file system. */
-static bool
+ATTRIBUTE_PURE_114833 static bool
same_parent_dirs(char const *a, char const *b)
{
for (; *a == *b; a++, b++)
@@ -2982,10 +2982,10 @@ rule_cmp(struct rule const *a, struct rule const *b)
return a->r_dayofmonth - b->r_dayofmonth;
}
-/* Store into RESULT a POSIX.1-2017 TZ string that represent the future
+/* Store into RESULT a proleptic TZ string that represent the future
predictions for the zone ZPFIRST with ZONECOUNT entries. Return a
compatibility indicator (a TZDB release year) if successful, a
- negative integer if no such TZ string exissts. */
+ negative integer if no such TZ string exists. */
static int
stringzone(char *result, struct zone const *zpfirst, ptrdiff_t zonecount)
{
@@ -3177,8 +3177,7 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
if (noise) {
if (!*envvar)
warning("%s %s",
- _("no POSIX.1-2017 environment variable"
- " for zone"),
+ _("no proleptic TZ string for zone"),
zpfirst->z_name);
else if (compat != 0) {
/* Circa-COMPAT clients, and earlier clients, might
@@ -3442,7 +3441,7 @@ outzone(const struct zone *zpfirst, ptrdiff_t zonecount)
if (do_extend) {
/*
** If we're extending the explicitly listed observations for
- ** 400 years because we can't fill the POSIX.1-2017 TZ field,
+ ** 400 years because we can't fill the proleptic TZ field,
** check whether we actually ended up explicitly listing
** observations through that period. If there aren't any
** near the end of the 400-year period, add a redundant
@@ -3627,7 +3626,7 @@ lowerit(char a)
}
/* case-insensitive equality */
-ATTRIBUTE_REPRODUCIBLE static bool
+ATTRIBUTE_PURE_114833 static bool
ciequal(register const char *ap, register const char *bp)
{
while (lowerit(*ap) == lowerit(*bp++))
@@ -3636,7 +3635,7 @@ ciequal(register const char *ap, register const char *bp)
return false;
}
-ATTRIBUTE_REPRODUCIBLE static bool
+ATTRIBUTE_PURE_114833 static bool
itsabbr(register const char *abbr, register const char *word)
{
if (lowerit(*abbr) != lowerit(*word))
@@ -3652,7 +3651,7 @@ itsabbr(register const char *abbr, register const char *word)
/* Return true if ABBR is an initial prefix of WORD, ignoring ASCII case. */
-ATTRIBUTE_REPRODUCIBLE static bool
+ATTRIBUTE_PURE_114833 static bool
ciprefix(char const *abbr, char const *word)
{
do
@@ -3762,7 +3761,7 @@ time_overflow(void)
exit(EXIT_FAILURE);
}
-ATTRIBUTE_REPRODUCIBLE static zic_t
+ATTRIBUTE_PURE_114833 static zic_t
oadd(zic_t t1, zic_t t2)
{
#ifdef ckd_add
@@ -3776,7 +3775,7 @@ oadd(zic_t t1, zic_t t2)
time_overflow();
}
-ATTRIBUTE_REPRODUCIBLE static zic_t
+ATTRIBUTE_PURE_114833 static zic_t
tadd(zic_t t1, zic_t t2)
{
#ifdef ckd_add
diff --git a/tz/ziguard.awk b/tz/ziguard.awk
index 7a3404f..c0acb72 100644
--- a/tz/ziguard.awk
+++ b/tz/ziguard.awk
@@ -5,14 +5,10 @@
# This is not a general-purpose converter; it is designed for current tzdata.
# It just converts from current source to main, vanguard, and rearguard forms.
# Although it might be nice for it to be idempotent, or to be useful
-# for converting back and forth between vanguard and rearguard formats,
+# for converting back and forth between formats,
# it does not do these nonessential tasks now.
#
-# Although main and vanguard forms are currently equivalent,
-# this need not always be the case. When the two forms differ,
-# this script can convert either from main to vanguard form (needed then),
-# or from vanguard to main form (this conversion would be needed later,
-# after main became rearguard and vanguard became main).
+# This script can convert from main to vanguard form and vice versa.
# There is no need to convert rearguard to other forms.
#
# When converting to vanguard form, the output can use the line
@@ -145,12 +141,12 @@ DATAFORM != "main" {
}
# If this line should differ due to Portugal benefiting from %z if supported,
- # uncomment the desired version and comment out the undesired one.
- if ($0 ~ /^#?[\t ]+-[12]:00[\t ]+Port[\t ]+[%+-]/) {
- if (($0 ~ /%z/) == (DATAFORM == "vanguard")) {
- uncomment = in_comment
- } else {
+ # comment out the undesired version and uncomment the desired one.
+ if ($0 ~ /^#?[\t ]+-[12]:00[\t ]+((Port|W-Eur)[\t ]+[%+-]|-[\t ]+(%z|-01)[\t ]+1982 Mar 28)/) {
+ if (($0 ~ /%z/) == (DATAFORM == "rearguard")) {
comment_out = !in_comment
+ } else {
+ uncomment = in_comment
}
}
@@ -172,13 +168,8 @@ DATAFORM != "main" {
sub(/^/, "#")
}
- # Prefer %z in vanguard form, explicit abbreviations otherwise.
- if (DATAFORM == "vanguard") {
- sub(/^(Zone[\t ]+[^\t ]+)?[\t ]+[^\t ]+[\t ]+[^\t ]+[\t ]+[-+][^\t ]+/, \
- "&CHANGE-TO-%z")
- sub(/-00CHANGE-TO-%z/, "-00")
- sub(/[-+][^\t ]+CHANGE-TO-/, "")
- } else {
+ # Prefer explicit abbreviations in rearguard form, %z otherwise.
+ if (DATAFORM == "rearguard") {
if ($0 ~ /^[^#]*%z/) {
stdoff_column = 2 * ($0 ~ /^Zone/) + 1
rules_column = stdoff_column + 1
@@ -216,6 +207,11 @@ DATAFORM != "main" {
}
sub(/%z/, abbr)
}
+ } else {
+ sub(/^(Zone[\t ]+[^\t ]+)?[\t ]+[^\t ]+[\t ]+[^\t ]+[\t ]+[-+][^\t ]+/, \
+ "&CHANGE-TO-%z")
+ sub(/-00CHANGE-TO-%z/, "-00")
+ sub(/[-+][^\t ]+CHANGE-TO-/, "")
}
# Normally, prefer whole seconds. However, prefer subseconds
diff --git a/tz/zone.tab b/tz/zone.tab
index 3fa9306..bfc0b59 100644
--- a/tz/zone.tab
+++ b/tz/zone.tab
@@ -264,8 +264,7 @@ MK +4159+02126 Europe/Skopje
ML +1239-00800 Africa/Bamako
MM +1647+09610 Asia/Yangon
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
-MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
-MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
+MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs
MO +221150+1133230 Asia/Macau
MP +1512+14545 Pacific/Saipan
MQ +1436-06105 America/Martinique
diff --git a/tz/zone1970.tab b/tz/zone1970.tab
index abd9489..7726f39 100644
--- a/tz/zone1970.tab
+++ b/tz/zone1970.tab
@@ -209,8 +209,7 @@ MD +4700+02850 Europe/Chisinau
MH +0905+16720 Pacific/Kwajalein Kwajalein
MM,CC +1647+09610 Asia/Yangon
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
-MN +4801+09139 Asia/Hovd Bayan-Ölgii, Govi-Altai, Hovd, Uvs, Zavkhan
-MN +4804+11430 Asia/Choibalsan Dornod, Sükhbaatar
+MN +4801+09139 Asia/Hovd Bayan-Ölgii, Hovd, Uvs
MO +221150+1133230 Asia/Macau
MQ +1436-06105 America/Martinique
MT +3554+01431 Europe/Malta
diff --git a/tz/zonenow.tab b/tz/zonenow.tab
index b6f2910..01f536b 100644
--- a/tz/zonenow.tab
+++ b/tz/zonenow.tab
@@ -5,7 +5,7 @@
# From Paul Eggert (2023-12-18):
# This file contains a table where each row stands for a timezone
# where civil timestamps are predicted to agree from now on.
-# This file is like zone1970.tab (see zone1970.tab's coments),
+# This file is like zone1970.tab (see zone1970.tab's comments),
# but with the following changes:
#
# 1. Each timezone corresponds to a set of clocks that are planned
@@ -123,8 +123,6 @@ XX +1455-02331 Atlantic/Cape_Verde Cape Verde
#
# -01/+00 (EU DST)
XX +3744-02540 Atlantic/Azores Azores
-# -01/+00 (EU DST) until 2024-03-31; then -02/-01 (EU DST)
-XX +7029-02158 America/Scoresbysund Ittoqqortoormiit
#
# +00 - GMT
XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT")
@@ -199,7 +197,7 @@ XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion
XX +3431+06912 Asia/Kabul Afghanistan
#
# +05
-XX +4120+06918 Asia/Tashkent Russia; west Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives
+XX +4120+06918 Asia/Tashkent Russia; Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives
#
# +05 - PKT
XX +2452+06703 Asia/Karachi Pakistan ("PKT")
@@ -215,8 +213,6 @@ XX +2743+08519 Asia/Kathmandu Nepal
#
# +06
XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos
-# +06 until 2024-03-01; then +05
-XX +4315+07657 Asia/Almaty Kazakhstan (except western areas)
#
# +06:30
XX +1647+09610 Asia/Yangon Myanmar; Cocos