Home | History | Annotate | Download | only in time
History log of /src/lib/libc/time/private.h
RevisionDateAuthorComments
 1.71  23-Jan-2025  christos update to 2025a

Changes to code

strftime %s now generates the correct numeric string even when the
represented number does not fit into time_t. This is better than
generating the numeric equivalent of (time_t) -1, as strftime did
in TZDB releases 96a (when %s was introduced) through 2020a and in
releases 2022b through 2024b. It is also better than failing and
returning 0, as strftime did in releases 2020b through 2022a.

strftime now outputs an invalid conversion specifier as-is,
instead of eliding the leading '%', which confused debugging.

An invalid TZ now generates the time zone abbreviation "-00", not
"UTC", to help the user see that an error has occurred. (Thanks
to Arthur David Olson for suggesting a "wrong result".)

mktime and timeoff no longer incorrectly fail merely because a
struct tm component near INT_MIN or INT_MAX overflows when a
lower-order component carries into it.

TZNAME_MAXIMUM, the maximum number of bytes in a proleptic TZ
string's time zone abbreviation, now defaults to 254 not 255.
This helps reduce the size of internal state from 25480 to 21384
on common platforms. This change should not be a problem, as
nobody uses such long "abbreviations" and the longstanding tzcode
maximum was 16 until release 2023a. For those who prefer no
arbitrary limits, you can now specify TZNAME_MAXIMUM values up to
PTRDIFF_MAX, a limit forced by C anyway; formerly tzcode silently
misbehaved unless TZNAME_MAXIMUM was less than INT_MAX.

tzset and related functions no longer leak a file descriptor if
another thread forks or execs at about the same time and if the
platform has O_CLOFORK and O_CLOEXEC respectively. Also, the
functions no longer let a TZif file become a controlling terminal.

'zdump -' now reads TZif data from /dev/stdin.
(From a question by Arthur David Olson.)
 1.70  11-Sep-2024  christos Merge tzcode-2024b

Release 2024b - 2024-09-04 12:27:47 -0700

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.)
 1.69  17-Feb-2024  christos Sync with tzcode2024a:
Release 2024a - 2024-02-01 09:28:56 -0800

Changes to code

The FROM and TO columns of Rule lines can no longer be "minimum"
or an abbreviation of "minimum", because TZif files do not support
DST rules that extend into the indefinite past - although these
rules were supported when TZif files had only 32-bit data, this
stopped working when 64-bit TZif files were introduced in 1995.
This should not be a problem for realistic data, since DST was
first used in the 20th century. As a transition aid, FROM columns
like "minimum" are now diagnosed and then treated as if they were
the year 1900; this should suffice for TZif files on old systems
with only 32-bit time_t, and it is more compatible with bugs in
2023c-and-earlier localtime.c. (Problem reported by Yoshito
Umaoka.)

localtime and related functions no longer mishandle some
timestamps that occur about 400 years after a switch to a time
zone with a DST schedule. In 2023d data this problem was visible
for some timestamps in November 2422, November 2822, etc. in
America/Ciudad_Juarez. (Problem reported by Gilmore Davidson.)

strftime %s now uses tm_gmtoff if available. (Problem and draft
patch reported by Dag-Erling Smørgrav.)

Changes to build procedure

The leap-seconds.list file is now copied from the IERS instead of
from its downstream counterpart at NIST, as the IERS version is
now in the public domain too and tends to be more up-to-date.
(Thanks to Martin Burnicki for liaisoning with the IERS.)

Changes to documentation

The strftime man page documents which struct tm members affect
which conversion specs, and that tzset is called. (Problems
reported by Robert Elz and Steve Summit.)
 1.68  20-Jan-2024  christos Catch up with all the lint warnings since exit on warning was disabled.
Disable 'missing header declaration' and 'nested extern' warnings for now.
 1.67  23-Dec-2023  christos Import tzcode 2023d:

localtime.c no longer mishandles TZif files that contain a single
transition into a DST regime. Previously, it incorrectly assumed
DST was in effect before the transition too. (Thanks to Alois
Treindl for debugging help.)

localtime.c's timeoff no longer collides with OpenBSD 7.4.

The C code now uses _Generic only if __STDC_VERSION__ says the
compiler is C11 or later.

tzselect now optionally reads zonenow.tab, to simplify when
configuring only for timestamps dated from now on.

tzselect no longer creates temporary files.

tzselect no longer mishandles the following:

Spaces and most other special characters in BUGEMAIL, PACKAGE,
TZDIR, and VERSION.

TZ strings when using mawk 1.4.3, which mishandles regular
expressions of the form /X{2,}/.

ISO 6709 coordinates when using an awk that lacks the GNU
extension of newlines in -v option-arguments.

Non UTF-8 locales when using an iconv command that lacks the GNU
//TRANSLIT extension.

zic no longer mishandles data for Palestine after the year 2075.
Previously, it incorrectly omitted post-2075 transitions that are
predicted for just before and just after Ramadan. (Thanks to Ken
Murchison for debugging help.)

zic now works again on Linux 2.6.16 and 2.6.17 (2006).
 1.66  16-Sep-2023  christos Update tzcode from 2022g to 2023c:

Release 2023c - 2023-03-28 12:42:14 -0700

Release 2023b - 2023-03-23 19:50:38 -0700

Release 2023a - 2023-03-22 12:39:33 -0700

Changes to code

You can now tell tzselect local time, to simplify later choices.
Select the 'time' option in its first prompt.

You can now compile with -DTZNAME_MAXIMUM=N to limit time zone
abbreviations to N bytes (default 255). The reference runtime
library now rejects POSIX-style TZ strings that contain longer
abbreviations, treating them as UTC. Previously the limit was
platform dependent and abbreviations were silently truncated to
16 bytes even when the limit was greater than 16.

The code by default is now designed for C99 or later. To build in
a C89 environment, compile with -DPORT_TO_C89. To support C89
callers of the tzcode library, compile with -DSUPPORT_C89. The
two new macros are transitional aids planned to be removed in a
future version, when C99 or later will be required.

The code now builds again on pre-C99 platforms, if you compile
with -DPORT_TO_C89. This fixes a bug introduced in 2022f.

On C23-compatible platforms tzcode no longer uses syntax like
'static [[noreturn]] void usage(void);'. Instead, it uses
'[[noreturn]] static void usage(void);' as strict C23 requires.
(Problem reported by Houge Langley.)

The code's functions now constrain their arguments with the C
'restrict' keyword consistently with their documentation.
This may allow future optimizations.

zdump again builds standalone with ckdadd and without setenv,
fixing a bug introduced in 2022g. (Problem reported by panic.)

leapseconds.awk can now process a leap seconds file that never
expires; this might be useful if leap seconds are discontinued.

Changes to commentary

tz-link.html has a new section "Coordinating with governments and
distributors". (Thanks to Neil Fuller for some of the text.)

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.
 1.65  15-Jan-2023  christos Apply 9cfe9507fcc22cd4a0c4da486ea1c7f0de6b075f for C23 attribute compliance.
Requested by Jan-Benedict Glaw.
 1.64  11-Dec-2022  christos branches: 1.64.2;
Merge in 2022g:

Although tzcode still works with C89, bugs found in recent routine
maintenance indicate that bitrot has set in and that in practice
C89 is no longer used to build tzcode. As it is a maintenance
burden, support for C89 is planned to be removed soon. Instead,
please use compilers compatible with C99, C11, C17, or C23.

timegm, which tzcode implemented in 1989, will finally be
standardized 34 years later as part of C23, so timegm is now
supported even if STD_INSPIRED is not defined.

Fix bug in zdump's tzalloc emulation on hosts that lack tm_zone.
(Problem reported by Đoàn Trần Công Danh.)

Fix bug in zic on hosts where malloc(0) yields NULL on success.
(Problem reported by Tim McBrayer for AIX 6.1.)

Fix zic configuration to avoid linkage failures on some platforms.
(Problems reported by Gilmore Davidson and Igor Ivanov.)

Work around MS-Windows nmake incompatibility with POSIX.
(Problem reported by Manuela Friedrich.)

Port mktime and strftime to debugging platforms where accessing
uninitialized data has undefined behavior (strftime problem
reported by Robert Elz).

Check more carefully for unlikely integer overflows, preferring
C23 <stdckdint.h> to overflow checking by hand, as the latter has
had obscure bugs.
 1.63  17-Nov-2022  jakllsch Simply set HAVE_GETRANDOM to false on __APPLE__.

Addresses PR 57083.
 1.62  16-Nov-2022  christos PR/57083: Jiaxun Yang: Fix build on MacOS/X which has <sys/random.h> but no
getrandom(3).
 1.61  29-Oct-2022  christos Update to tzcode2022f

Changes to code

zic now supports links to links regardless of input line order.
For example, if Australia/Sydney is a Zone, the lines
Link Australia/Canberra Australia/ACT
Link Australia/Sydney Australia/Canberra
now work correctly, even though the shell commands
ln Australia/Canberra Australia/ACT
ln Australia/Sydney Australia/Canberra
would fail because the first command attempts to use a link
Australia/Canberra that does not exist until after the second
command is executed. Previously, zic had unspecified behavior if
a Link line's target was another link, and zic often misbehaved if
a Link line's target was a later Link line.

Fix line number in zic's diagnostic for a link to a link.

Fix a bug that caused localtime to mishandle timestamps starting
in the year 2438 when reading data generated by 'zic -b fat' when
distant-future DST transitions occur at times given in standard
time or in UT, not the usual case of local time. This occurs when
the corresponding .zi Rule lines specify DST transitions with TO
columns of 'max' and AT columns that end in 's' or 'u'. The
number 2438 comes from the 32-bit limit in the year 2038, plus the
400-year Gregorian cycle. (Problem reported by Bradley White.)

On glibc 2.34 and later, which optionally supports 64-bit time_t
on platforms like x86 where time_t was traditionally 32 bits,
default time_t to 64 instead of 32 bits. This lets functions like
localtime support timestamps after the year 2038, and fixes
year-2038 problems in zic when accessing files dated after 2038.
To continue to limit time_t to 32 bits on these platforms, use
"make CFLAGS='-D_TIME_BITS=32'".

In C code, do not enable large-file support on platforms like AIX
and macOS that no longer need it now that tzcode does not use
off_t or related functions like 'stat'. Large-file support is
still enabled by default on GNU/Linux, as it is needed for 64-bit
time_t support.

In C code, prefer C23 keywords to pre-C23 macros for alignof,
bool, false, and true. Also, use the following C23 features if
available: __has_include, unreachable.

zic no longer works around Qt bug 53071, as the relevant Qt
releases have been out of support since 2019. This change affects
only fat TZif files, as thin files never had the workaround.

zdump no longer modifies the environ vector when compiled on
platforms lacking tm_zone or when compiled with -DUSE_LTZ=0.
This avoid undefined behavior on POSIX platforms.
 1.60  16-Aug-2022  christos Welcome to tzcode-2022c

Work around a bug in onetrueawk that broke commands like
'make traditional_tarballs' on FreeBSD, macOS, etc.
(Problem reported by Deborah Goldsmith.)

Add code to tzselect that uses experimental structured comments in
zone1970.tab to clarify whether Zones like Africa/Abidjan and
Europe/Istanbul cross continent or ocean boundaries.
(Inspired by a problem reported by Peter Krefting.)

Fix bug with 'zic -d /a/b/c' when /a is unwritable but the
directory /a/b already exists.

Remove zoneinfo2tdf.pl, as it was unused and triggered false
malware alarms on some email servers.
 1.59  16-Aug-2022  christos Welcome to 2022b:

zic has a new option '-R @N' to output explicit transitions < N.
(Need suggested by Almaz Mingaleev.)

'zic -r @N' no longer outputs bad data when N < first transition.
(Problem introduced in 2021d and reported by Peter Krefting.)

zic now checks its input for NUL bytes and unterminated lines, and
now supports input line lengths up to 2048 (not 512) bytes.

gmtime and related code now use the abbreviation "UTC" not "GMT".
POSIX is being revised to require this.

When tzset and related functions set vestigial static variables
like tzname, they now prefer specified timestamps to unspecified ones.
(Problem reported by Almaz Mingaleev.)

zic no longer complains "can't determine time zone abbreviation to
use just after until time" when a transition to a new standard
time occurs simultanously with the first DST fallback transition.
 1.58  22-Mar-2022  christos welcome to tzcode-2022a

Changes to code

Fix bug when mktime gets confused by truncated TZif files with
unspecified local time. (Problem reported by Almaz Mingaleev.)

Fix bug when 32-bit time_t code reads malformed 64-bit TZif data.
(Problem reported by Christos Zoulas.)

When reading a version 2 or later TZif file, the TZif reader now
validates the version 1 header and data block only enough to skip
over them, as recommended by RFC 8536 section 4. Also, the TZif
reader no longer mistakenly attempts to parse a version 1 TZIf
file header as a TZ string.

zdump -v now outputs "(localtime failed)" and "(gmtime failed)"
when local time and UT cannot be determined for a timestamp.
 1.57  22-Oct-2021  christos Change to code and documentation from 2021a -> 2021e

Release 2021e - 2021-10-21 18:41:00 -0700

Changes to code

none


Release 2021d - 2021-10-15 13:48:18 -0700

Changes to code

'zic -r' now uses "-00" time zone abbreviations for intervals
with UT offsets that are unspecified due to -r truncation.
This implements a change in draft Internet RFC 8536bis.


Release 2021c - 2021-10-01 14:21:49 -0700

Changes to code

Fix a bug in 'zic -b fat' that caused old timestamps to be
mishandled in 32-bit-only readers (problem reported by Daniel
Fischer).

Changes to documentation

Distribute the SECURITY file (problem reported by Andreas Radke).


Release 2021b - 2021-09-24 16:23:00 -0700

Changes to maintenance procedure

The new file SECURITY covers how to report security-related bugs.

Several backward-compatibility links have been moved to the
'backward' file. These links, which range from Africa/Addis_Ababa
to Pacific/Saipan, are only for compatibility with now-obsolete
guidelines suggesting an entry for every ISO 3166 code.
The intercontinental convenience links Asia/Istanbul and
Europe/Nicosia have also been moved to 'backward'.

Changes to code

zic now creates each output file or link atomically,
possibly by creating a temporary file and then renaming it.
This avoids races where a TZ setting would temporarily stop
working while zic was installing a replacement file or link.

zic -L no longer omits the POSIX TZ string in its output.
Starting with 2020a, zic -L truncated its output according to the
"Expires" directive or "#expires" comment in the leapseconds file.
The resulting TZif files omitted daylight saving transitions after
the leap second table expired, which led to far less-accurate
predictions of times after the expiry. Although future timestamps
cannot be converted accurately in the presence of leap seconds, it
is more accurate to convert near-future timestamps with a few
seconds error than with an hour error, so zic -L no longer
truncates output in this way.

Instead, when zic -L is given the "Expires" directive, it now
outputs the expiration by appending a no-change entry to the leap
second table. Although this should work well with most TZif
readers, it does not conform to Internet RFC 8536 and some pickier
clients (including tzdb 2017c through 2021a) reject it, so
"Expires" directives are currently disabled by default. To enable
them, set the EXPIRES_LINE Makefile variable. If a TZif file uses
this new feature it is marked with a new TZif version number 4,
a format intended to be documented in a successor to RFC 8536.

zic -L LEAPFILE -r @LO no longer generates an invalid TZif file
that omits leap second information for the range LO..B when LO
falls between two leap seconds A and B. Instead, it generates a
TZif version 4 file that represents the previously-missing
information.

The TZif reader now allows the leap second table to begin with a
correction other than -1 or +1, and to contain adjacent
transitions with equal corrections. This supports TZif version 4.

The TZif reader now lets leap seconds occur less than 28 days
apart. This supports possible future TZif extensions.

Fix bug that caused 'localtime' etc. to crash when TZ was
set to a all-year DST string like "EST5EDT4,0/0,J365/25" that does
not conform to POSIX but does conform to Internet RFC 8536.

Fix another bug that caused 'localtime' etc. to crash when TZ was
set to a POSIX-conforming but unusual TZ string like
"EST5EDT4,0/0,J365/0", where almost all the year is DST.

Fix yet another bug that caused 'localtime' etc. to mishandle slim
TZif files containing leap seconds after the last explicit
transition in the table, or when handling far-future timestamps
in slim TZif files lacking leap seconds.

Fix localtime misbehavior involving positive leap seconds.
This change affects only behavior for "right" system time,
which contains leap seconds, and only if the UT offset is
not a multiple of 60 seconds when a positive leap second occurs.
(No such timezone exists in tzdb, luckily.) Without the fix,
the timestamp was ambiguous during a positive leap second.
With the fix, any seconds occurring after a positive leap second
and within the same localtime minute are counted through 60, not
through 59; their UT offset (tm_gmtoff) is the same as before.
Here is how the fix affects timestamps in a timezone with UT
offset +01:23:45 (5025 seconds) and with a positive leap second at
1972-06-30 23:59:60 UTC (78796800):

time_t without the fix with the fix
78796800 1972-07-01 01:23:45 1972-07-01 01:23:45 (leap second)
78796801 1972-07-01 01:23:45 1972-07-01 01:23:46
...
78796815 1972-07-01 01:23:59 1972-07-01 01:23:60
78796816 1972-07-01 01:24:00 1972-07-01 01:24:00

Fix an unlikely bug that caused 'localtime' etc. to misbehave if
civil time changes a few seconds before time_t wraps around, when
leap seconds are enabled.

Fix bug in zic -r; in some cases, the dummy time type after the
last time transition disagreed with the TZ string, contrary to
Internet RFC 8563 section 3.3.

Fix a bug with 'zic -r @X' when X is a negative leap second that
has a nonnegative correction. Without the fix, the output file
was truncated so that X appeared to be a positive leap second.
Fix a similar, even-less-likely bug when truncating at a positive
leap second that has a nonpositive correction.

zic -r now reports an error if given rolling leap seconds, as this
usage has never generally worked and is evidently unused.

zic now generates a POSIX-conforming TZ string for TZif files
where all-year DST is predicted for the indefinite future.
For example, for all-year Eastern Daylight Time, zic now generates
"XXX3EDT4,0/0,J365/23" where it previously generated
"EST5EDT,0/0,J365/25" or "". (Thanks to Michael Deckers for
noting the possibility of POSIX conformance.)

zic.c no longer requires sys/wait.h (thanks to spazmodius for
noting it wasn't needed).

When reading slim TZif files, zdump no longer mishandles leap
seconds on the rare platforms where time_t counts leap seconds,
fixing a bug introduced in 2014g.

zdump -v now outputs timestamps at boundaries of what localtime
and gmtime can represent, instead of the less-useful timestamps
one day after the minimum and one day before the maximum.
(Thanks to Arthur David Olson for prototype code, and to Manuela
Friedrich for debugging help.)

zdump's -c and -t options are now consistently inclusive for the
lower time bound and exclusive for the upper. Formerly they were
inconsistent. (Confusion noted by Martin Burnicki.)

Changes to build procedure

You can now compile with -DHAVE_MALLOC_ERRNO=0 to port to
non-POSIX hosts where malloc doesn't set errno.
(Problem reported by Jan Engelhardt.)

Changes to documentation

tzfile.5 better matches a draft successor to RFC 8536
<https://datatracker.ietf.org/doc/draft-murchison-rfc8536bis/01/>.
 1.56  25-May-2020  christos Bring in 2020a
 1.55  04-Apr-2019  christos deal with zic that's not part of libc.
 1.54  04-Apr-2019  christos Make strftime_{l,z} re-entrant and always require a non-NULL timezone to be
passed in so that we can use the current timezone in all evaluations (mktime
tzgetname). Reported by Hamilton Slye.
 1.53  19-Oct-2018  christos Update to 2018f:

Changes to code

zic now always generates TZif files where time type 0 is used for
timestamps before the first transition. This simplifies the
reading of TZif files and should not affect behavior of existing
TZif readers because the same set of time types is used; only
their internal indexes may have changed. This affects only the
legacy zones EST5EDT, CST6CDT, MST7MDT, PST8PDT, CET, MET, and
EET, which previously used nonzero types for these timestamps.

Because of the type 0 change, zic no longer outputs a dummy
transition at time -2**59 (before the Big Bang), as clients should
no longer need this to handle historical timestamps correctly.
This reverts a change introduced in 2013d and shrinks most TZif
files by a few bytes.

zic now supports negative time-of-day in Rule and Leap lines, e.g.,
"Rule X min max - Apr lastSun -6:00 1:00 -" means the transition
occurs at 18:00 on the Saturday before the last Sunday in April.
This behavior was documented in 2018a but the code did not
entirely match the documentation.

localtime.c no longer requires at least one time type in TZif
files that lack transitions or have a POSIX-style TZ string. This
future-proofs the code against possible future extensions to the
format that would allow TZif files with POSIX-style TZ strings and
without transitions or time types.

A read-access subscript error in localtime.c has been fixed.
It could occur only in TZif files with timecnt == 0, something that
does not happen in practice now but could happen in future versions.

localtime.c no longer ignores TZif POSIX-style TZ strings that
specify only standard time. Instead, these TZ strings now
override the default time type for timestamps after the last
transition (or for all time stamps if there are no transitions),
just as DST strings specifying DST have always done.

leapseconds.awk now outputs "#updated" and "#expires" comments,
and supports leap seconds at the ends of months other than June
and December. (Inspired by suggestions from Chris Woodbury.)

Changes to documentation

New restrictions: A Rule name must start with a character that
is neither an ASCII digit nor "-" nor "+", and an unquoted name
should not use characters in the set "!$%&'()*,/:;<=>?@[\]^`{|}~".
The latter restriction makes room for future extensions (a
possibility noted by Tom Lane).

tzfile.5 now documents what time types apply before the first and
after the last transition, if any.

Documentation now uses the spelling "timezone" for a TZ setting
that determines timestamp history, and "time zone" for a
geographic region currently sharing the same standard time.

The name "TZif" is now used for the tz binary data format.

tz-link.htm now mentions the A0 TimeZone Migration utilities.
(Thanks to Aldrin Martoq for the link.)
 1.52  04-May-2018  christos branches: 1.52.2;
Merge 2018e

Changes to code

zic now accepts subsecond precision in expressions like
00:19:32.13, which is approximately the legal time of the
Netherlands from 1835 to 1937. However, because it is
questionable whether the few recorded uses of non-integer offsets
had subsecond precision in practice, there are no plans for tzdata
to use this feature. (Thanks to Steve Allen for pointing out
the limitations of historical data in this area.)

The code is a bit more portable to MS-Windows. Installers can
compile with -DRESERVE_STD_EXT_IDS on MS-Windows platforms that
reserve identifiers like 'localtime'. (Thanks to Manuela
Friedrich).

Changes to documentation and commentary

theory.html now outlines tzdb's extensions to POSIX's model for
civil time, and has a section "POSIX features no longer needed"
that lists POSIX API components that are now vestigial.
(From suggestions by Steve Summit.) It also better distinguishes
time zones from tz regions. (From a suggestion by Guy Harris.)

Commentary is now more consistent about using the phrase "daylight
saving time", to match the C name tm_isdst. Daylight saving time
need not occur in summer, and need not have a positive offset from
standard time.

Commentary about historical transitions in Uruguay has been expanded
with links to many relevant legal documents.
(Thanks to Tim Parenti.)

Commentary now uses some non-ASCII characters with Unicode value
less than U+0100, as they can be useful and should work even with
older editors such as XEmacs.
 1.51  24-Oct-2017  christos branches: 1.51.2;
Welcome to 2017c:

zic and the reference runtime now reject multiple leap seconds
within 28 days of each other, or leap seconds before the Epoch.
As a result, support for double leap seconds, which was
obsolescent and undocumented, has been removed. Double leap
seconds were an error in the C89 standard; they have never existed
in civil timekeeping. (Thanks to Robert Elz and Bradley White for
noticing glitches in the code that uncovered this problem.)

zic now warns about use of the obsolescent and undocumented -y
option, and about use of the obsolescent TYPE field of Rule lines.

zic now allows unambiguous abbreviations like "Sa" and "Su" for
weekdays; formerly it rejected them due to a bug. Conversely, zic
no longer considers non-prefixes to be abbreviations; for example,
it no longer accepts "lF" as an abbreviation for "lastFriday".
Also, zic warns about the undocumented usage with a "last-"
prefix, e.g., "last-Fri".

Similarly, zic now accepts the unambiguous abbreviation "L" for
"Link" in ordinary context and for "Leap" in leap-second context.
Conversely, zic no longer accepts non-prefixes such as "La" as
abbreviations for words like "Leap".

zic no longer accepts leap second lines in ordinary input, or
ordinary lines in leap second input. Formerly, zic sometimes
warned about this undocumented usage and handled it incorrectly.

The new macro HAVE_TZNAME governs whether the tzname external
variable is exported, instead of USG_COMPAT. USG_COMPAT now
governs only the external variables "timezone" and "daylight".
This change is needed because the three variables are not in the
same category: although POSIX requires tzname, it specifies the
other two variables as optional. Also, USG_COMPAT is now 1 or 0:
if not defined, the code attempts to guess it from other macros.

localtime.c and difftime.c no longer require stdio.h, and .c files
other than zic.c no longer require sys/wait.h.

zdump.c no longer assumes snprintf. (Reported by Jonathan Leffler.)

Calculation of time_t extrema works around a bug in GCC 4.8.4
(Reported by Stan Shebs and Joseph Myers.)

zic.c no longer mistranslates formats of line numbers in non-English
locales. (Problem reported by Benno Schulenberg.)

Several minor changes have been made to the code to make it a
bit easier to port to MS-Windows and Solaris. (Thanks to Kees
Dekker for reporting the problems.)

Changes to documentation and commentary

The two new files 'theory.html' and 'calendars' contain the
contents of the removed file 'Theory'. The goal is to document
tzdb theory more accessibly.

The zic man page now documents abbreviation rules.

tz-link.htm now covers how to apply tzdata changes to clients.
(Thanks to Jorge Fábregas for the AIX link.) It also mentions MySQL.

The leap-seconds.list URL has been updated to something that is
more reliable for tzdb. (Thanks to Tim Parenti and Brian Inglis.)
 1.50  11-Mar-2017  christos merge 2017a
 1.49  05-Nov-2016  christos branches: 1.49.2;
lint knows about _Generic
 1.48  04-Nov-2016  christos tzcode2016i
 1.47  20-Oct-2016  christos welcome to 2016h
 1.46  07-Oct-2016  christos merge tzcode2016g
 1.45  15-Mar-2016  christos branches: 1.45.2;
Sync with 2016b
 1.44  09-Oct-2015  christos Release 2015g - 2015-10-01 00:39:51 -0700

Changes affecting code

localtime no longer mishandles America/Anchorage after 2037.
(Thanks to Bradley White for reporting the bug.)

The localtime module allows the variables 'timezone', 'daylight',
and 'altzone' to be in common storage shared with other modules,
and declares them in case the system <time.h> does not.
(Problems reported by Kees Dekker.)

On platforms with tm_zone, strftime.c now assumes it is not NULL.
This simplifies the code and is consistent with zdump.c.
(Problem reported by Christos Zoulas.)

Changes affecting documentation

The tzfile man page now documents that transition times denote the
starts (not the ends) of the corresponding time periods.
(Ambiguity reported by Bill Seymour.)
 1.43  13-Aug-2015  christos merge 2015f
 1.42  22-Jun-2015  christos don't define statics we don't need
 1.41  21-Jun-2015  christos merge tzcode2015e:

Changes affecting code

When displaying data, tzselect converts it to the current locale's
encoding if the iconv command works. (Problem reported by random832.)

tzselect no longer mishandles Dominica, fixing a bug introduced
in Release 2014f. (Problem reported by Owen Leibman.)

zic -l no longer fails when compiled with -DTZDEFAULT=\"/etc/localtime\".
This fixes a bug introduced in Release 2014f.
(Problem reported by Leonardo Chiquitto.)
 1.40  28-Apr-2015  christos welcome to tzcode 2015d (zic performance improvements and cleanups)
 1.39  24-Mar-2015  christos merge 2015b
 1.38  23-Oct-2014  christos merge 2014i
 1.37  07-Oct-2014  christos don't define functions we define in our own headers
 1.36  07-Oct-2014  christos Sync with tzcode2014h
 1.35  16-Aug-2014  christos Reduce diffs with upstream by automatically defining INITIALIZE as it was
intended.
 1.34  15-Aug-2014  christos merge tzcode2014f via patch
 1.33  13-May-2014  christos branches: 1.33.2;
Welcome to 2014c
Changes affecting code

zic now generates transitions for minimum time values, eliminating
guesswork when handling low-valued time stamps. (Thanks to Arthur
David Olson.)

Port to Cygwin sans glibc. (Thanks to Arthur David Olson.)

Changes affecting commentary and documentation

Remove now-confusing comment about Jordan. (Thanks to Oleksii
Nochovnyi.)
 1.32  26-Dec-2013  christos branches: 1.32.2;
update from tzcode 2013e to tzcode2013i
i:
The compile-time flag NOSOLAR has been removed, as nowadays the
benefit of slightly shrinking runtime table size is outweighed by the
cost of disallowing potential future updates that exceed old limits.
h:
Fix localtime overflow bugs with 32-bit unsigned time_t.

zdump no longer assumes sscanf returns maximal values on overflow.
g:
'zic' now runs on platforms that lack both hard links and symlinks.
(Thanks to Theo Veenker for reporting the problem, for MinGW.)
Also, fix some bugs on platforms that lack hard links but have symlinks.

'zic -v' again warns that Asia/Tehran has no POSIX environment variable
to predict the far future, fixing a bug introduced in 2013e.
f:
The types of the global variables 'timezone' and 'altzone' (if present)
have been changed back to 'long'. This is required for 'timezone'
by POSIX, and for 'altzone' by common practice, e.g., Solaris 11.
These variables were originally 'long' in the tz code, but were
mistakenly changed to 'time_t' in 1987; nobody reported the
incompatibility until now. The difference matters on x32, where
'long' is 32 bits and 'time_t' is 64. (Thanks to Elliott Hughes.)
 1.31  13-Dec-2013  christos time_t_{min,max} are only used in localtime.c
 1.30  20-Sep-2013  christos Welcome to tzcode 2013e:

Changes affecting API

The 'zic' command now outputs a dummy transition when far-future
data can't be summarized using a TZ string, and uses a 402-year
window rather than a 400-year window. For the current data, this
affects only the Asia/Tehran file. It does not affect any of the
time stamps that this file represents, so zdump outputs the same
information as before. (Thanks to Andrew Main (Zefram).)

The 'date' command has a new '-r' option, which lets you specify
the integer time to display, a la FreeBSD.

The 'tzselect' command has two new options '-c' and '-n', which lets you
select a zone based on latitude and longitude.

The 'zic' command's '-v' option now warns about constructs that
require the new version-3 binary file format. (Thanks to Arthur
David Olson for the suggestion.)

Support for floating-point time_t has been removed.
It was always dicey, and POSIX no longer requires it.
(Thanks to Eric Blake for suggesting to the POSIX committee to
remove it, and thanks to Alan Barrett, Clive D.W. Feather, Andy
Heninger, Arthur David Olson, and Alois Treindl, for reporting
bugs and elucidating some of the corners of the old floating-point
implementation.)

The signatures of 'offtime', 'timeoff', and 'gtime' have been
changed back to the old practice of using 'long' to represent UT
offsets. This had been inadvertently and mistakenly changed to
'int_fast32_t'. (Thanks to Christos Zoulos.)

The code avoids undefined behavior on integer overflow in some
more places, including gmtime, localtime, mktime and zdump.

Changes affecting the zdump utility

zdump now outputs "UT" when referring to Universal Time, not "UTC".
"UTC" does not make sense for time stamps that predate the introduction
of UTC, whereas "UT", a more-generic term, does. (Thanks to Steve Allen
for clarifying UT vs UTC.)

Data changes affecting behavior of tzselect and similar programs

Country code BQ is now called the more-common name "Caribbean Netherlands"
rather than the more-official "Bonaire, St Eustatius & Saba".

Remove from zone.tab the names America/Montreal, America/Shiprock,
and Antarctica/South_Pole, as they are equivalent to existing
same-country-code zones for post-1970 time stamps. The data for
these names are unchanged, so the names continue to work as before.

Changes affecting code internals

zic -c now runs way faster on 64-bit hosts when given large numbers.

zic now uses vfprintf to avoid allocating and freeing some memory.

tzselect now computes the list of continents from the data,
rather than have it hard-coded.

Minor changes pacify GCC 4.7.3 and GCC 4.8.1.

Changes affecting the build procedure

The 'leapseconds' file is now generated automatically from a
new file 'leap-seconds.list', which is a copy of
<ftp://time.nist.gov/pub/leap-seconds.list>.
A new source file 'leapseconds.awk' implements this.
The goal is simplification of the future maintenance of 'leapseconds'.

When building the 'posix' or 'right' subdirectories, if the
subdirectory would be a copy of the default subdirectory, it is
now made a symbolic link if that is supported. This saves about
2 MB of file system space.

The links America/Shiprock and Antarctica/South_Pole have been
moved to the 'backward' file. This affects only nondefault builds
that omit 'backward'.

Changes affecting documentation and commentary

Changes to the 'tzfile' man page

It now mentions that the binary file format may be extended in
future versions by appending data.

It now refers to the 'zdump' and 'zic' man pages.

Changes to the 'zic' man page

It lists conditions that elicit a warning with '-v'.

It says that the behavior is unspecified when duplicate names
are given, or if the source of one link is the target of another.

Its examples are updated to match the latest data.

The definition of white space has been clarified slightly.
(Thanks to Michael Deckers.)

Changes to the 'Theory' file

There is a new section about the accuracy of the tz database,
describing the many ways that errors can creep in, and
explaining why so many of the pre-1970 time stamps are wrong or
misleading (thanks to Steve Allen, Lester Caine, and Garrett
Wollman for discussions that contributed to this).

The 'Theory' file describes LMT better (this follows a
suggestion by Guy Harris).

It refers to the 2013 edition of POSIX rather than the 2004 edition.

It's mentioned that excluding 'backward' should not affect the
other data, and it suggests at least one zone.tab name per
inhabited country (thanks to Stephen Colebourne).

Some longstanding restrictions on names are documented, e.g.,
'America/New_York' precludes 'America/New_York/Bronx'.

It gives more reasons for the 1970 cutoff.

It now mentions which time_t variants are supported, such as
signed integer time_t. (Thanks to Paul Goyette for reporting
typos in an experimental version of this change.)

(Thanks to Philip Newton for correcting typos in these changes.)

Documentation and commentary is more careful to distinguish UT in
general from UTC in particular. (Thanks to Steve Allen.)

Add a better source for the Zurich 1894 transition.
(Thanks to Pierre-Yves Berger.)

Update shapefile citations in tz-link.htm. (Thanks to Guy Harris.)
 1.29  17-Jul-2013  christos welcome to 2013d
 1.28  26-Oct-2012  christos branches: 1.28.2;
stronger lint foo
 1.27  24-Oct-2012  christos apply 2012g via patch
 1.26  09-Aug-2012  christos branches: 1.26.2;
merge 2012e
 1.25  31-Dec-2009  mlelstv branches: 1.25.6;
Import tzcode2009k.
- now understands 64bit time_t and 64bit data in timezone files.
- localtime(), gmtime(), asctime() and ctime() may now fail with
a NULL result if time_t cannot be represented by struct tm.
 1.24  20-Dec-2003  kleink Merge tzcode2003e.
 1.23  27-Oct-2003  lukem Overhaul how `build.sh tools' are used:

* Rename "config.h" to "nbtool_config.h" and
HAVE_CONFIG_H to HAVE_NBTOOL_CONFIG_H.
This makes in more obvious in the source when we're using
tools/compat/config.h versus "standard autoconf" config.h

* Consistently move the inclusion of nbtool_config.h to before
<sys/cdefs.h> so that the former can provide __RCSID() (et al),
and there's no need to protect those macros any more.

These changes should make it easier to "tool-ify" a program by adding:
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
to the top of the source files (for the general case).
 1.22  26-May-2002  wiz __STDC__ is always defined on NetBSD.
 1.21  26-Apr-2002  bjh21 Pull in config.h when we're building zic as a host tool.
This makes zic compilable with Sun WorkShop C 5.0.
 1.20  29-Jan-2002  kleink Merge tzcode2002b.
 1.19  16-Jan-2001  cgd branches: 1.19.2;
#undef, not #undefine.
 1.18  12-Dec-2000  kleink Merge strftime from tzcode2000g.
 1.17  12-Dec-2000  kleink Merge tzcode2000g.
 1.16  10-Dec-2000  christos #ifdef out duplicate declaration for unlink.
 1.15  10-Oct-2000  is Format string cleanup, by Bill Sommerfeld.
 1.14  10-Nov-1999  kleink branches: 1.14.4;
Merge tzcode1999h.
 1.13  04-Oct-1998  kleink branches: 1.13.2; 1.13.6;
Merge tzcode1998h.
 1.12  10-Sep-1998  kleink Merge tzcode1998f.
 1.11  09-Sep-1998  kleink Fix the approximation of log10(2.0) used in INT_STRLEN_MAXIMUM; this resulted
in a fair amount of space wasted in the static result buffer used in
asctime(). Noticed by Randy Thelen <rthelen@netapp.com> on tz@elsie.
 1.10  05-Sep-1997  jtc sync with tzcode1997g
 1.9  13-Jul-1997  christos Fix RCSID's
 1.8  18-Jun-1997  jtc Sync with tzcode1997e
 1.7  13-Sep-1996  jtc set HAVE_STRERROR
 1.6  10-Sep-1996  jtc sync with tzcode96l
 1.5  20-Jan-1996  jtc sync with tzcode96c
 1.4  08-Jan-1996  jtc sync with tzcode96a
 1.3  14-Mar-1995  jtc Added some #defines for NetBSD's defaults.
 1.2  09-Mar-1995  jtc branches: 1.2.2;
Add NetBSD Id's.
 1.1  09-Mar-1995  jtc branches: 1.1.1;
Initial revision
 1.1.1.13  25-Oct-2009  mlelstv import tzcode2009k
 1.1.1.12  19-Dec-2003  kleink Import tzcode2003e.
 1.1.1.11  29-Jan-2002  kleink Import tzcode2002b.
 1.1.1.10  12-Dec-2000  kleink Import tzcode2000g.
 1.1.1.9  10-Nov-1999  kleink Import tzcode1999h.
 1.1.1.8  04-Oct-1998  kleink Import tzcode1998H.
 1.1.1.7  10-Sep-1998  kleink Import tzcode1998f.
 1.1.1.6  05-Sep-1997  jtc import tzcode1997g
 1.1.1.5  18-Jun-1997  jtc import tzcode1997e
 1.1.1.4  10-Sep-1996  jtc import tzcode96l
 1.1.1.3  20-Jan-1996  jtc import tzcode96c
 1.1.1.2  08-Jan-1996  jtc import tzcode96a
 1.1.1.1  09-Mar-1995  jtc New time and date code from ADO
 1.2.2.2  09-Mar-1995  jtc Add NetBSD Id's.
 1.2.2.1  09-Mar-1995  jtc file private.h was added on branch ivory_soap on 1995-03-09 23:41:20 +0000
 1.13.6.1  27-Dec-1999  wrstuden Pull up to last week's -current.
 1.13.2.1  10-Oct-2000  he Pull up revision 1.15 (requested by is):
Format string cleanup.
 1.14.4.1  17-Oct-2000  tv Pullup lib string format fixes [is].
See "cvs log" for explicit revision numbers per file, from sommerfeld.
 1.19.2.3  21-Jun-2002  nathanw Catch up to -current.
 1.19.2.2  22-Mar-2002  nathanw Catch up to -current.
 1.19.2.1  08-Mar-2002  nathanw Catch up to -current.
 1.25.6.2  22-May-2014  yamt sync with head.

for a reference, the tree before this commit was tagged
as yamt-pagecache-tag8.

this commit was splitted into small chunks to avoid
a limitation of cvs. ("Protocol error: too many arguments")
 1.25.6.1  30-Oct-2012  yamt sync with head
 1.26.2.2  20-Aug-2014  tls Rebase to HEAD as of a few days ago.
 1.26.2.1  20-Nov-2012  tls Resync to 2012-11-19 00:00:00 UTC
 1.28.2.1  23-Jul-2013  riastradh sync with HEAD
 1.32.2.1  10-Aug-2014  tls Rebase.
 1.33.2.2  13-Dec-2016  snj Pull up following revision(s) (requested by kre in ticket #1323):
lib/libc/time/private.h: patch
lib/libc/time/zic.c: patch
Make zic properly parse newer tzdata files.
 1.33.2.1  25-Jan-2015  martin branches: 1.33.2.1.2; 1.33.2.1.4;
Pull up the following revisions via patch, requested by apb in ticket #453:

doc/3RDPARTY up to 1.1195
usr.sbin/zdump/Makefile up to 1.9
usr.sbin/zic/Makefile up to 1.15
lib/libc/time/Makefile up to 1.25
lib/libc/time/Makefile.inc up to 1.21
lib/libc/time/NEWS up to 1.8
lib/libc/time/README up to 1.9
lib/libc/time/Theory up to 1.16
lib/libc/time/asctime.c up to 1.20
lib/libc/time/checktab.awk up to 1.8
lib/libc/time/ctime.3 up to 1.51
lib/libc/time/getdate.c up to 1.3
lib/libc/time/localtime.c up to 1.92
lib/libc/time/private.h up to 1.38
lib/libc/time/strftime.c up to 1.33
lib/libc/time/time2posix.3 up to 1.19
lib/libc/time/tz-art.htm up to 1.8
lib/libc/time/tz-link.htm up to 1.20
lib/libc/time/tzfile.5 up to 1.22
lib/libc/time/tzfile.h up to 1.16
lib/libc/time/tzselect.8 up to 1.6
lib/libc/time/tzselect.ksh up to 1.12
lib/libc/time/tzset.3 up to 1.31
lib/libc/time/zdump.8 up to 1.14
lib/libc/time/zdump.c up to 1.40
lib/libc/time/zic.8 up to 1.24
lib/libc/time/zic.c up to 1.52

Update tzcode from 2014e to 2014j.
 1.33.2.1.4.1  18-Jan-2017  skrll Sync with netbsd-5
 1.33.2.1.2.1  13-Dec-2016  snj Pull up following revision(s) (requested by kre in ticket #1323):
lib/libc/time/private.h: patch
lib/libc/time/zic.c: patch
Make zic properly parse newer tzdata files.
 1.45.2.3  20-Mar-2017  pgoyette Sync with HEAD
 1.45.2.2  07-Jan-2017  pgoyette Sync with HEAD. (Note that most of these changes are simply $NetBSD$
tag issues.)
 1.45.2.1  04-Nov-2016  pgoyette Sync with HEAD
 1.49.2.1  21-Apr-2017  bouyer Sync with HEAD
 1.51.2.2  20-Oct-2018  pgoyette Sync with head
 1.51.2.1  21-May-2018  pgoyette Sync with HEAD
 1.52.2.1  10-Jun-2019  christos Sync with HEAD
 1.64.2.1  24-Jul-2023  martin Pull up following revision(s) (requested by riastradh in ticket #242):

lib/libc/time/localtime.c: revision 1.137
lib/libc/time/zdump.c: revision 1.61
lib/libc/time/NEWS: revision 1.41
lib/libc/time/zic.c: revision 1.88
lib/libc/time/zic.c: revision 1.89
lib/libc/time/private.h: revision 1.65

Apply 9cfe9507fcc22cd4a0c4da486ea1c7f0de6b075f for C23 attribute compliance.
Requested by Jan-Benedict Glaw.

put attributes first for c23 compliance.

RSS XML Feed