Module Name:    src
Committed By:   christos
Date:           Sat Feb 17 14:54:47 UTC 2024

Modified Files:
        src/include: tzfile.h
        src/lib/libc/time: Makefile NEWS localtime.c private.h strftime.c
            theory.html tz-art.html tz-link.html tzfile.5 tzselect.ksh version
            zic.8 zic.c

Log Message:
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.)


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/include/tzfile.h
cvs rdiff -u -r1.56 -r1.57 src/lib/libc/time/Makefile
cvs rdiff -u -r1.43 -r1.44 src/lib/libc/time/NEWS
cvs rdiff -u -r1.140 -r1.141 src/lib/libc/time/localtime.c
cvs rdiff -u -r1.68 -r1.69 src/lib/libc/time/private.h
cvs rdiff -u -r1.53 -r1.54 src/lib/libc/time/strftime.c
cvs rdiff -u -r1.18 -r1.19 src/lib/libc/time/theory.html
cvs rdiff -u -r1.12 -r1.13 src/lib/libc/time/tz-art.html
cvs rdiff -u -r1.15 -r1.16 src/lib/libc/time/tz-link.html
cvs rdiff -u -r1.34 -r1.35 src/lib/libc/time/tzfile.5
cvs rdiff -u -r1.22 -r1.23 src/lib/libc/time/tzselect.ksh
cvs rdiff -u -r1.24 -r1.25 src/lib/libc/time/version
cvs rdiff -u -r1.49 -r1.50 src/lib/libc/time/zic.8
cvs rdiff -u -r1.90 -r1.91 src/lib/libc/time/zic.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/tzfile.h
diff -u src/include/tzfile.h:1.12 src/include/tzfile.h:1.13
--- src/include/tzfile.h:1.12	Sat Sep 16 14:19:30 2023
+++ src/include/tzfile.h	Sat Feb 17 09:54:47 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: tzfile.h,v 1.12 2023/09/16 18:19:30 christos Exp $	*/
+/*	$NetBSD: tzfile.h,v 1.13 2024/02/17 14:54:47 christos Exp $	*/
 
 #ifndef _TZFILE_H_
 #define _TZFILE_H_
@@ -85,11 +85,11 @@ struct tzhead {
 ** time uses 8 rather than 4 chars,
 ** then a POSIX-TZ-environment-variable-style 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 representation for
-** such instants).
+** (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.
-** First, the POSIX TZ string's hour offset may range from -167
+** First, the TZ string's hour offset may range from -167
 ** through 167 as compared to the POSIX-required 0 through 24.
 ** 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
@@ -132,6 +132,7 @@ struct tzhead {
 #define SECSPERHOUR	(SECSPERMIN * MINSPERHOUR)
 #define SECSPERDAY	((int_fast32_t) SECSPERHOUR * HOURSPERDAY)
 #define MONSPERYEAR	12
+#define YEARSPERREPEAT	400
 
 #define TM_SUNDAY	0
 #define TM_MONDAY	1

Index: src/lib/libc/time/Makefile
diff -u src/lib/libc/time/Makefile:1.56 src/lib/libc/time/Makefile:1.57
--- src/lib/libc/time/Makefile:1.56	Sat Dec 23 15:48:38 2023
+++ src/lib/libc/time/Makefile	Sat Feb 17 09:54:47 2024
@@ -53,7 +53,7 @@ DATAFORM=		main
 
 LOCALTIME=	Factory
 
-# The POSIXRULES macro controls interpretation of POSIX-like TZ
+# The POSIXRULES macro controls interpretation of POSIX-2017.1-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:
@@ -274,7 +274,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-style TZ strings lacking them,
+#	DST transitions for POSIX.1-2017-style 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.
@@ -340,9 +340,10 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fn
 # guess TM_GMTOFF from other macros; define NO_TM_GMTOFF to suppress this.
 # 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
-# not required by POSIX, a future version of POSIX is planned to require them
-# and they are widely available on GNU/Linux and BSD systems.
+# 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.
 #
 # The next batch of options control support for external variables
 # exported by tzcode.  In practice these variables are less useful
@@ -352,7 +353,7 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fn
 # #	-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 1988 and later.
+# # to the "CFLAGS=" line.  "tzname" is required by POSIX.1-1988 and later.
 # # 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,
@@ -362,8 +363,8 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fn
 # #	-DUSG_COMPAT=0 # do not support
 # #	-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 2008 (with XSI) and later.
+# # 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).
 # # If not defined, the code attempts to guess USG_COMPAT from other macros.
 # #
 # # To support the external variable "altzone", add
@@ -427,7 +428,7 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fn
 
 # 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 202x/D3.
+# The commented-out values are the defaults specified by POSIX.1-202x/D4.
 #AR = ar
 #ARFLAGS = -rv
 #CC = c17
@@ -439,6 +440,12 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fn
 
 LEAPSECONDS=
 
+# Where to fetch leap-seconds.list from.
+leaplist_URI = \
+  https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list
+# The file is generated by the IERS Earth Orientation Centre, in Paris.
+leaplist_TZ = Europe/Paris
+
 # The zic command and its arguments.
 
 zic=		./zic
@@ -471,7 +478,8 @@ AWK=		awk
 # is typically nicer if it works.
 KSHELL=		/bin/bash
 
-# Name of curl <https://curl.haxx.se/>, used for HTML validation.
+# Name of curl <https://curl.haxx.se/>, used for HTML validation
+# and to fetch leap-seconds.list from upstream.
 CURL=		curl
 
 # Name of GNU Privacy Guard <https://gnupg.org/>, used to sign distributions.
@@ -718,6 +726,28 @@ leapseconds:	$(LEAP_DEPS)
 		  -f leapseconds.awk leap-seconds.list >$@.out
 		mv $@.out $@
 
+# Awk script to extract a Git-style author from leap-seconds.list comments.
+EXTRACT_AUTHOR = \
+  author_line { sub(/^.[[:space:]]*/, ""); \
+      sub(/:[[:space:]]*/, " <"); \
+      printf "%s>\n", $$0; \
+      success = 1; \
+      exit \
+  } \
+  /Questions or comments to:/ { author_line = 1 } \
+  END { exit !success }
+
+# Fetch leap-seconds.list from upstream.
+fetch-leap-seconds.list:
+		$(CURL) -OR $(leaplist_URI)
+
+# Fetch leap-seconds.list from upstream and commit it to the local repository.
+commit-leap-seconds.list: fetch-leap-seconds.list
+		author=$$($(AWK) '$(EXTRACT_AUTHOR)' leap-seconds.list) && \
+		date=$$(TZ=$(leaplist_TZ) stat -c%y leap-seconds.list) && \
+		git commit --author="$$author" --date="$$date" -m'make $@' \
+		  leap-seconds.list
+
 # Arguments to pass to submakes of install_data.
 # They can be overridden by later submake arguments.
 INSTALLARGS = \
@@ -1315,7 +1345,8 @@ zic.o:		private.h tzfile.h tzdir.h versi
 .PHONY: ALL INSTALL all
 .PHONY: check check_mild check_time_t_alternatives
 .PHONY: check_web check_zishrink
-.PHONY: clean clean_misc dummy.zd force_tzs
+.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: posix_only posix_right public
 .PHONY: rearguard_signatures rearguard_signatures_version

Index: src/lib/libc/time/NEWS
diff -u src/lib/libc/time/NEWS:1.43 src/lib/libc/time/NEWS:1.44
--- src/lib/libc/time/NEWS:1.43	Sat Dec 23 15:48:38 2023
+++ src/lib/libc/time/NEWS	Sat Feb 17 09:54:47 2024
@@ -1,5 +1,73 @@
 News for the tz database
 
+Release 2024a - 2024-02-01 09:28:56 -0800
+
+  Briefly:
+    Kazakhstan unifies on UTC+5 beginning 2024-03-01.
+    Palestine springs forward a week later after Ramadan.
+    zic no longer pretends to support indefinite-past DST.
+    localtime no longer mishandles Ciudad Juárez in 2422.
+
+  Changes to future timestamps
+
+    Kazakhstan unifies on UTC+5.  This affects Asia/Almaty and
+    Asia/Qostanay which together represent the eastern portion of the
+    country that will transition from UTC+6 on 2024-03-01 at 00:00 to
+    join the western portion.  (Thanks to Zhanbolat Raimbekov.)
+
+    Palestine springs forward a week later than previously predicted
+    in 2024 and 2025.  (Thanks to Heba Hamad.)  Change spring-forward
+    predictions to the second Saturday after Ramadan, not the first;
+    this also affects other predictions starting in 2039.
+
+  Changes to past timestamps
+
+    Asia/Ho_Chi_Minh's 1955-07-01 transition occurred at 01:00
+    not 00:00.  (Thanks to Đoàn Trần Công Danh.)
+
+    From 1947 through 1949, Toronto's transitions occurred at 02:00
+    not 00:00.  (Thanks to Chris Walton.)
+
+    In 1911 Miquelon adopted standard time on June 15, not May 15.
+
+  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.)
+
+
 Release 2023d - 2023-12-21 20:02:24 -0800
 
   Briefly:

Index: src/lib/libc/time/localtime.c
diff -u src/lib/libc/time/localtime.c:1.140 src/lib/libc/time/localtime.c:1.141
--- src/lib/libc/time/localtime.c:1.140	Sat Jan 20 09:52:49 2024
+++ src/lib/libc/time/localtime.c	Sat Feb 17 09:54:47 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: localtime.c,v 1.140 2024/01/20 14:52:49 christos Exp $	*/
+/*	$NetBSD: localtime.c,v 1.141 2024/02/17 14:54:47 christos Exp $	*/
 
 /* Convert timestamp from time_t to struct tm.  */
 
@@ -12,13 +12,13 @@
 #if 0
 static char	elsieid[] = "@(#)localtime.c	8.17";
 #else
-__RCSID("$NetBSD: localtime.c,v 1.140 2024/01/20 14:52:49 christos Exp $");
+__RCSID("$NetBSD: localtime.c,v 1.141 2024/02/17 14:54:47 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
 /*
 ** Leap second handling from Bradley White.
-** POSIX-style TZ environment variable handling from Guy Harris.
+** POSIX.1-1988 style TZ environment variable handling from Guy Harris.
 */
 
 /*LINTLIBRARY*/
@@ -115,7 +115,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-style TZ strings.
+/* Limit to time zone abbreviation length in POSIX.1-2017-style TZ strings.
    This is distinct from TZ_MAX_CHARS, which limits TZif file contents.  */
 #ifndef TZNAME_MAXIMUM
 # define TZNAME_MAXIMUM 255
@@ -993,7 +993,8 @@ getoffset(register const char *strp, int
 
 /*
 ** Given a pointer into a timezone string, extract a rule in the form
-** date[/time]. See POSIX section 8 for the format of "date" and "time".
+** date[/time]. See POSIX Base Definitions section 8.3 variable TZ
+** for the format of "date" and "time".
 ** If a valid rule is not found, return NULL.
 ** Otherwise, return a pointer to the first character not part of the rule.
 */
@@ -1137,7 +1138,7 @@ transtime(const int year, register const
 }
 
 /*
-** Given a POSIX section 8-style TZ string, fill in the rule tables as
+** Given a POSIX.1-2017-style TZ string, fill in the rule tables as
 ** appropriate.
 */
 
@@ -1264,7 +1265,7 @@ tzparse(const char *name, struct state *
 			}
 
 			yearlim = yearbeg;
-			if (increment_overflow(&yearlim, YEARSPERREPEAT + 1))
+			if (increment_overflow(&yearlim, years_of_observations))
 			  yearlim = INT_MAX;
 			for (year = yearbeg; year < yearlim; year++) {
 				int_fast32_t
@@ -1301,7 +1302,7 @@ tzparse(const char *name, struct state *
 				if (endtime < leaplo) {
 				  yearlim = year;
 				  if (increment_overflow(&yearlim,
-							 YEARSPERREPEAT + 1))
+							 years_of_observations))
 				    yearlim = INT_MAX;
 				}
 				if (increment_overflow_time
@@ -1313,7 +1314,7 @@ tzparse(const char *name, struct state *
 			if (! timecnt) {
 				sp->ttis[0] = sp->ttis[1];
 				sp->typecnt = 1;	/* Perpetual DST.  */
-			} else if (YEARSPERREPEAT < year - yearbeg)
+			} else if (years_of_observations <= year - yearbeg)
 				sp->goback = sp->goahead = true;
 		} else {
 			register int_fast32_t	theirstdoffset;
@@ -1372,8 +1373,8 @@ tzparse(const char *name, struct state *
 					/*
 					** Transitions from DST to DDST
 					** will effectively disappear since
-					** POSIX provides for only one DST
-					** offset.
+					** POSIX.1-2017 provides for only one
+					** DST offset.
 					*/
 					if (isdst && !sp->ttis[j].tt_ttisstd) {
 						sp->ats[i] += (time_t)
@@ -1556,7 +1557,8 @@ 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 POSIX-compatible,
+** however, it's OK to omit this step
+** if the timezone is compatible with POSIX.1-2017
 ** 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.
@@ -2465,15 +2467,18 @@ timelocal(struct tm *tmp)
 		tmp->tm_isdst = -1;	/* in case it wasn't initialized */
 	return mktime(tmp);
 }
-#else
+#endif
+
+#ifndef EXTERN_TIMEOFF
 # ifndef timeoff
 #  define timeoff my_timeoff /* Don't collide with OpenBSD 7.4 <time.h>.  */
 # endif
-static
+# define EXTERN_TIMEOFF static
 #endif
+
 /* This function is obsolescent and may disapper in future releases.
    Callers can instead use mktime_z with a fixed-offset zone.  */
-time_t
+EXTERN_TIMEOFF time_t
 timeoff(struct tm *tmp, long offset)
 {
   if (tmp)

Index: src/lib/libc/time/private.h
diff -u src/lib/libc/time/private.h:1.68 src/lib/libc/time/private.h:1.69
--- src/lib/libc/time/private.h:1.68	Sat Jan 20 09:52:49 2024
+++ src/lib/libc/time/private.h	Sat Feb 17 09:54:47 2024
@@ -1,6 +1,6 @@
 /* Private header for tzdb code.  */
 
-/*	$NetBSD: private.h,v 1.68 2024/01/20 14:52:49 christos Exp $	*/
+/*	$NetBSD: private.h,v 1.69 2024/02/17 14:54:47 christos Exp $	*/
 
 #ifndef PRIVATE_H
 #define PRIVATE_H
@@ -778,7 +778,7 @@ struct tm *offtime(time_t const *, long)
 time_t timelocal(struct tm *);
 # endif
 # if TZ_TIME_T || !defined timeoff
-time_t timeoff(struct tm *, long);
+#  define EXTERN_TIMEOFF
 # endif
 # if TZ_TIME_T || !defined time2posix
 time_t time2posix(time_t);
@@ -790,7 +790,8 @@ time_t posix2time(time_t);
 
 /* Infer TM_ZONE on systems where this information is known, but suppress
    guessing if NO_TM_ZONE is defined.  Similarly for TM_GMTOFF.  */
-#if (defined __GLIBC__ \
+#if (200809 < _POSIX_VERSION \
+     || defined __GLIBC__ \
      || defined __tm_zone /* musl */ \
      || defined __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ \
      || (defined __APPLE__ && defined __MACH__))
@@ -922,6 +923,19 @@ static_assert(! TYPE_SIGNED(time_t) || !
 # define UNINIT_TRAP 0
 #endif
 
+/* localtime.c sometimes needs access to timeoff if it is not already public.
+   tz_private_timeoff should be used only by localtime.c.  */
+#if (!defined EXTERN_TIMEOFF \
+     && defined TM_GMTOFF && (200809 < _POSIX_VERSION || ! UNINIT_TRAP))
+# ifndef timeoff
+#  define timeoff tz_private_timeoff
+# endif
+# define EXTERN_TIMEOFF
+#endif
+#ifdef EXTERN_TIMEOFF
+time_t timeoff(struct tm *, long);
+#endif
+
 #ifdef DEBUG
 # undef unreachable
 # define unreachable() abort()
@@ -983,6 +997,18 @@ enum {
 #define SECSPERREPEAT		((int_fast64_t) DAYSPERREPEAT * SECSPERDAY)
 #define AVGSECSPERYEAR		(SECSPERREPEAT / YEARSPERREPEAT)
 
+/* 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.
+   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,
+   less than 400 years after the last one-off transition in 2013-11.
+   Two years is not overkill for localtime.c, as a one-year bump
+   would mishandle 2023d's America/Ciudad_Juarez for November 2422.  */
+enum { years_of_observations = YEARSPERREPEAT + 2 };
+
 #ifndef TM_SUNDAY
 enum {
   TM_SUNDAY,

Index: src/lib/libc/time/strftime.c
diff -u src/lib/libc/time/strftime.c:1.53 src/lib/libc/time/strftime.c:1.54
--- src/lib/libc/time/strftime.c:1.53	Sat Jan 20 09:52:49 2024
+++ src/lib/libc/time/strftime.c	Sat Feb 17 09:54:47 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: strftime.c,v 1.53 2024/01/20 14:52:49 christos Exp $	*/
+/*	$NetBSD: strftime.c,v 1.54 2024/02/17 14:54:47 christos Exp $	*/
 
 /* Convert a broken-down timestamp to a string.  */
 
@@ -35,7 +35,7 @@
 static char	elsieid[] = "@(#)strftime.c	7.64";
 static char	elsieid[] = "@(#)strftime.c	8.3";
 #else
-__RCSID("$NetBSD: strftime.c,v 1.53 2024/01/20 14:52:49 christos Exp $");
+__RCSID("$NetBSD: strftime.c,v 1.54 2024/02/17 14:54:47 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -381,11 +381,15 @@ label:
 					tm.tm_mday = t->tm_mday;
 					tm.tm_mon = t->tm_mon;
 					tm.tm_year = t->tm_year;
+#ifdef TM_GMTOFF
+					mkt = timeoff(&tm, t->TM_GMTOFF);
+#else
 					tm.tm_isdst = t->tm_isdst;
 #if defined TM_GMTOFF && ! UNINIT_TRAP
 					tm.TM_GMTOFF = t->TM_GMTOFF;
 #endif
 					mkt = mktime_z(sp, &tm);
+#endif
 					/* If mktime fails, %s expands to the
 					   value of (time_t) -1 as a failure
 					   marker; this is better in practice

Index: src/lib/libc/time/theory.html
diff -u src/lib/libc/time/theory.html:1.18 src/lib/libc/time/theory.html:1.19
--- src/lib/libc/time/theory.html:1.18	Sat Sep 16 14:40:26 2023
+++ src/lib/libc/time/theory.html	Sat Feb 17 09:54:47 2024
@@ -95,7 +95,7 @@ Group Base Specifications Issue 7</a>, I
 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.
+standard and daylight saving times supported by POSIX.1-2017.
 A <code><abbr>tz</abbr></code> 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
@@ -187,7 +187,7 @@ in decreasing order of importance:
     href="https://en.wikipedia.org/wiki/ASCII";>ASCII</a> letters,
     '<code>.</code>', '<code>-</code>' and '<code>_</code>'.
     Do not use digits, as that might create an ambiguity with <a
-    href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03";>POSIX
+    href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03";>POSIX.1-2017
     <code>TZ</code> strings</a>.
     A file name component must not exceed 14 characters or start with
     '<code>-</code>'.
@@ -362,6 +362,11 @@ The backward-compatibility file <code>zo
 but conforms to the older-version guidelines related to <abbr>ISO</abbr> 3166-1;
 it lists only one country code per entry and unlike <code>zone1970.tab</code>
 it can list names defined in <code>backward</code>.
+Applications that process only timestamps from now on can instead use the file
+<code>zonenow.tab</code>, which partitions the world more coarsely,
+into regions where clocks agree now and in the predicted future;
+this file is smaller and simpler than <code>zone1970.tab</code>
+and <code>zone.tab</code>.
 </p>
 
 <p>
@@ -373,7 +378,7 @@ nowadays distributions typically use it
 and no great weight should be attached to whether a link
 is defined in <code>backward</code> or in some other file.
 The source file <code>etcetera</code> defines names that may be useful
-on platforms that do not support POSIX-style <code>TZ</code> strings;
+on platforms that do not support POSIX.1-2017-style <code>TZ</code> strings;
 no other source file other than <code>backward</code>
 contains links to its zones.
 One of <code>etcetera</code>'s names is <code>Etc/UTC</code>,
@@ -421,7 +426,7 @@ in decreasing order of importance:
     expression <code>[-+[:alnum:]]{3,6}</code> should match the
     abbreviation.
     This guarantees that all abbreviations could have been specified by a
-    POSIX <code>TZ</code> string.
+    POSIX.1-2017 <code>TZ</code> string.
     </p>
   </li>
   <li>
@@ -765,12 +770,12 @@ href="https://www.dissentmagazine.org/bl
     calendar with 24-hour days. These divergences range from
     relatively minor, such as Japanese bars giving times like "24:30" for the
     wee hours of the morning, to more-significant differences such as <a
-    href="https://www.pri.org/stories/2015-01-30/if-you-have-meeting-ethiopia-you-better-double-check-time";>the
+    href="https://theworld.org/stories/2015-01-30/if-you-have-meeting-ethiopia-you-better-double-check-time";>the
     east African practice of starting the day at dawn</a>, renumbering
     the Western 06:00 to be 12:00. These practices are largely outside
     the scope of the <code><abbr>tz</abbr></code> code and data, which
     provide only limited support for date and time localization
-    such as that required by POSIX.
+    such as that required by POSIX.1-2017.
     If <abbr>DST</abbr> is not used a different time zone
     can often do the trick; for example, in Kenya a <code>TZ</code> setting
     like <code>&lt;-03&gt;3</code> or <code>America/Cayenne</code> starts
@@ -867,23 +872,23 @@ input is occasionally extended, and a pl
 an older <code>zic</code>.
 </p>
 
-<h3 id="POSIX">POSIX properties and limitations</h3>
+<h3 id="POSIX">POSIX.1-2017 properties and limitations</h3>
 <ul>
   <li>
     <p>
-    In POSIX, time display in a process is controlled by the
+    In POSIX.1-2017, time display in a process is controlled by the
     environment variable <code>TZ</code>.
-    Unfortunately, the POSIX
+    Unfortunately, the POSIX.1-2017
     <code>TZ</code> string takes a form that is hard to describe and
     is error-prone in practice.
-    Also, POSIX <code>TZ</code> strings cannot deal with daylight
+    Also, POSIX.1-2017 <code>TZ</code> 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 <abbr>UT</abbr> offsets are used in an area.
     </p>
 
     <p>
-    The POSIX <code>TZ</code> string takes the following form:
+    The POSIX.1-2017 <code>TZ</code> string takes the following form:
     </p>
 
     <p>
@@ -950,7 +955,7 @@ an older <code>zic</code>.
     </dl>
 
     <p>
-    Here is an example POSIX <code>TZ</code> string for New
+    Here is an example POSIX.1-2017 <code>TZ</code> string for New
     Zealand after 2007.
     It says that standard time (<abbr>NZST</abbr>) is 12 hours ahead
     of <abbr>UT</abbr>, and that daylight saving time
@@ -961,7 +966,7 @@ an older <code>zic</code>.
     <pre><code>TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'</code></pre>
 
     <p>
-    This POSIX <code>TZ</code> string is hard to remember, and
+    This POSIX.1-2017 <code>TZ</code> string is hard to remember, and
     mishandles some timestamps before 2008.
     With this package you can use this instead:
     </p>
@@ -999,7 +1004,7 @@ an older <code>zic</code>.
     limit phone calls to off-peak hours.
   </li>
   <li>
-    POSIX provides no convenient and efficient way to determine
+    POSIX.1-2017 provides no convenient and efficient way to determine
     the <abbr>UT</abbr> offset and time zone abbreviation of arbitrary
     timestamps, particularly for timezones
     that do not fit into the POSIX model.
@@ -1026,14 +1031,14 @@ an older <code>zic</code>.
   </li>
 </ul>
 
-<h3 id="POSIX-extensions">Extensions to POSIX in the
+<h3 id="POSIX-extensions">Extensions to POSIX.1-2017 in the
 <code><abbr>tz</abbr></code> code</h3>
 <ul>
   <li>
     <p>
     The <code>TZ</code> environment variable is used in generating
     the name of a file from which time-related information is read
-    (or is interpreted à la POSIX); <code>TZ</code> is no longer
+    (or is interpreted à la POSIX.1-2017); <code>TZ</code> is no longer
     constrained to be a string containing abbreviations
     and numeric data as described <a href="#POSIX">above</a>.
     The file's format is <dfn><abbr>TZif</abbr></dfn>,

Index: src/lib/libc/time/tz-art.html
diff -u src/lib/libc/time/tz-art.html:1.12 src/lib/libc/time/tz-art.html:1.13
--- src/lib/libc/time/tz-art.html:1.12	Sat Dec 23 15:48:38 2023
+++ src/lib/libc/time/tz-art.html	Sat Feb 17 09:54:47 2024
@@ -210,7 +210,7 @@ Umberto Eco,
 Island of the Day Before</em></a>
 (<em>L'isola del giorno prima</em>), 1994.
 "...the story of a 17th century Italian nobleman trapped near an island
-on the International Date Line.  Time and time zones play an integral
+on the International Date Line. Time and time zones play an integral
 part in the novel." (Paul Eggert, 2006-04-22)
 </li>
 <li>
@@ -230,94 +230,73 @@ year-round <abbr>DST</abbr> as a way of 
 </li>
 </ul>
 <h2>Music</h2>
-<p>
-Data on recordings of "Save That Time," Russ Long, Serrob Publishing, BMI:</p>
-<table>
-<tr><td>Artist</td><td>Karrin Allyson</td></tr>
-<tr><td>CD</td><td>I Didn't Know About You</td></tr>
-<tr><td>Copyright Date</td><td>1993</td></tr>
-<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
-<tr><td>ID</td><td>CCD-4543</td></tr>
-<tr><td>Track Time</td><td>3:44</td></tr>
-<tr><td>Personnel</td><td>Karrin Allyson, vocal;
+<ul>
+<li>
+Recordings of "Save That Time," Russ Long, Serrob Publishing, BMI:
+<ul>
+<li>
+Karrin Allyson, <em>I Didn't Know About You</em> (1993), track 11, 3:44.
+Concord Jazz CCD-4543.
+Karrin Allyson, vocal;
 Russ Long, piano;
 Gerald Spaits, bass;
-Todd Strait, drums</td></tr>
-<tr><td>Notes</td><td>CD notes "additional lyric by Karrin Allyson;
-arranged by Russ Long and Karrin Allyson"</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/i-didnt-know-about-you-mw0000618657";>AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Kevin Mahogany</td></tr>
-<tr><td>CD</td><td>Double Rainbow</td></tr>
-<tr><td>Copyright Date</td><td>1993</td></tr>
-<tr><td>Label</td><td>Enja Records</td></tr>
-<tr><td>ID</td><td>ENJ-7097 2</td></tr>
-<tr><td>Track Time</td><td>6:27</td></tr>
-<tr><td>Personnel</td><td>Kevin Mahogany, vocal;
+Todd Strait, drums.
+CD notes "additional lyric by Karrin Allyson;
+arranged by Russ Long and Karrin Allyson".
+ADO &#x2605;,
+<a href="https://www.allmusic.com/album/i-didnt-know-about-you-mw0000618657";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;, Penguin &#x2605;&#x2605;&#x2605;&#x2BEA;.
+</li>
+<li>
+Kevin Mahogany, <em>Double Rainbow</em> (1993), track 3, 6:27. Enja ENJ-7097 2.
+Kevin Mahogany, vocal;
 Kenny Barron, piano;
 Ray Drummond, bass;
 Ralph Moore, tenor saxophone;
-Lewis Nash, drums</td></tr>
-<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/double-rainbow-mw0000620371";>AMG Rating</a></td><td>3 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Joe Williams</td></tr>
-<tr><td>CD</td><td>Here's to Life</td></tr>
-<tr><td>Copyright Date</td><td>1994</td></tr>
-<tr><td>Label</td><td>Telarc International Corporation</td></tr>
-<tr><td>ID</td><td>CD-83357</td></tr>
-<tr><td>Track Time</td><td>3:58</td></tr>
-<tr><td>Personnel</td><td>Joe Williams, vocal
-The Robert Farnon [39 piece] Orchestra</td></tr>
-<tr><td>Notes</td><td>This CD is also available as part of a 3-CD package from
-Telarc, "Triple Play" (CD-83461)</td></tr>
-<tr><td>ADO Rating</td><td>black dot</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/heres-to-life-mw0000623648";>AMG Rating</a></td><td>2 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Charles Fambrough</td></tr>
-<tr><td>CD</td><td>Keeper of the Spirit</td></tr>
-<tr><td>Copyright Date</td><td>1995</td></tr>
-<tr><td>Label</td><td>AudioQuest Music</td></tr>
-<tr><td>ID</td><td>AQ-CD1033</td></tr>
-<tr><td>Track Time</td><td>7:07</td></tr>
-<tr><td>Personnel</td><td>Charles Fambrough, bass;
+Lewis Nash, drums.
+ADO &#x2605;&#x2BEA;,
+<a href="https://www.allmusic.com/album/double-rainbow-mw0000620371";>AMG</a>
+&#x2605;&#x2605;&#x2605;, Penguin &#x2605;&#x2605;&#x2605;.
+</li>
+<li>
+Joe Williams, <em>Here's to Life</em> (1994), track 7, 3:58.
+Telarc Jazz CD-83357.
+Joe Williams, vocal; The Robert Farnon [39 piece] Orchestra.
+Also in a 3-CD package "Triple Play", Telarc CD-83461.
+ADO &#x2022;,
+<a href="https://www.allmusic.com/album/heres-to-life-mw0000623648";>AMG</a>
+&#x2605;&#x2605;, Penguin &#x2605;&#x2605;&#x2605;.
+</li>
+<li>
+Charles Fambrough, <em>Keeper of the Spirit</em> (1995), track 7, 7:07.
+AudioQuest AQ-CD1033.
+Charles Fambrough, bass;
 Joel Levine, tenor recorder;
 Edward Simon, piano;
 Lenny White, drums;
-Marion Simon, percussion</td></tr>
-<tr><td>ADO Rating</td><td>2 stars</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/keeper-of-the-spirit-mw0000176559";>AMG Rating</a></td><td>unrated</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-</table>
-<hr>
-<p>Also of note:</p>
-<table>
-<tr><td>Artist</td><td>Holly Cole Trio</td></tr>
-<tr><td>CD</td><td>Blame It On My Youth</td></tr>
-<tr><td>Copyright Date</td><td>1992</td></tr>
-<tr><td>Label</td><td>Manhattan</td></tr>
-<tr><td>ID</td><td>CDP 7 97349 2</td></tr>
-<tr><td>Total Time</td><td>37:45</td></tr>
-<tr><td>Personnel</td><td>Holly Cole, voice;
+Marion Simon, percussion.
+ADO &#x2605;,
+<a href="https://www.allmusic.com/album/keeper-of-the-spirit-mw0000176559";>AMG</a>
+unrated, Penguin &#x2605;&#x2605;&#x2605;.
+</ul>
+</li>
+<li>
+Holly Cole Trio, Blame It On My Youth (1992). Manhattan CDP 7 97349 2, 37:45.
+Holly Cole, voice;
 Aaron Davis, piano;
-David Piltch, string bass</td></tr>
-<tr><td>Notes</td><td>Lyrical reference to "Eastern Standard Time" in
-Tom Waits' "Purple Avenue"</td></tr>
-<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/blame-it-on-my-youth-mw0000274303";>AMG Rating</a></td><td>3 stars</td></tr>
-<tr><td>Penguin Rating</td><td>unrated</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Milt Hinton</td></tr>
-<tr><td>CD</td><td>Old Man Time</td></tr>
-<tr><td>Copyright Date</td><td>1990</td></tr>
-<tr><td>Label</td><td>Chiaroscuro</td></tr>
-<tr><td>ID</td><td>CR(D) 310</td></tr>
-<tr><td>Total Time</td><td>149:38 (two CDs)</td></tr>
-<tr><td>Personnel</td><td>Milt Hinton, bass;
+David Piltch, string bass.
+Lyrical reference to "Eastern Standard Time" in
+Tom Waits's "Purple Avenue".
+ADO &#x2605;&#x2605;&#x2BEA;,
+<a href="https://www.allmusic.com/album/blame-it-on-my-youth-mw0000274303";>AMG</a>
+&#x2605;&#x2605;&#x2605;, Penguin unrated.
+</li>
+<li>
+Milt Hinton,
+<a href="https://chiaroscurojazz.org/catalog/old-man-time-2-cd-set/";><em>Old
+Man Time</em></a> (1990).
+Chiaroscuro CR(D) 310, 149:38 (two CDs).
+Milt Hinton, bass;
 Doc Cheatham, Dizzy Gillespie, Clark Terry, trumpet;
 Al Grey, trombone;
 Eddie Barefield, Joe Camel (Flip Phillips), Buddy Tate,
@@ -329,165 +308,129 @@ Gus Johnson, Gerryck King, Bob Rosengard
 drums;
 Lionel Hampton, vibraphone;
 Cab Calloway, Joe Williams, vocal;
-Buck Clayton, arrangements</td></tr>
-<tr><td>Notes</td><td>tunes include Old Man Time, Time After Time,
-Sometimes I'm Happy,
-A Hot Time in the Old Town Tonight,
-Four or Five Times, Now's the Time,
-Time on My Hands, This Time It's Us,
-and Good Time Charlie.
-<a href="http://www.chiaroscurojazz.com/album.php?C=310";>Album info</a>
-is available.</td></tr>
-<tr><td>ADO Rating</td><td>3 stars</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/old-man-time-mw0000269353";>AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Alan Broadbent</td></tr>
-<tr><td>CD</td><td>Pacific Standard Time</td></tr>
-<tr><td>Copyright Date</td><td>1995</td></tr>
-<tr><td>Label</td><td>Concord Jazz, Inc.</td></tr>
-<tr><td>ID</td><td>CCD-4664</td></tr>
-<tr><td>Total Time</td><td>62:42</td></tr>
-<tr><td>Personnel</td><td>Alan Broadbent, piano;
+Buck Clayton, arrangements.
+Tunes include "Old Man Time", "Time After Time",
+"Sometimes I'm Happy",
+"A Hot Time in the Old Town Tonight",
+"Four or Five Times", "Now's the Time",
+"Time on My Hands", "This Time It's Us",
+and "Good Time Charlie".
+ADO &#x2605;&#x2605;&#x2605;,
+<a href="https://www.allmusic.com/album/old-man-time-mw0000269353";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;&#x2BEA;, Penguin &#x2605;&#x2605;&#x2605;.
+</li>
+<li>
+Alan Broadbent, <em>Pacific Standard Time</em> (1995).
+Concord Jazz CCD-4664, 62:42.
+Alan Broadbent, piano;
 Putter Smith, Bass;
-Frank Gibson, Jr., drums</td></tr>
-<tr><td>Notes</td><td>The CD cover features an analemma for equation-of-time fans</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/pacific-standard-time-mw0000645433";>AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>Penguin Rating</td><td>3.5 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Anthony Braxton/Richard Teitelbaum</td></tr>
-<tr><td>CD</td><td>Silence/Time Zones</td></tr>
-<tr><td>Copyright Date</td><td>1996</td></tr>
-<tr><td>Label</td><td>Black Lion</td></tr>
-<tr><td>ID</td><td>BLCD 760221</td></tr>
-<tr><td>Total Time</td><td>72:58</td></tr>
-<tr><td>Personnel</td><td>Anthony Braxton, sopranino and alto saxophones,
+Frank Gibson, Jr., drums.
+The CD cover features an analemma for equation-of-time fans.
+ADO &#x2605;,
+<a href="https://www.allmusic.com/album/pacific-standard-time-mw0000645433";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;, Penguin &#x2605;&#x2605;&#x2605;&#x2BEA;.
+</li>
+<li>
+Anthony Braxton/Richard Teitelbaum, <em>Silence/Time Zones</em> (1996).
+Black Lion BLCD 760221, 72:58.
+Anthony Braxton, sopranino and alto saxophones,
 contrebasse clarinet, miscellaneous instruments;
 Leo Smith, trumpet and miscellaneous instruments;
 Leroy Jenkins, violin and miscellaneous instruments;
-Richard Teitelbaum, modular moog and micromoog synthesizer</td></tr>
-<tr><td>ADO Rating</td><td>black dot</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/silence-time-zones-mw0000595735";>AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Charles Gayle</td></tr>
-<tr><td>CD</td><td>Time Zones</td></tr>
-<tr><td>Copyright Date</td><td>2006</td></tr>
-<tr><td>Label</td><td>Tompkins Square</td></tr>
-<tr><td>ID</td><td>TSQ2839</td></tr>
-<tr><td>Total Time</td><td>49:06</td></tr>
-<tr><td>Personnel</td><td>Charles Gayle, piano</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/time-zones-mw0000349642";>AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>The Get Up Kids</td></tr>
-<tr><td>CD</td><td>Eudora</td></tr>
-<tr><td>Copyright Date</td><td>2001</td></tr>
-<tr><td>Label</td><td>Vagrant</td></tr>
-<tr><td>ID</td><td>357</td></tr>
-<tr><td>Total Time</td><td>65:12</td></tr>
-<tr><td>Notes</td><td>Includes the song "Central Standard Time." Thanks to Colin Bowern for this information.</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/eudora-mw0000592063";>AMG Rating</a></td><td>2.5 stars</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>Coldplay</td></tr>
-<tr><td>Song</td><td>Clocks</td></tr>
-<tr><td>Copyright Date</td><td>2003</td></tr>
-<tr><td>Label</td><td>Capitol Records</td></tr>
-<tr><td>ID</td><td>52608</td></tr>
-<tr><td>Total Time</td><td>4:13</td></tr>
-<tr><td>Notes</td><td>Won the 2004 Record of the Year honor at the
+Richard Teitelbaum, modular moog and micromoog synthesizer.
+ADO &#x2022;,
+<a href="https://www.allmusic.com/album/silence-time-zones-mw0000595735";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;.
+</li>
+<li>
+Charles Gayle, <em>Time Zones</em> (2006). Tompkins Square TSQ2839, 49:06.
+Charles Gayle, piano.
+ADO &#x2605;,
+<a href="https://www.allmusic.com/album/time-zones-mw0000349642";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;&#x2BEA;.
+</li>
+<li>
+The Get Up Kids, <em>Eudora</em> (2001). Vagrant 357, 65:12.
+Includes the song "Central Standard Time."
+Thanks to Colin Bowern for this information.
+<a href="https://www.allmusic.com/album/eudora-mw0000592063";>AMG</a>
+&#x2605;&#x2605;&#x2BEA;.
+</li>
+<li>
+Coldplay, "Clocks" (2003).
+Capitol 52608, 4:13.
+Won the 2004 Record of the Year honor at the
 Grammy Awards. Co-written and performed by Chris Martin,
 great-great-grandson of <abbr>DST</abbr> inventor William Willett.
-The song's first line is "Lights go out and I can't be saved".</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>Jaime Guevara</td></tr>
-<tr><td>Song</td><td><a
+The song's first line is "Lights go out and I can't be saved".
+</li>
+<li>
+Jaime Guevara, "<a
 href="https://www.youtube.com/watch?v=ZfN4Fe_A50U";>Qu&eacute;
-hora es</a></td></tr>
-<tr><td>Date</td><td>1993</td></tr>
-<tr><td>Total Time</td><td>3:04</td></tr>
-<tr><td>Notes</td><td>The song protested "Sixto Hour" in Ecuador
+hora es</a>" (1993), 3:04.
+The song protested "Sixto Hour" in Ecuador
 (1992&ndash;3). Its lyrics include "Amanec&iacute;a en mitad de la noche, los
 guaguas iban a clase sin sol" ("It was dawning in the middle of the
 night, the buses went to class without sun").
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>Irving Kahal and Harry Richman</td></tr>
-<tr><td>Song</td><td>There Ought to be a Moonlight Saving Time</td></tr>
-<tr><td>Copyright Date</td><td>1931</td>
-<tr><td>Notes</td><td>This musical standard was a No. 1 hit for Guy Lombardo
+</li>
+<li>
+Irving Kahal and Harry Richman,
+"There Ought to be a Moonlight Saving Time" (1931).
+This musical standard was a No. 1 hit for Guy Lombardo
 in 1931, and was also performed by Maurice Chevalier, Blossom Dearie
 and many others. The phrase "Moonlight saving time" also appears in
 the 1995 country song "Not Enough Hours in the Night" written by Aaron
 Barker, Kim Williams and Rob Harbin and performed by Doug
-Supernaw.</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>The Microscopic Septet</td></tr>
-<tr><td>CD</td><td>Lobster Leaps In</td></tr>
-<tr><td>Copyright Date</td><td>2008</td></tr>
-<tr><td>Label</td><td>Cuneiform</td></tr>
-<tr><td>ID</td><td>272</td></tr>
-<tr><td>Total Time</td><td>73:05</td></tr>
-<tr><td>Notes</td><td>Includes the song "Twilight Time Zone."</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/lobster-leaps-in-mw0000794929";>AMG Rating</a></td><td>3.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>2 stars</td></tr>
-
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>Bob Dylan</td></tr>
-<tr><td>CD</td><td>The Times They Are a-Changin'</td></tr>
-<tr><td>Copyright Date</td><td>1964</td></tr>
-<tr><td>Label</td><td>Columbia</td></tr>
-<tr><td>ID</td><td>CK-8905</td></tr>
-<tr><td>Total Time</td><td>45:36</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/the-times-they-a-changin-mw0000202344";>AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>1.5 stars</td></tr>
-<tr><td>Notes<td>The title song is also available on "Bob Dylan's Greatest Hits" and "The Essential Bob Dylan."</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-
-<tr><td>Artist</td><td>Luciana Souza</td></tr>
-<tr><td>CD</td><td>Tide</td></tr>
-<tr><td>Copyright Date</td><td>2009</td></tr>
-<tr><td>Label</td><td>Universal Jazz France</td></tr>
-<tr><td>ID</td><td>B0012688-02</td></tr>
-<tr><td>Total Time</td><td>42:31</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/tide-mw0000815692";>AMG Rating</a></td><td>3.5 stars</td></tr>
-<tr><td>ADO Rating</td><td>2.5 stars</td></tr>
-<tr><td>Notes<td>Includes the song "Fire and Wood" with the lyric
+Supernaw.
+</li>
+<li>
+The Microscopic Septet, <em>Lobster Leaps In</em> (2008).
+Cuneiform 272, 73:05.
+Includes the song "Twilight Time Zone."
+ADO &#x2605;&#x2605;,
+<a href="https://www.allmusic.com/album/lobster-leaps-in-mw0000794929";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2BEA;.
+</li>
+<li>
+Bob Dylan, <em>The Times They Are a-Changin'</em> (1964).
+Columbia CK-8905, 45:36.
+ADO &#x2605;&#x2BEA;,
+<a href="https://www.allmusic.com/album/the-times-they-a-changin-mw0000202344";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;&#x2BEA;.
+The title song is also available on "Bob Dylan's Greatest Hits" and "The Essential Bob Dylan."
+</li>
+<li>
+Luciana Souza, <em>Tide</em> (2009). Universal Jazz France B0012688-02, 42:31.
+ADO &#x2605;&#x2605;&#x2BEA;,
+<a href="https://www.allmusic.com/album/tide-mw0000815692";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2BEA;.
+Includes the song "Fire and Wood" with the lyric
 "The clocks were turned back you remember/Think it's still November."
-</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Ken Nordine</td></tr>
-<tr><td>CD</td><td>You're Getting Better: The Word Jazz Dot Masters</td></tr>
-<tr><td>Copyright Date</td><td>2005</td></tr>
-<tr><td>Label</td><td>Geffen</td></tr>
-<tr><td>ID</td><td>B0005171-02</td></tr>
-<tr><td>Total Time</td><td>156:22</td></tr>
-<tr><td>ADO Rating</td><td>1 star</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/youre-getting-better-the-word-jazz-dot-masters-mw0000736197";>AMG Rating</a></td><td>4.5 stars</td></tr>
-<tr><td>Notes</td><td>Includes the piece "What Time Is It"
-("He knew what time it was everywhere...that counted").</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Chicago</td></tr>
-<tr><td>CD</td><td>Chicago Transit Authority</td></tr>
-<tr><td>Copyright Date</td><td>1969</td></tr>
-<tr><td>Label</td><td>Columbia</td></tr>
-<tr><td>ID</td><td>64409</td></tr>
-<tr><td>Total Time</td><td>1:16:20</td></tr>
-<tr><td><a href="https://www.allmusic.com/album/chicago-transit-authority-mw0000189364";>AMG Rating</a></td><td>4 stars</td></tr>
-<tr><td>Notes</td><td>Includes the song "Does Anybody Really Know What Time It Is?"</td></tr>
-<tr><td>&nbsp;</td><td></td></tr>
-<tr><td>Artist</td><td>Emanuele Arciuli</td></tr>
-<tr><td>Composer</td><td>William Duckworth</td></tr>
-<tr><td>CD</td><td><a href="https://neumarecords.org/ols/products/william-duckworth-the-time-curve-preludes";>The Time Curve Preludes</a></td></tr>
-<tr><td>Copyright Date</td><td>2023</td></tr>
-<tr><td>Label</td><td>Neuma</td></tr>
-<tr><td>Total Time</td><td>44:46</td></tr>
-<tr><td>Notes</td><td>The first work of postminimal music. Unlike minimalism, it does not assume that the listener has plenty of time.</td></tr>
-</table>
+</li>
+<li>
+Ken Nordine, <em>You're Getting Better: The Word Jazz Dot Masters</em> (2005).
+Geffen B0005171-02, 156:22.
+ADO &#x2605;,
+<a href="https://www.allmusic.com/album/youre-getting-better-the-word-jazz-dot-masters-mw0000736197";>AMG</a>
+&#x2605;&#x2605;&#x2605;&#x2605;&#x2BEA;.
+Includes the piece "What Time Is It"
+("He knew what time it was everywhere...that counted").
+</li>
+<li>
+Chicago, <em>Chicago Transit Authority</em> (1969). Columbia 64409, 1:16:20.
+<a href="https://www.allmusic.com/album/chicago-transit-authority-mw0000189364";>AMG</a> &#x2605;&#x2605;&#x2605;&#x2605;.
+Includes the song "Does Anybody Really Know What Time It Is?".
+</li>
+<li>
+Emanuele Arciuli,
+<a href="https://neumarecords.org/ols/products/william-duckworth-the-time-curve-preludes";><em>The Time Curve Preludes</em></a> (2023).
+Neuma 174, 44:46.
+The title piece, composed by
+<a href="https://en.wikipedia.org/wiki/William_Duckworth_(composer)">William
+Duckworth</a>, is the first work of postminimal music.
+Unlike minimalism, it does not assume that the listener has plenty of time.
+</li>
+</ul>
 <h2>Comics</h2>
 <ul>
 <li>
@@ -507,7 +450,10 @@ along with the panels
 "<a href="https://xkcd.com/2050/";>6/6 Time</a>" (2018-09-24),
 "<a href="https://xkcd.com/2092/";>Consensus New Year</a>" (2018-12-31),
 "<a href="https://xkcd.com/2266/";>Leap Smearing</a>" (2020-02-10),
-and "<a href="https://xkcd.com/2594/";>Consensus Time</a>" (2022-03-16).
+"<a href="https://xkcd.com/2594/";>Consensus Time</a>" (2022-03-16),
+"<a href="https://xkcd.com/2846/";>Daylight Saving Choice</a>" (2023-10-25),
+"<a href="https://xkcd.com/2854/";>Date Line</a>" (2023-11-13),
+and "<a href="https://xkcd.com/2867/";>DateTime</a>" (2023-12-13).
 The related book <em>What If?</em> has an entry
 "<a href="https://what-if.xkcd.com/26/";>Leap Seconds</a>" (2012-12-31).
 </li>
@@ -520,9 +466,13 @@ Before Swine</em> (2016-11-06)</a>.
 Stonehenge is abandoned in <a
 href="https://www.gocomics.com/nonsequitur/2017/03/12";><em>Non Sequitur</em>
 (2017-03-12)</a>.
+</li>
 <li>
-The boss freaks out in <a
-href="https://dilbert.com/strip/1998-03-14";><em>Dilbert</em> (1998-03-14)</a>.
+Caulfield proposes changing clocks just once a year in
+<a href="https://www.gocomics.com/frazz/2023/12/31";><em>Frazz</em>
+(2023-12-31)</a>, while Peter and Jason go multi-lingual and -zonal in
+<a href="https://www.gocomics.com/foxtrot/2023/12/31";><em>FoxTrot</em>
+(the same day)</a>.
 </li>
 <li>
 Peppermint Patty: "What if the world comes to an end tonight, Marcie?"
@@ -606,10 +556,10 @@ entitled "The Kid," originally aired 199
 </li>
 <li>
 "I put myself and my staff through this crazy, huge ordeal, all because
-I refused to go on at midnight, okay?  And so I work, you know, and
-then I get this job at eleven, supposed to be a big deal.  Then
+I refused to go on at midnight, okay? And so I work, you know, and
+then I get this job at eleven, supposed to be a big deal. Then
 yesterday daylight [saving] time ended. Right now it's basically
-midnight." (Conan O'Brien on the 2010-11-08 premiere of <em>Conan</em>.)
+midnight." (Conan O'Brien on the 2010-11-08 premiere of <em>Conan</em>)
 </li>
 <li>
 "The best method, I told folks, was to hang a large clock high on a
@@ -617,7 +567,7 @@ barn wall where all the cows could see i
 will need to use an analog clock." (Jerry Nelson, <a
 href="http://www.agriculture.com/family/farm-humor/how-to-adjust-dairy-cows-to-daylight-savings-time";>How
 to adjust dairy cows to daylight saving time</a>", <em>Successful Farming</em>,
-2017-10-09.)
+2017-10-09)
 </li>
 <li>
 "And now, driving to California, I find that I must enter a password

Index: src/lib/libc/time/tz-link.html
diff -u src/lib/libc/time/tz-link.html:1.15 src/lib/libc/time/tz-link.html:1.16
--- src/lib/libc/time/tz-link.html:1.15	Sat Dec 23 15:48:38 2023
+++ src/lib/libc/time/tz-link.html	Sat Feb 17 09:54:47 2024
@@ -114,7 +114,7 @@ Indiana, which switched from central to 
 and switched back in 2006.
 To use the database on an extended <a
 href="https://en.wikipedia.org/wiki/POSIX";><abbr
-title="Portable Operating System Interface">POSIX</abbr></a>
+title="Portable Operating System Interface">POSIX</abbr>.1-2017</a>
 implementation set the <code><abbr>TZ</abbr></code>
 environment variable to the location's full name,
 e.g., <code><abbr>TZ</abbr>="America/New_York"</code>.</p>
@@ -172,7 +172,7 @@ Since version 2022a, each release has be
 ustar interchange format</a>, compressed as described above;
 older releases use a nearly compatible format.
 Since version 2016h, each release has contained a text file named
-"<samp>version</samp>" whose first (and currently only) line is the version.
+"<code>version</code>" whose first (and currently only) line is the version.
 Older releases are <a href="https://ftp.iana.org/tz/releases/";>archived</a>,
 and are also available in an
 <a href="ftp://ftp.iana.org/tz/releases/";><abbr
@@ -362,9 +362,6 @@ lets you see the <code><abbr>TZ</abbr></
 <li><a
 href="https://www.convertit.com/Go/ConvertIt/World_Time/Current_Time.ASP";>Current
 Time in 1000 Places</a> uses descriptions of the values.</li>
-<li><a href="https://home.kpn.nl/vanadovv/time/TZworld.html";>Complete
-timezone information for all countries</a>
-displays tables of <abbr>DST</abbr> rules.
 <li><a href="https://www.timeanddate.com/worldclock/";>The World Clock &ndash;
 Worldwide</a> lets you sort zone names and convert times.</li>
 <li><a href="https://24timezones.com";>24TimeZones</a> has a world
@@ -511,12 +508,12 @@ It is freely available under the Apache 
 <li>Many modern
 <a href="https://en.wikipedia.org/wiki/JavaScript";>JavaScript</a>
 runtimes support <code><abbr>tz</abbr></code> natively via the
-<samp>timeZone</samp> option of <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat";><samp>Intl.DateTimeFormat</samp></a>.
+<code>timeZone</code> option of <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat";><code>Intl.DateTimeFormat</code></a>.
 This can be used as-is or with most of the following libraries,
-many of which also support runtimes lacking the <samp>timeZone</samp> option.
+many of which also support runtimes lacking the <code>timeZone</code> option.
 <ul>
 <li>The <a
-href="https://github.com/formatjs/date-time-format-timezone";><samp>Intl.DateTimeFormat</samp>
+href="https://github.com/formatjs/date-time-format-timezone";><code>Intl.DateTimeFormat</code>
 timezone polyfill</a>
 is freely available under a <abbr>BSD</abbr>-style license.</li>
 <li>The <a href="https://date-fns.org/";>date-fns</a>
@@ -529,7 +526,7 @@ the <a href="https://momentjs.com/docs/";
 manipulation library.
 It is freely available under the <abbr>MIT</abbr> license.</li>
 <li><a href="https://moment.github.io/luxon/";>Luxon</a> improves
-timezone support for the <samp>Intl</samp> API.
+timezone support for the <code>Intl</code> API.
 It is freely available under the <abbr>MIT</abbr> license.</li>
 <li><a href="https://momentjs.com/timezone/";>Moment Timezone</a> is a
 Moment.js plugin.
@@ -550,11 +547,11 @@ convert timestamps, view transition hist
 It is freely available under the <abbr>MIT</abbr> license.</li>
 </ul>
 The proposed <a
-href="https://github.com/tc39/proposal-temporal";><samp>Temporal</samp>
+href="https://github.com/tc39/proposal-temporal";><code>Temporal</code>
 objects</a> let programs access an abstract view of
 <code><abbr>tzdb</abbr></code> data, and are designed to replace <a
 href="https://codeofmatt.com/javascript-date-type-is-horribly-broken/";>JavaScript's
-problematic <samp>Date</samp> objects</a> when working with dates and times.
+problematic <code>Date</code> objects</a> when working with dates and times.
 <li><a href="https://github.com/JuliaTime/";>JuliaTime</a> contains a
 compiler from <code><abbr>tz</abbr></code> source into
 <a href="https://julialang.org/";>Julia</a>. It is freely available
@@ -620,6 +617,16 @@ the Apache License.</li>
 library that translates between <abbr>UT</abbr> and civil time and
 can read <abbr>TZif</abbr> files. It is freely available under the Apache
 License.</li>
+<li>The
+<a href="https://github.com/nayarsystems/posix_tz_db";><code>posix_tz_db</code>
+package</a> contains Python code
+to generate <abbr>CSV</abbr> and <abbr>JSON</abbr> tables that map
+<code><abbr>tz</abbr></code> settings to POSIX.1-2017-like approximations.
+For example, it maps <code>"Africa/Cairo"</code>
+to <code>"EET-2EEST,M4.5.5/0,M10.5.4/24"</code>,
+an approximation valid for Cairo timestamps from 2023 on.
+This can help porting to platforms that support only POSIX.1-2017.
+The package is freely available under the MIT license.</li>
 <li><a href="https://github.com/derickr/timelib";>Timelib</a> is a C
 library that reads <abbr>TZif</abbr> files and converts
 timestamps from one time zone or format to another.
@@ -666,9 +673,7 @@ available under a <abbr>BSD</abbr>-style
 <ul>
 <li><a href="https://foxclocks.org";>FoxClocks</a>
 is an extension for <a href="https://www.google.com/chrome/";>Google
-Chrome</a> and for <a
-href="https://wiki.mozilla.org/Modules/Toolkit";>Mozilla
-Toolkit</a> applications like <a
+Chrome</a>, <a
 href="https://www.mozilla.org/en-US/firefox/new/";>Firefox</a> and <a
 href="https://www.mozilla.org/en-US/thunderbird/";>Thunderbird</a>.
 It displays multiple clocks in the application window, and has a mapping
@@ -782,32 +787,9 @@ boundaries of <code><abbr>tzdb</abbr></c
 Its code is freely available under the <abbr>MIT</abbr> license, and
 its data entries are freely available under the
 <a href="https://opendatacommons.org/licenses/odbl/";>Open Data Commons
-Open Database License</a>. The maps' borders appear to be quite accurate.</li>
-<li>Programmatic interfaces that map geographical coordinates via tz_world to
-<code><abbr>tzdb</abbr></code> timezones include:
-<ul>
-<li><a href="https://github.com/mj1856/GeoTimeZone";>GeoTimeZone</a> is
-written in <a
-href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language)">C#</a>
-and is freely available under the <abbr>MIT</abbr> license.</li>
-<li>The <a href="https://github.com/bradfitz/latlong";>latlong package</a>
-is written in Go and is freely available under the Apache License.</li>
-<li><a href="https://github.com/drtimcooper/LatLongToTimezone";>LatLongToTimezone</a>,
-in both Java and
-<a href="https://en.wikipedia.org/wiki/Swift_(programming_language)">Swift</a>
-form, is freely available under the MIT license.</li>
-<li>For Node.js,
-the <a href="https://www.npmjs.com/package/geo-tz";>geo-tz module</a>
-is freely available under the MIT license, and
-the <a href="https://www.npmjs.com/package/tz-lookup";>tz-lookup module</a>
-is in the public domain.</li>
-<li>The <a
-href="https://github.com/MrMinimal64/timezonefinder";>timezonefinder</a>
-library for Python is freely available under the MIT license.
-<li>The <a
-href="https://github.com/gunyarakun/timezone_finder";>timezone_finder</a>
-library for Ruby is freely available under the MIT license.</li>
-</ul></li>
+Open Database License</a>. The borders appear to be quite accurate.
+Its main web page lists more than twenty libraries
+for looking up a timezone name from a GPS coordinate.</li>
 <li>Free access via a network API, if you register a key, is provided by
 the <a
 href="https://www.geonames.org/export/web-services.html#timezone";>GeoNames
@@ -826,12 +808,9 @@ coordinates?</a>" discusses other geoloc
 <li><a href="http://statoids.com/statoids.html";>Administrative
 Divisions of Countries ("Statoids")</a> lists
 political subdivision data related to time zones.</li>
-<li><a href="https://home.kpn.nl/vanadovv/time/Multizones.html";>Time
-zone boundaries for multizone countries</a> summarizes legal
-boundaries between time zones within countries.</li>
 <li><a href="https://manifold.net/info/freestuff.shtml";>Manifold Software
 &ndash; GIS and Database Tools</a> includes a Manifold-format map of
-world time zone boundaries distributed under the
+world time zone boundaries circa 2007, distributed under the
 <abbr>GPL</abbr>.</li>
 <li>A ship within the <a
 href="https://en.wikipedia.org/wiki/Territorial_waters";>territorial
@@ -862,7 +841,7 @@ Lords</a> discusses how authoritarians m
 <li><a href="https://www.w3.org/TR/timezone/";>Working with Time Zones</a>
 contains guidelines and best practices for software applications that
 deal with civil time.</li>
-<li><a href="https://www.staff.science.uu.nl/~gent0113/idl/idl.htm";>A History of
+<li><a href="https://webspace.science.uu.nl/~gent0113/idl/idl.htm";>A History of
 the International Date Line</a> tells the story of the most important
 time zone boundary.</li>
 <li><a href="http://statoids.com/tconcept.html";>Basic Time
@@ -875,7 +854,7 @@ Zone Concepts</a> discusses terminologic
 <dl>
 <dt>Australia</dt>
 <dd>The Parliamentary Library commissioned a <a
-href="https://www.aph.gov.au/binaries/library/pubs/rp/2009-10/10rp10.pdf";>research
+href="https://parlinfo.aph.gov.au/parlInfo/download/library/prspub/359V6/upload_binary/359v60.pdf";>research
 paper on daylight saving time in Australia</a>.
 The Bureau of Meteorology publishes a list of <a
 href="http://www.bom.gov.au/climate/averages/tables/dst_times.shtml";>Implementation
@@ -883,9 +862,9 @@ Dates of Daylight Savings Time within Au
 <dt>Belgium</dt>
 <dd>The Royal Observatory of Belgium maintains a table of time in
 Belgium (in
-<a href="https://www.astro.oma.be/GENERAL/INFO/nli001a.html";
+<a href="https://robinfo.oma.be/nl/astro-info/tijd/";
 hreflang="nl">Dutch</a> and <a
-href="https://www.astro.oma.be/GENERAL/INFO/fri001a.html";
+href="https://robinfo.oma.be/fr/astro-info/heure/";
 hreflang="fr">French</a>).</dd>
 <dt>Brazil</dt>
 <dd>The Time Service Department of the National Observatory
@@ -929,7 +908,7 @@ Congress has published a <a
 href="https://www.diputados.gob.mx/bibliot/publica/inveyana/polisoc/horver/index.htm";
 hreflang="es">history of Mexican local time (in Spanish)</a>.</dd>
 <dt>Netherlands</dt>
-<dd><a href="https://www.staff.science.uu.nl/~gent0113/wettijd/wettijd.htm";
+<dd><a href="https://webspace.science.uu.nl/~gent0113/wettijd/wettijd.htm";
 hreflang="nl">Legal time in the Netherlands (in Dutch)</a>
 covers the history of local time in the Netherlands from ancient times.</dd>
 <dt>New Zealand</dt>
@@ -938,7 +917,7 @@ href="https://www.dia.govt.nz/Daylight-S
 Daylight Saving</a>.</dd>
 <dt>Palestine</dt>
 <dd>The Ministry of Telecom and IT publishes a <a
-href="https://mtit.pna.ps/Site/TimeZoon";
+href="https://mtit.pna.ps/home/TimeZone";
 hreflang="ar">history of clock changes (in Arabic)</a>.</dd>
 <dt>Portugal</dt>
 <dd>The Lisbon Astronomical Observatory publishes a
@@ -986,14 +965,17 @@ neither supports nor refutes road safety
 shifts in time zones.</li>
 <li>Havranek T, Herman D, Irsova D.
 <a href="https://www.iaee.org/en/publications/ejarticle.aspx?id=3051";>Does
-daylight saving save electricity? A meta-analysis.</a>
+daylight saving save electricity? A meta-analysis</a>.
 <em>Energy J.</em> 2018;39(2):35&ndash;61.
 doi:<a href="https://doi.org/10.5547/01956574.39.2.thav";>10.5547/01956574.39.2.thav</a>.
 This analyzes research literature and concludes, "Electricity savings
 are larger for countries farther away from the equator, while
 subtropical regions consume more electricity because of <abbr>DST</abbr>."</li>
-<li>Malow BA. It is time to abolish the clock change and adopt permanent
-standard time in the United States: a Sleep Research Society position statement.
+<li>Malow BA. <a
+href="https://academic.oup.com/sleep/article/45/12/zsac236/6717940";>It is time
+to abolish the clock change and adopt permanent
+standard time in the United States:
+a Sleep Research Society position statement</a>.
 <em>Sleep.</em> 2022;45(12):zsac236.
 doi:<a href="https://doi.org/10.1093/sleep/zsac236";>10.1093/sleep/zsac236</a>.
 After reviewing the scientific literature, the Sleep Research Society
@@ -1002,13 +984,13 @@ advocates permanent standard time due to
 <a href="https://jcsm.aasm.org/doi/10.5664/jcsm.10898";>Permanent standard time
 is the optimal choice for health and safety:
 an American Academy of Sleep Medicine position statement</a>.
-<em>J Clin Sleep Med.</em> 2023-10-31.
+<em>J Clin Sleep Med.</em> 2024;20(1):121&ndash;125.
 doi:<a href="https://doi.org/10.5664/jcsm.10898";>10.5664/jcsm.10898</a>.
 The AASM argues for permanent standard time due to health and safety risks
 and economic costs of both <abbr>DST</abbr> transitions and
 permanent <abbr>DST</abbr>.</li>
 <li>Roenneberg T, Wirz-Justice A, Skene DJ <em>et al</em>.
-<a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7205184/";>Why
+<a href="https://journals.sagepub.com/doi/10.1177/0748730419854197";>Why
 should we abolish Daylight Saving Time?</a>
 <em>J Biol Rhythms.</em> 2019;34(3):227&ndash;230.
 doi:<a href="https://doi.org/10.1177/0748730419854197";>10.1177/0748730419854197</a>.
@@ -1128,9 +1110,12 @@ might be redefined
 without Leap Seconds</a> gives pointers on this
 contentious issue.
 The General Conference on Weights and Measures
-<a href="https://www.bipm.org/en/cgpm-2022/resolution-4";>voted in 2022</a>
+<a href="https://www.bipm.org/en/cgpm-2022/resolution-4";>decided in 2022</a>
 to discontinue the use of leap seconds by 2035, replacing them with an
 as-yet-undetermined scheme some time after the year 2135.
+The World Radiocommunication Conference <a
+href="https://www.itu.int/dms_pub/itu-r/opb/act/R-ACT-WRC.15-2023-PDF-E.pdf";>resolved
+in 2023</a> to cooperate with this process.
 </li>
 </ul>
 </section>

Index: src/lib/libc/time/tzfile.5
diff -u src/lib/libc/time/tzfile.5:1.34 src/lib/libc/time/tzfile.5:1.35
--- src/lib/libc/time/tzfile.5:1.34	Sat Sep 16 14:40:26 2023
+++ src/lib/libc/time/tzfile.5	Sat Feb 17 09:54:47 2024
@@ -1,9 +1,9 @@
-.\"	$NetBSD: tzfile.5,v 1.34 2023/09/16 18:40:26 christos Exp $
+.\"	$NetBSD: tzfile.5,v 1.35 2024/02/17 14:54:47 christos Exp $
 .\"
 .\" @(#)tzfile.5	8.3
 .\" This file is in the public domain, so clarified as of
 .\" 2009-05-17 by Arthur David Olson.
-.Dd September 16, 2023
+.Dd February 17, 2023
 .Dt TZFILE 5
 .Os
 .Sh NAME
@@ -82,7 +82,7 @@ described in the file is associated with
 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-style TZ string described below.)
+POSIX.1-2017-style TZ string described below.)
 These values serve as indices into the next field.
 .It Va tzh_typecnt
 .Va ttinfo
@@ -184,7 +184,8 @@ must also be set.
 .Pp
 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-style TZ string that lacks rules.
+for another time zone specified via
+a POSIX.1-2017-style TZ string that lacks rules.
 For example, when
 .Dv TZ="EET\*-2EEST"
 and there is no TZif file
@@ -222,13 +223,14 @@ the above header and data are followed b
 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,
-POSIX-TZ-environment-variable-style string for use in handling instants
+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,
+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 POSIX-style TZ string is empty (i.e., nothing between the newlines)
-if there is no POSIX-style representation for such instants.
-If nonempty, the POSIX-style TZ string must agree with the local time
+The TZ string is empty (i.e., nothing between the newlines)
+if there is no POSIX.1-2017-style 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
 .Dq WET0WEST,M3.5.0/1,M10.5.0
@@ -240,8 +242,8 @@ Also, if there is at least one transitio
 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 POSIX-TZ-style string may
-use two minor extensions to the POSIX TZ format, as described in
+For version-3-format timezone files, the TZ string may
+use two minor extensions to the POSIX.1-2017 TZ format, as described in
 .Xr tzset 3 .
 First, the hours part of its transition times may be signed and range from
 \-167 through 167
@@ -362,7 +364,7 @@ version 2+ data even if the reader's nat
 .It
 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 in the TZ-like string.
+they cannot parse extensions to POSIX.1-2017 in the TZ-like 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.
@@ -414,7 +416,7 @@ Some readers mishandle a transition if i
 the minimum possible signed 64-bit value.
 Timestamps less than \&-2**59 are not recommended.
 .It
-Some readers mishandle POSIX-style TZ strings that
+Some readers mishandle TZ strings that
 contain
 .Dq <
 or
@@ -442,12 +444,12 @@ Some readers mishandle TZif files that s
 daylight-saving time UT offsets that are less than the UT
 offsets for the corresponding standard time.
 These readers do not support locations like Ireland, which
-uses the equivalent of the POSIX TZ string
+uses the equivalent of the TZ string
 .Dq IST\&-1GMT0,M10.5.0,M3.5.0/1 ,
 observing standard time
 (IST, +01) in summer and daylight saving time (GMT, +00) in winter.
 As a partial workaround, a writer can output data for the
-equivalent of the POSIX TZ string
+equivalent of the TZ string
 .Dq GMT0IST,M3.5.0/1,M10.5.0 ,
 thus swapping standard and daylight saving time.
 Although this workaround misidentifies which part of the year

Index: src/lib/libc/time/tzselect.ksh
diff -u src/lib/libc/time/tzselect.ksh:1.22 src/lib/libc/time/tzselect.ksh:1.23
--- src/lib/libc/time/tzselect.ksh:1.22	Sat Sep 16 14:40:26 2023
+++ src/lib/libc/time/tzselect.ksh	Sat Feb 17 09:54:47 2024
@@ -3,7 +3,7 @@
 # Ask the user about the time zone, and output the resulting TZ value to stdout.
 # Interact with the user via stderr and stdin.
 #
-#	$NetBSD: tzselect.ksh,v 1.22 2023/09/16 18:40:26 christos Exp $
+#	$NetBSD: tzselect.ksh,v 1.23 2024/02/17 14:54:47 christos Exp $
 #
 PKGVERSION='(tzcode) '
 TZVERSION=see_Makefile
@@ -38,9 +38,13 @@ REPORT_BUGS_TO=t...@iana.org
 #	nawk <https://github.com/onetrueawk/awk>
 
 
+# This script does not want path expansion.
+set -f
+
 # Specify default values for environment variables if they are unset.
 : ${AWK=awk}
-: ${TZDIR=`pwd`}
+: ${PWD=`pwd`}
+: ${TZDIR=$PWD}
 
 # Output one argument as-is to standard output, with trailing newline.
 # Safer than 'echo', which can mishandle '\' or leading '-'.
@@ -111,7 +115,8 @@ then
 else
   doselect() {
     # Field width of the prompt numbers.
-    select_width=`expr $# : '.*'`
+    print_nargs_length="BEGIN {print length(\"$#\");}"
+    select_width=`$AWK "$print_nargs_length"`
 
     select_i=
 
@@ -122,14 +127,14 @@ else
 	select_i=0
 	for select_word
 	do
-	  select_i=`expr $select_i + 1`
+	  select_i=`$AWK "BEGIN { print $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 `expr $select_i - 1`
+	  shift `$AWK "BEGIN { print $select_i - 1 }"`
 	  select_result=$1
 	  break
 	fi
@@ -163,7 +168,7 @@ do
     esac
 done
 
-shift `expr $OPTIND - 1`
+shift `$AWK "BEGIN { print $OPTIND - 1 }"`
 case $# in
 0) ;;
 *) say >&2 "$0: $1: unknown argument"; exit 1 ;;
@@ -400,19 +405,24 @@ while
 	eval '
 	    doselect '"$quoted_continents"' \
 		"coord - I want to use geographical coordinates." \
-		"TZ - I want to specify the timezone using the Posix TZ format." \
+		"TZ - I want to specify the timezone using a POSIX.1-2017 TZ string." \
 		"time - I know local time already."
 	    continent=$select_result
 	    case $continent in
 	    Americas) continent=America;;
-	    *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
+	    *)
+		# Get the first word of $continent.  Path expansion is disabled
+		# so this works even with "*", which should not happen.
+		IFS=" "
+		for continent in $continent ""; do break; done
+		IFS=$newline;;
 	    esac
 	'
 	esac
 
 	case $continent in
 	TZ)
-		# Ask the user for a Posix TZ string.  Check that it conforms.
+		# Ask the user for a POSIX.1-2017 TZ string.  Check that it conforms.
 		while
 			echo >&2 'Please enter the desired value' \
 				'of the TZ environment variable.'
@@ -436,7 +446,7 @@ while
 				exit 0
 			}'
 		do
-		    say >&2 "'$TZ' is not a conforming Posix timezone string."
+		    say >&2 "'$tz' is not a conforming POSIX.1-2017 timezone string."
 		done
 		TZ_for_date=$TZ;;
 	*)
@@ -456,7 +466,7 @@ while
 			    -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
 			    "$output_distances_or_times" <"$TZ_ZONE_TABLE" |
 		      sort -n |
-		      sed "${location_limit}q"
+		      $AWK "{print} NR == $location_limit { exit }"
 		    `
 		    regions=`$AWK \
 		      -v distance_table="$distance_table" '
@@ -640,15 +650,18 @@ while
 	do
 		TZdate=`LANG=C TZ="$TZ_for_date" date`
 		UTdate=`LANG=C TZ=UTC0 date`
-		TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
-		UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
-		case $TZsec in
-		$UTsec)
+		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"
+		then
 			extra_info="
 Selected time is now:	$TZdate.
 Universal Time is now:	$UTdate."
 			break
-		esac
+		fi
 	done
 
 

Index: src/lib/libc/time/version
diff -u src/lib/libc/time/version:1.24 src/lib/libc/time/version:1.25
--- src/lib/libc/time/version:1.24	Sat Sep 16 14:40:26 2023
+++ src/lib/libc/time/version	Sat Feb 17 09:54:47 2024
@@ -1 +1 @@
-2023c
+2024a

Index: src/lib/libc/time/zic.8
diff -u src/lib/libc/time/zic.8:1.49 src/lib/libc/time/zic.8:1.50
--- src/lib/libc/time/zic.8:1.49	Thu Dec  7 18:42:28 2023
+++ src/lib/libc/time/zic.8	Sat Feb 17 09:54:47 2024
@@ -1,9 +1,9 @@
-.\" $NetBSD: zic.8,v 1.49 2023/12/07 23:42:28 kre Exp $
+.\" $NetBSD: zic.8,v 1.50 2024/02/17 14:54:47 christos Exp $
 .\" @(#)zic.8	8.6
 .\" This file is in the public domain, so clarified as of
 .\" 2009-05-17 by Arthur David Olson.
 .\" .TH zic 8
-.Dd December 6, 2023
+.Dd February 17, 2024
 .Dt ZIC 8
 .Os
 .Sh NAME
@@ -151,7 +151,7 @@ boundaries, particularly if
 causes a TZif file to contain explicit entries for
 .No pre- Ns Ar hi
 transitions rather than concisely representing them
-with an extended POSIX TZ string.
+with an extended POSIX.1-2017 TZ string.
 Also see the
 .Fl b Cm slim
 option for another way to shrink output size.
@@ -160,10 +160,10 @@ Generate redundant trailing explicit tra
 that occur less than
 .Ar hi
 seconds since the Epoch, even though the transitions could be
-more concisely represented via the extended POSIX TZ string.
+more concisely represented via the extended POSIX.1-2017 TZ string.
 This option does not affect the represented timestamps.
 Although it accommodates nonstandard TZif readers
-that ignore the extended POSIX TZ string,
+that ignore the extended POSIX.1-2017 TZ string,
 it increases the size of the altered output files.
 .It Fl t Ar file
 When creating local time information, put the configuration link in
@@ -222,11 +222,11 @@ for
 .It
 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 TZ string.
+an extended POSIX.1-2017 TZ string.
 For example, as of 2023 this problem
 occurs for Morocco's daylight-saving rules, as
 on predictions for when Ramadan will be observed, something that
-an extended POSIX TZ string cannot represent.
+an extended POSIX.1-2017 TZ string cannot represent.
 .It
 The output contains data that may not be handled properly by client
 code designed for older
@@ -356,24 +356,15 @@ an unquoted name should not contain char
 Gives the first year in which the rule applies.
 Any signed integer year can be supplied; the proleptic Gregorian calendar
 is assumed, with year 0 preceding year 1.
-The word
-.Ql minimum
-(or an abbreviation) means the indefinite past.
-The word
-.Ql maximum
-(or an abbreviation) means the indefinite future.
 Rules can describe times that are not representable as time values,
 with the unrepresentable times ignored; this allows rules to be portable
 among hosts with differing time value types.
 .\"
 .It Ar TO
 Gives the final year in which the rule applies.
-In addition to
-.Ql minimum
-and
+The word
 .Ql maximum
-(as above),
-the word
+(or an abbreviation) means the indefinite future, and the word
 .Ql only
 (or an abbreviation)
 may be used to repeat the value of the

Index: src/lib/libc/time/zic.c
diff -u src/lib/libc/time/zic.c:1.90 src/lib/libc/time/zic.c:1.91
--- src/lib/libc/time/zic.c:1.90	Sat Sep 16 14:40:26 2023
+++ src/lib/libc/time/zic.c	Sat Feb 17 09:54:47 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: zic.c,v 1.90 2023/09/16 18:40:26 christos Exp $	*/
+/*	$NetBSD: zic.c,v 1.91 2024/02/17 14:54:47 christos Exp $	*/
 /*
 ** This file is in the public domain, so clarified as of
 ** 2006-07-17 by Arthur David Olson.
@@ -11,7 +11,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: zic.c,v 1.90 2023/09/16 18:40:26 christos Exp $");
+__RCSID("$NetBSD: zic.c,v 1.91 2024/02/17 14:54:47 christos Exp $");
 #endif /* !defined lint */
 
 /* Use the system 'time' function, instead of any private replacement.
@@ -47,6 +47,9 @@ static zic_t const
 # define ZIC_MAX_ABBR_LEN_WO_WARN 6
 #endif /* !defined ZIC_MAX_ABBR_LEN_WO_WARN */
 
+/* Minimum and maximum years, assuming signed 32-bit time_t.  */
+enum { YEAR_32BIT_MIN = 1901, YEAR_32BIT_MAX = 2038 };
+
 /* An upper bound on how much a format might grow due to concatenation.  */
 enum { FORMAT_LEN_GROWTH_BOUND = 5 };
 
@@ -105,7 +108,6 @@ struct rule {
 
 	zic_t		r_loyear;	/* for example, 1986 */
 	zic_t		r_hiyear;	/* for example, 1986 */
-	bool		r_lowasnum;
 	bool		r_hiwasnum;
 
 	int		r_month;	/* 0..11 */
@@ -345,7 +347,7 @@ enum {
 */
 
 enum {
-  YR_MINIMUM,
+  YR_MINIMUM, /* "minimum" is for backward compatibility only */
   YR_MAXIMUM,
   YR_ONLY
 };
@@ -429,12 +431,10 @@ static struct lookup const	lasts[] = {
 
 static struct lookup const	begin_years[] = {
 	{ "minimum",	YR_MINIMUM },
-	{ "maximum",	YR_MAXIMUM },
 	{ NULL,		0 }
 };
 
 static struct lookup const	end_years[] = {
-	{ "minimum",	YR_MINIMUM },
 	{ "maximum",	YR_MAXIMUM },
 	{ "only",	YR_ONLY },
 	{ NULL,		0 }
@@ -2165,13 +2165,12 @@ rulesub(struct rule *rp, const char *loy
 	*/
 	cp = loyearp;
 	lp = byword(cp, begin_years);
-	rp->r_lowasnum = lp == NULL;
-	if (!rp->r_lowasnum) switch (lp->l_value) {
+	if (lp) switch (lp->l_value) {
 		case YR_MINIMUM:
-			rp->r_loyear = ZIC_MIN;
-			break;
-		case YR_MAXIMUM:
-			rp->r_loyear = ZIC_MAX;
+			warning(_("FROM year \"%s\" is obsolete;"
+				  " treated as %d"),
+				cp, YEAR_32BIT_MIN - 1);
+			rp->r_loyear = YEAR_32BIT_MIN - 1;
 			break;
 		default: unreachable();
 	} else if (sscanf(cp, "%"SCNdZIC"%c", &rp->r_loyear, &xs) != 1) {
@@ -2182,9 +2181,6 @@ rulesub(struct rule *rp, const char *loy
 	lp = byword(cp, end_years);
 	rp->r_hiwasnum = lp == NULL;
 	if (!rp->r_hiwasnum) switch (lp->l_value) {
-		case YR_MINIMUM:
-			rp->r_hiyear = ZIC_MIN;
-			break;
 		case YR_MAXIMUM:
 			rp->r_hiyear = ZIC_MAX;
 			break;
@@ -2967,6 +2963,10 @@ rule_cmp(struct rule const *a, struct ru
 	return a->r_dayofmonth - b->r_dayofmonth;
 }
 
+/* Store into RESULT a POSIX.1-2017 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.  */
 static int
 stringzone(char *result, int resultlen, const struct zone *const zpfirst,
     const int zonecount)
@@ -3104,7 +3104,6 @@ outzone(const struct zone *zpfirst, ptrd
 	char *			envvar;
 	size_t			max_abbr_len;
 	size_t			max_envvar_len;
-	bool			prodstic; /* all rules are min to max */
 	int			compat;
 	bool			do_extend;
 	char			version;
@@ -3129,7 +3128,6 @@ outzone(const struct zone *zpfirst, ptrd
 	timecnt = 0;
 	typecnt = 0;
 	charcnt = 0;
-	prodstic = zonecount == 1;
 	/*
 	** Thanks to Earl Chew
 	** for noting the need to unconditionally initialize startttisstd.
@@ -3147,12 +3145,9 @@ outzone(const struct zone *zpfirst, ptrd
 			updateminmax(zp->z_untilrule.r_loyear);
 		for (j = 0; j < zp->z_nrules; ++j) {
 			struct rule *rp = &zp->z_rules[j];
-			if (rp->r_lowasnum)
-				updateminmax(rp->r_loyear);
+			updateminmax(rp->r_loyear);
 			if (rp->r_hiwasnum)
 				updateminmax(rp->r_hiyear);
-			if (rp->r_lowasnum || rp->r_hiwasnum)
-				prodstic = false;
 		}
 	}
 	/*
@@ -3164,7 +3159,8 @@ outzone(const struct zone *zpfirst, ptrd
 	if (noise) {
 		if (!*envvar)
 			warning("%s %s",
-				_("no POSIX environment variable for zone"),
+				_("no POSIX.1-2017 environment variable"
+				  " for zone"),
 				zpfirst->z_name);
 		else if (compat != 0) {
 			/* Circa-COMPAT clients, and earlier clients, might
@@ -3176,37 +3172,12 @@ outzone(const struct zone *zpfirst, ptrd
 		}
 	}
 	if (do_extend) {
-		/*
-		** Search through a couple of extra years past the obvious
-		** 400, to avoid edge cases.  For example, suppose a non-POSIX
-		** rule applies from 2012 onwards and has transitions in March
-		** and September, plus some one-off transitions in November
-		** 2013.  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, less than 400 years
-		** after the last one-off transition in 2013-11.  Two years
-		** might be overkill, but with the kind of edge cases
-		** available we're not sure that one year would suffice.
-		*/
-		enum { years_of_observations = YEARSPERREPEAT + 2 };
-
 		if (min_year >= ZIC_MIN + years_of_observations)
 			min_year -= years_of_observations;
 		else	min_year = ZIC_MIN;
 		if (max_year <= ZIC_MAX - years_of_observations)
 			max_year += years_of_observations;
 		else	max_year = ZIC_MAX;
-		/*
-		** Regardless of any of the above,
-		** for a "proDSTic" zone which specifies that its rules
-		** always have and always will be in effect,
-		** we only need one cycle to define the zone.
-		*/
-		if (prodstic) {
-			min_year = 1900;
-			max_year = min_year + years_of_observations;
-		}
 	}
 	max_year = max(max_year, (redundant_time / (SECSPERDAY * DAYSPERNYEAR)
 				  + EPOCH_YEAR + 1));
@@ -3214,10 +3185,10 @@ outzone(const struct zone *zpfirst, ptrd
 	if (want_bloat()) {
 	  /* For the benefit of older systems,
 	     generate data from 1900 through 2038.  */
-	  if (min_year > 1900)
-		min_year = 1900;
-	  if (max_year < 2038)
-		max_year = 2038;
+	  if (min_year > YEAR_32BIT_MIN - 1)
+		min_year = YEAR_32BIT_MIN - 1;
+	  if (max_year < YEAR_32BIT_MAX)
+		max_year = YEAR_32BIT_MAX;
 	}
 
 	if (min_time < lo_time || hi_time < max_time)
@@ -3437,8 +3408,8 @@ error(_("can't determine time zone abbre
 	  attypes[lastatmax].dontmerge = true;
 	if (do_extend) {
 		/*
-		** If we're extending the explicitly listed observations
-		** for 400 years because we can't fill the POSIX-TZ field,
+		** If we're extending the explicitly listed observations for
+		** 400 years because we can't fill the POSIX.1-2017 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

Reply via email to