<div dir="ltr">Fixing up a small typo in the comments.<div><br></div><div>One drawback of this approach is that such lines will need to be merged into the appropriate long-term zonenow entry after the date listed.<br><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">--<br>Tim Parenti<br></div></div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 19 Dec 2023 at 02:30, Paul Eggert via tz <<a href="mailto:tz@iana.org">tz@iana.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">* Makefile (ZONETABLES, VERSION_DEPS): Add zonenow.tab.<br>
(CHECK_NOW_TIMESTAMP, CHECK_NOW_FUTURE_YEARS, CHECK_NOW_FUTURE_SECS):<br>
New macros.<br>
(check_now): New target rule.<br>
(check_mild): Depend on it.<br>
* NEWS: Mention this new feature.<br>
* checknow.awk, zonenow.tab: New files.<br>
* checktab.awk: Adjust (i.e., loosen) checks for zonenow.tab.<br>
* tzselect.ksh (TZ_ZONETABTYPE_TABLE, TZ_ZONENOW_TABLE):<br>
New vars, so that the code can switch back and for easily between<br>
zone1970.tab and zonenow.tab.<br>
(TZ_ZONE_TABLE): Set to one of those two vars, depending on user.<br>
Let users choose ‘now’ if they care only about timestamps from now on.<br>
Narrow ‘regions’ based on ‘now’ selection, if possible (which it<br>
always is, with the current data).<br>
---<br>
Makefile | 31 +++++-<br>
NEWS | 11 ++<br>
checknow.awk | 53 +++++++++<br>
checktab.awk | 7 +-<br>
tzselect.ksh | 49 +++++++--<br>
zonenow.tab | 298 +++++++++++++++++++++++++++++++++++++++++++++++++++<br>
6 files changed, 435 insertions(+), 14 deletions(-)<br>
create mode 100644 checknow.awk<br>
create mode 100644 zonenow.tab<br>
<br>
diff --git a/Makefile b/Makefile<br>
index a6051531..f473af67 100644<br>
--- a/Makefile<br>
+++ b/Makefile<br>
@@ -580,7 +580,7 @@ YDATA= $(PRIMARY_YDATA) etcetera<br>
NDATA= factory<br>
TDATA_TO_CHECK= $(YDATA) $(NDATA) backward<br>
TDATA= $(YDATA) $(NDATA) $(BACKWARD)<br>
-ZONETABLES= zone1970.tab zone.tab<br>
+ZONETABLES= zone.tab zone1970.tab zonenow.tab<br>
TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)<br>
LEAP_DEPS= leapseconds.awk leap-seconds.list<br>
TZDATA_ZI_DEPS= ziguard.awk zishrink.awk version $(TDATA) \<br>
@@ -619,7 +619,7 @@ VERSION_DEPS= \<br>
tzfile.5 tzfile.h tzselect.8 tzselect.ksh \<br>
workman.sh zdump.8 zdump.c zic.8 zic.c \<br>
ziguard.awk zishrink.awk \<br>
- zone.tab zone1970.tab<br>
+ zone.tab zone1970.tab zonenow.tab<br>
<br>
all: tzselect zic zdump libtz.a $(TABDATA) \<br>
vanguard.zi main.zi rearguard.zi<br>
@@ -825,7 +825,8 @@ tzselect: tzselect.ksh version<br>
<br>
check: check_back check_mild<br>
check_mild: check_character_set check_white_space check_links \<br>
- check_name_lengths check_slashed_abbrs check_sorted \<br>
+ check_name_lengths check_now \<br>
+ check_slashed_abbrs check_sorted \<br>
check_tables check_web check_ziguard check_zishrink check_tzs<br>
<br>
check_character_set: $(ENCHILADA)<br>
@@ -893,7 +894,29 @@ check_links: checklinks.awk tzdata.zi<br>
-f checklinks.awk tzdata.zi<br>
touch $@<br>
<br>
-check_tables: checktab.awk $(YDATA) backward $(ZONETABLES)<br>
+# Check timestamps from now through 28 years from now, to make sure<br>
+# that zonenow.tab contains all sequences of planned timestamps,<br>
+# without any duplicate sequences. In theory this might require<br>
+# 2800 years but that would take a long time to check.<br>
+CHECK_NOW_TIMESTAMP = `./date +%s`<br>
+CHECK_NOW_FUTURE_YEARS = 28<br>
+CHECK_NOW_FUTURE_SECS = $(CHECK_NOW_FUTURE_YEARS) '*' 366 '*' 24 '*' 60 '*' 60<br>
+check_now: checknow.awk date tzdata.zi zdump zic zone1970.tab zonenow.tab<br>
+ rm -fr $@.dir<br>
+ mkdir $@.dir<br>
+ ./zic -d $@.dir tzdata.zi<br>
+ now=$(CHECK_NOW_TIMESTAMP) && \<br>
+ future=`expr $(CHECK_NOW_FUTURE_SECS) + $$now` && \<br>
+ ./zdump -i -t $$now,$$future \<br>
+ $$(find $$PWD/$@.dir/????*/ -type f) \<br>
+ >$@.dir/zdump.tab<br>
+ $(AWK) \<br>
+ -v zdump_table=$@.dir/zdump.tab \<br>
+ -f checknow.awk zonenow.tab<br>
+ rm -fr $@.dir<br>
+ touch $@<br>
+<br>
+check_tables: checktab.awk $(YDATA) backward zone.tab zone1970.tab<br>
for tab in $(ZONETABLES); do \<br>
test "$$tab" = zone.tab && links='$(BACKWARD)' || links=''; \<br>
$(AWK) -f checktab.awk -v zone_table=$$tab $(YDATA) $$links \<br>
diff --git a/NEWS b/NEWS<br>
index f2d0bc3c..43070aae 100644<br>
--- a/NEWS<br>
+++ b/NEWS<br>
@@ -5,6 +5,7 @@ Unreleased, experimental changes<br>
Briefly:<br>
Ittoqqortoormiit, Greenland changes time zones on 2024-03-31.<br>
Code and data fixes for Palestine timestamps starting in 2072.<br>
+ A new data file zonenow.tab for timestamps starting now.<br>
<br>
Changes to future timestamps<br>
<br>
@@ -25,6 +26,13 @@ Unreleased, experimental changes<br>
This does not affect UTC offsets, only the tm_isdst flag.<br>
(Thanks to Thomas M. Steenholdt.)<br>
<br>
+ New data file<br>
+<br>
+ A new data file zonenow.tab helps configure applications that use<br>
+ timestamps dated from now on. This simplifies configuration,<br>
+ since users choose from a smaller Zone set. The file's format is<br>
+ experimental and subject to change.<br>
+<br>
Changes to code<br>
<br>
localtime.c no longer mishandles TZif files that contain a single<br>
@@ -32,6 +40,9 @@ Unreleased, experimental changes<br>
DST was in effect before the transition too. (Thanks to Alois<br>
Treindl for debugging help.)<br>
<br>
+ tzselect now optionally reads zonenow.tab, to simplify when<br>
+ configuring only for timestamps dated from now on.<br>
+<br>
tzselect no longer creates temporary files.<br>
<br>
tzselect no longer mishandles the following:<br>
diff --git a/checknow.awk b/checknow.awk<br>
new file mode 100644<br>
index 00000000..51ee998f<br>
--- /dev/null<br>
+++ b/checknow.awk<br>
@@ -0,0 +1,53 @@<br>
+# Check zonenow.tab for consistency with primary data.<br>
+<br>
+# Contributed by Paul Eggert. This file is in the public domain.<br>
+<br>
+function record_zone(zone, data) {<br>
+ if (zone) {<br>
+ zone_data[zone] = data<br>
+ zones[data] = zones[data] " " zone<br>
+ }<br>
+}<br>
+<br>
+BEGIN {<br>
+ while (getline <zdump_table) {<br>
+ if ($0 ~ /^TZ/) {<br>
+ record_zone(zone, data)<br>
+ zone = $0<br>
+ sub(/.*\.dir\//, "", zone)<br>
+ sub(/"/, "", zone)<br>
+ data = ""<br>
+ } else if ($0 ~ /./)<br>
+ data = data $0 "\n"<br>
+ }<br>
+ record_zone(zone, data)<br>
+ FS = "\t"<br>
+}<br>
+<br>
+/^[^#]/ {<br>
+ zone = $3<br>
+ data = zone_data[zone]<br>
+ if (!data) {<br>
+ printf "%s: no data\n"<br>
+ status = 1<br>
+ } else {<br>
+ zone2 = zonenow[data]<br>
+ if (zone2) {<br>
+ printf "zones %s and %s identical from now on\n", zone, zone2<br>
+ status = 1<br>
+ } else<br>
+ zonenow[data] = zone<br>
+ }<br>
+}<br>
+<br>
+END {<br>
+ for (zone in zone_data) {<br>
+ data = zone_data[zone]<br>
+ if (!zonenow[data]) {<br>
+ printf "checknow.tab should have one of:%s\n", zones[data]<br>
+ zonenow[data] = zone # This suppresses duplicate diagnostics.<br>
+ status = 1<br>
+ }<br>
+ }<br>
+ exit status<br>
+}<br>
diff --git a/checktab.awk b/checktab.awk<br>
index 2dbf485f..9a26e465 100644<br>
--- a/checktab.awk<br>
+++ b/checktab.awk<br>
@@ -83,7 +83,7 @@ BEGIN {<br>
cc = cca[i]<br>
if (cc2name[cc]) {<br>
cc_used[cc]++<br>
- } else {<br>
+ } else if (! (cc == "XX" && zone_table == "zonenow.tab")) {<br>
printf "%s:%d: %s: unknown country code\n", \<br>
zone_table, zone_NR, cc >>"/dev/stderr"<br>
status = 1<br>
@@ -110,7 +110,7 @@ BEGIN {<br>
used_max_cc = cc<br>
}<br>
}<br>
- if (used_max <= 1 && comments) {<br>
+ if (used_max <= 1 && comments && zone_table != "zonenow.tab") {<br>
printf "%s:%d: unnecessary comment '%s'\n", \<br>
zone_table, i, comments \<br>
>>"/dev/stderr"<br>
@@ -149,7 +149,8 @@ $1 ~ /^#/ { next }<br>
if ($3 ~ /%/) rulePercentUsed[$2] = 1<br>
}<br>
if (tz && tz ~ /\// && tz !~ /^Etc\//) {<br>
- if (!tztab[tz] && FILENAME != "backward") {<br>
+ if (!tztab[tz] && FILENAME != "backward" \<br>
+ && zone_table != "zonenow.tab") {<br>
printf "%s: no data for '%s'\n", zone_table, tz \<br>
>>"/dev/stderr"<br>
status = 1<br>
diff --git a/tzselect.ksh b/tzselect.ksh<br>
index f894bb56..70bda9c0 100644<br>
--- a/tzselect.ksh<br>
+++ b/tzselect.ksh<br>
@@ -196,7 +196,8 @@ read_file() {<br>
}<br>
}<br>
read_file TZ_COUNTRY_TABLE "$TZDIR/iso3166.tab"<br>
-read_file TZ_ZONE_TABLE "$TZDIR/$zonetabtype.tab"<br>
+read_file TZ_ZONETABTYPE_TABLE "$TZDIR/$zonetabtype.tab"<br>
+TZ_ZONENOW_TABLE=<br>
<br>
newline='<br>
'<br>
@@ -385,6 +386,7 @@ while<br>
country_result=<br>
region=<br>
time=<br>
+ TZ_ZONE_TABLE=$TZ_ZONETABTYPE_TABLE<br>
<br>
case $coord in<br>
?*)<br>
@@ -393,7 +395,8 @@ while<br>
<br>
# Ask the user for continent or ocean.<br>
<br>
- echo >&2 'Please select a continent, ocean, "coord", "TZ", or "time".'<br>
+ echo >&2 \<br>
+ 'Please select a continent, ocean, "coord", "TZ", "time", or "now".'<br>
<br>
quoted_continents=`<br>
$AWK '<br>
@@ -406,10 +409,10 @@ while<br>
printf "'\''%s'\''\n", entry<br>
}<br>
BEGIN {<br>
- TZ_ZONE_TABLE = substr(ARGV[1], 2)<br>
+ TZ_ZONETABTYPE_TABLE = substr(ARGV[1], 2)<br>
ARGV[1] = ""<br>
FS = "\t"<br>
- nlines = split(TZ_ZONE_TABLE, line, /\n/)<br>
+ nlines = split(TZ_ZONETABTYPE_TABLE, line, /\n/)<br>
for (i = 1; i <= nlines; i++) {<br>
$0 = line[i]<br>
if ($0 ~ /^[^#]/)<br>
@@ -421,7 +424,7 @@ while<br>
}<br>
}<br>
}<br>
- ' ="$TZ_ZONE_TABLE" |<br>
+ ' ="$TZ_ZONETABTYPE_TABLE" |<br>
sort -u |<br>
tr '\n' ' '<br>
echo ''<br>
@@ -431,12 +434,19 @@ while<br>
doselect '"$quoted_continents"' \<br>
"coord - I want to use geographical coordinates." \<br>
"TZ - I want to specify the timezone using the POSIX TZ format." \<br>
- "time - I know local time already."<br>
+ "time - I know local time already." \<br>
+ "now - Like \"time\", but configure only for timestamps from now on."<br>
continent=$select_result<br>
case $continent in<br>
Americas) continent=America;;<br>
*" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`<br>
esac<br>
+ case $zonetabtype,$continent in<br>
+ zonenow,*) ;;<br>
+ *,now)<br>
+ ${TZ_ZONENOW_TABLE:+:} read_file TZ_ZONENOW_TABLE "$TZDIR/zonenow.tab"<br>
+ TZ_ZONE_TABLE=$TZ_ZONENOW_TABLE<br>
+ esac<br>
'<br>
esac<br>
<br>
@@ -529,7 +539,7 @@ while<br>
`;;<br>
*)<br>
case $continent in<br>
- time)<br>
+ now|time)<br>
minute_format='%a %b %d %H:%M'<br>
old_minute=`TZ=UTC0 date +"$minute_format"`<br>
for i in 1 2 3<br>
@@ -609,6 +619,31 @@ while<br>
="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |<br>
sort -f<br>
`<br>
+ # If all zone table entries have comments, and there are<br>
+ # at most 22 entries, asked based on those comments.<br>
+ # This fits the prompt onto old-fashioned 24-line screens.<br>
+ regions=`<br>
+ $AWK '<br>
+ BEGIN {<br>
+ TZ_ZONE_TABLE = substr(ARGV[1], 2)<br>
+ ARGV[1] = ""<br>
+ FS = "\t"<br>
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)<br>
+ for (i = 1; i <= nlines; i++) {<br>
+ $0 = line[i]<br>
+ if ($0 ~ /^[^#]/ && !missing_comment) {<br>
+ if ($4)<br>
+ comment[++inlines] = $4<br>
+ else<br>
+ missing_comment = 1<br>
+ }<br>
+ }<br>
+ if (!missing_comment && inlines <= 22)<br>
+ for (i = 1; i <= inlines; i++)<br>
+ print comment[i]<br>
+ }<br>
+ ' ="$zone_table"<br>
+ `<br>
<br>
# If there's more than one country, ask the user which one.<br>
case $countries in<br>
diff --git a/zonenow.tab b/zonenow.tab<br>
new file mode 100644<br>
index 00000000..b1c1f332<br>
--- /dev/null<br>
+++ b/zonenow.tab<br>
@@ -0,0 +1,298 @@<br>
+# tzdb timezone descriptions, for users who do not care about old timestamps<br>
+#<br>
+# This file is in the public domain.<br>
+#<br>
+# From Paul Eggert (2023-12-18):<br>
+# This file contains a table where each row stands for a timezone<br>
+# where civil timestamps are predicted to agree from now on.<br>
+# This file is like zone1970.tab (see zone1970.tab's coments),<br>
+# but with the following changes:<br>
+#<br>
+# 1. Each timezone corresponds to a set of clocks that are planned<br>
+# to agree from now on. This is a larger set of clocks than in<br>
+# zone1970.tab, where each timezone's clocks must agree from 1970 on.<br>
+# 2. The first column is irrelevant and ignored.<br>
+# 3. The table is sorted in a different way:<br>
+# first by standard time UTC offset;<br>
+# then, if DST is used, by daylight saving UTC offset;<br>
+# then by time zone abbreviation.<br>
+#<br>
+# The format of this table is experimental, and may change in future versions.<br>
+#<br>
+# This table is intended as an aid for users, to help them select timezones<br>
+# appropriate for their practical needs. It is not intended to take or<br>
+# endorse any position on legal or territorial claims.<br>
+#<br>
+#XX coordinates TZ comments<br>
+#<br>
+# -11 - SST<br>
+XX -1416-17042 Pacific/Pago_Pago Midway; Samoa ("SST")<br>
+#<br>
+# -11<br>
+XX -1901-16955 Pacific/Niue Niue<br>
+#<br>
+# -10 - HST<br>
+XX +211825-1575130 Pacific/Honolulu Hawaii ("HST")<br>
+#<br>
+# -10<br>
+XX -1732-14934 Pacific/Tahiti Tahiti; Cook Islands<br>
+#<br>
+# -10/-09 - HST / HDT (North America DST)<br>
+XX +515248-1763929 America/Adak western Aleutians in Alaska ("HST/HDT")<br>
+#<br>
+# -09:30<br>
+XX -0900-13930 Pacific/Marquesas Marquesas<br>
+#<br>
+# -09<br>
+XX -2308-13457 Pacific/Gambier Gambier<br>
+#<br>
+# -09/-08 - AKST/AKDT (North America DST)<br>
+XX +611305-1495401 America/Anchorage most of Alaska ("AKST/AKDT")<br>
+#<br>
+# -08<br>
+XX -2504-13005 Pacific/Pitcairn Pitcairn<br>
+#<br>
+# -08/-07 - PST/PDT (North America DST)<br>
+XX +340308-1181434 America/Los_Angeles Pacific ("PST/PDT") - US & Canada; Mexico near US border<br>
+#<br>
+# -07 - MST<br>
+XX +332654-1120424 America/Phoenix Mountain Standard ("MST") - Arizona; western Mexico; Yukon<br>
+#<br>
+# -07/-06 - MST/MDT (North America DST)<br>
+XX +394421-1045903 America/Denver Mountain ("MST/MDT") - US & Canada; Mexico near US border<br>
+#<br>
+# -06<br>
+XX -0054-08936 Pacific/Galapagos Galápagos<br>
+#<br>
+# -06 - CST<br>
+XX +1924-09909 America/Mexico_City Central Standard ("CST") - Saskatchewan; central Mexico; Central America<br>
+#<br>
+# -06/-05 (Chile DST)<br>
+XX -2709-10926 Pacific/Easter Easter Island<br>
+#<br>
+# -06/-05 - CST/CDT (North America DST)<br>
+XX +415100-0873900 America/Chicago Central ("CST/CDT") - US & Canada; Mexico near US border<br>
+#<br>
+# -05<br>
+XX -1203-07703 America/Lima eastern South America<br>
+#<br>
+# -05 - EST<br>
+XX +175805-0764736 America/Jamaica Eastern Standard ("EST") - Caymans; Jamaica; eastern Mexico; Panama<br>
+#<br>
+# -05/-04 - CST/CDT (Cuba DST)<br>
+XX +2308-08222 America/Havana Cuba<br>
+#<br>
+# -05/-04 - EST/EDT (North America DST)<br>
+XX +404251-0740023 America/New_York Eastern ("EST/EDT") - US & Canada<br>
+#<br>
+# -04<br>
+XX +1030-06656 America/Caracas western South America<br>
+#<br>
+# -04 - AST<br>
+XX +1828-06954 America/Santo_Domingo Atlantic Standard ("AST") - eastern Caribbean<br>
+#<br>
+# -04/-03 (Chile DST)<br>
+XX -3327-07040 America/Santiago most of Chile<br>
+#<br>
+# -04/-03 (Paraguay DST)<br>
+XX -2516-05740 America/Asuncion Paraguay<br>
+#<br>
+# -04/-03 - AST/ADT (North America DST)<br>
+XX +4439-06336 America/Halifax Atlantic ("AST/ADT") - Canada; Bermuda<br>
+#<br>
+# -03:30/-02:30 - NST/NDT (North America DST)<br>
+XX +4734-05243 America/St_Johns Newfoundland ("NST/NDT")<br>
+#<br>
+# -03<br>
+XX -2332-04637 America/Sao_Paulo eastern South America<br>
+#<br>
+# -03/-02 (North America DST)<br>
+XX +4703-05620 America/Miquelon St Pierre & Miquelon<br>
+#<br>
+# -02<br>
+XX -0351-03225 America/Noronha Fernando de Noronha; South Georgia<br>
+#<br>
+# -02/-01 (EU DST)<br>
+XX +6411-05144 America/Nuuk most of Greenland<br>
+#<br>
+# -01<br>
+XX +1455-02331 Atlantic/Cape_Verde Cape Verde<br>
+#<br>
+# -01/+00 (EU DST)<br>
+XX +3744-02540 Atlantic/Azores Azores<br>
+# -01/+00 (EU DST) until 2024-03-01; then -02/-01 (EU DST)<br>
+XX +7029-02158 America/Scoresbysund Ittoqqortoormiit<br>
+#<br>
+# +00 - GMT<br>
+XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT")<br>
+#<br>
+# +00/+01 - GMT/BST (EU DST)<br>
+XX +513030-0000731 Europe/London United Kingdom ("GMT/BST")<br>
+#<br>
+# +00/+01 - WET/WEST (EU DST)<br>
+XX +3843-00908 Europe/Lisbon western Europe ("WET/WEST")<br>
+#<br>
+# +00/+01 - Troll DST<br>
+XX -720041+0023206 Antarctica/Troll Troll Station in Antarctica<br>
+#<br>
+# +01 - CET<br>
+XX +3647+00303 Africa/Algiers Algeria, Tunisia ("CET")<br>
+#<br>
+# +01 - WAT<br>
+XX +0627+00324 Africa/Lagos western Africa ("WAT")<br>
+#<br>
+# +01/+00 - IST/GMT (EU DST in reverse)<br>
+XX +5320-00615 Europe/Dublin Ireland ("IST/GMT")<br>
+#<br>
+# +01/+00 - (Morocco DST)<br>
+XX +3339-00735 Africa/Casablanca Morocco<br>
+#<br>
+# +01/+02 - CET/CEST (EU DST)<br>
+XX +4852+00220 Europe/Paris central Europe ("CET/CEST")<br>
+#<br>
+# +02 - CAT<br>
+XX -2558+03235 Africa/Maputo central Africa ("CAT")<br>
+#<br>
+# +02 - EET<br>
+XX +3254+01311 Africa/Tripoli Libya; Kaliningrad ("EET")<br>
+#<br>
+# +02 - SAST<br>
+XX -2615+02800 Africa/Johannesburg southern Africa ("SAST")<br>
+#<br>
+# +02/+03 - EET/EEST (EU DST)<br>
+XX +3758+02343 Europe/Athens eastern Europe ("EET/EEST")<br>
+#<br>
+# +02/+03 - EET/EEST (Egypt DST)<br>
+XX +3003+03115 Africa/Cairo Egypt<br>
+#<br>
+# +02/+03 - EET/EEST (Lebanon DST)<br>
+XX +3353+03530 Asia/Beirut Lebanon<br>
+#<br>
+# +02/+03 - EET/EEST (Moldova DST)<br>
+XX +4700+02850 Europe/Chisinau Moldova<br>
+#<br>
+# +02/+03 - EET/EEST (Palestine DST)<br>
+XX +3130+03428 Asia/Gaza Palestine<br>
+#<br>
+# +02/+03 - IST/IDT (Israel DST)<br>
+XX +314650+0351326 Asia/Jerusalem Israel<br>
+#<br>
+# +03<br>
+XX +4101+02858 Europe/Istanbul Near East; Belarus<br>
+#<br>
+# +03 - EAT<br>
+XX -0117+03649 Africa/Nairobi eastern Africa ("EAT")<br>
+#<br>
+# +03 - MSK<br>
+XX +554521+0373704 Europe/Moscow Moscow ("MSK")<br>
+#<br>
+# +03:30<br>
+XX +3540+05126 Asia/Tehran Iran<br>
+#<br>
+# +04<br>
+XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion<br>
+#<br>
+# +04:30<br>
+XX +3431+06912 Asia/Kabul Afghanistan<br>
+#<br>
+# +05<br>
+XX +4120+06918 Asia/Tashkent Russia; Tajikistan; Turkmenistan; Uzbekistan; Maldives<br>
+#<br>
+# +05 - PKT<br>
+XX +2452+06703 Asia/Karachi Pakistan ("PKT")<br>
+#<br>
+# +05:30<br>
+XX +0656+07951 Asia/Colombo Sri Lanka<br>
+#<br>
+# +05:30 - IST<br>
+XX +2232+08822 Asia/Kolkata India ("IST")<br>
+#<br>
+# +05:45<br>
+XX +2743+08519 Asia/Kathmandu Nepal<br>
+#<br>
+# +06<br>
+XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos<br>
+#<br>
+# +06:30<br>
+XX +1647+09610 Asia/Yangon Myanmar; Cocos<br>
+#<br>
+# +07<br>
+XX +1345+10031 Asia/Bangkok Russia; Indochina; Christmas Island<br>
+#<br>
+# +07 - WIB<br>
+XX -0610+10648 Asia/Jakarta Indonesia ("WIB")<br>
+#<br>
+# +08<br>
+XX +0117+10351 Asia/Singapore Russia; Brunei; Malaysia; Singapore<br>
+#<br>
+# +08 - AWST<br>
+XX -3157+11551 Australia/Perth Western Australia ("AWST")<br>
+#<br>
+# +08 - CST<br>
+XX +3114+12128 Asia/Shanghai China ("CST")<br>
+#<br>
+# +08 - HKT<br>
+XX +2217+11409 Asia/Hong_Kong Hong Kong ("HKT")<br>
+#<br>
+# +08 - PHT<br>
+XX +1435+12100 Asia/Manila Philippines ("PHT")<br>
+#<br>
+# +08 - WITA<br>
+XX -0507+11924 Asia/Makassar Indonesia ("WITA")<br>
+#<br>
+# +08:45<br>
+XX -3143+12852 Australia/Eucla Eucla<br>
+#<br>
+# +09<br>
+XX +5203+11328 Asia/Chita Russia; Palau; East Timor<br>
+#<br>
+# +09 - JST<br>
+XX +353916+1394441 Asia/Tokyo Japan ("JST")<br>
+#<br>
+# +09 - KST<br>
+XX +3733+12658 Asia/Seoul Korea ("KST")<br>
+#<br>
+# +09 - WIT<br>
+XX -0232+14042 Asia/Jayapura Indonesia ("WIT")<br>
+#<br>
+# +09:30 - ACST<br>
+XX -1228+13050 Australia/Darwin Northern Territory ("ACST")<br>
+#<br>
+# +09:30/+10:30 - ACST/ACDT (Australia DST)<br>
+XX -3455+13835 Australia/Adelaide South Australia ("ACST/ACDT")<br>
+#<br>
+# +10<br>
+XX +4310+13156 Asia/Vladivostok Russia; Yap; Chuuk; Papua New Guinea; Dumont d'Urville<br>
+#<br>
+# +10 - AEST<br>
+XX -2728+15302 Australia/Brisbane Queensland ("AEST")<br>
+#<br>
+# +10 - ChST<br>
+XX +1328+14445 Pacific/Guam Mariana Islands ("ChST")<br>
+#<br>
+# +10/+11 - AEST/AEDT (Australia DST)<br>
+XX -3352+15113 Australia/Sydney southeast Australia ("AEST/AEDT")<br>
+#<br>
+# +10:30/+11<br>
+XX -3133+15905 Australia/Lord_Howe Lord Howe Island<br>
+#<br>
+# +11<br>
+XX -0613+15534 Pacific/Bougainville Russia; Kosrae; Bougainville; Solomons<br>
+#<br>
+# +11/+12 (Australia DST)<br>
+XX -2903+16758 Pacific/Norfolk Norfolk Island<br>
+#<br>
+# +12<br>
+XX +5301+15839 Asia/Kamchatka Russia; Tuvalu; Fiji; etc.<br>
+#<br>
+# +12/+13 (New Zealand DST)<br>
+XX -3652+17446 Pacific/Auckland New Zealand ("NZST/NZDT")<br>
+#<br>
+# +12:45/+13:45 (Chatham DST)<br>
+XX -4357-17633 Pacific/Chatham Chatham Islands<br>
+#<br>
+# +13<br>
+XX -210800-1751200 Pacific/Tongatapu Kanton; Tokelau; Samoa (western); Tonga<br>
+#<br>
+# +14<br>
+XX +0152-15720 Pacific/Kiritimati Kiritimati<br>
-- <br>
2.40.1<br>
<br>
</blockquote></div>