about summary refs log tree commit diff
path: root/time
diff options
context:
space:
mode:
Diffstat (limited to 'time')
-rw-r--r--time/checktab.awk152
-rw-r--r--time/iso3166.tab254
-rw-r--r--time/tzselect.ksh292
-rw-r--r--time/zone.tab356
4 files changed, 1054 insertions, 0 deletions
diff --git a/time/checktab.awk b/time/checktab.awk
new file mode 100644
index 0000000000..9006e9f59a
--- /dev/null
+++ b/time/checktab.awk
@@ -0,0 +1,152 @@
+# Check tz tables for consistency.
+
+# Contributed by Paul Eggert <eggert@twinsun.com>.
+
+BEGIN {
+	FS = "\t"
+
+	if (!iso_table) iso_table = "iso3166.tab"
+	if (!zone_table) zone_table = "zone.tab"
+	if (!want_warnings) want_warnings = -1
+
+	while (getline <iso_table) {
+		iso_NR++
+		if ($0 ~ /^#/) continue
+		if (NF != 2) {
+			printf "%s:%d: wrong number of columns\n",
+				iso_table, iso_NR >>"/dev/stderr"
+			status = 1
+		}
+		cc = $1
+		name = $2
+		if (cc !~ /^[A-Z][A-Z]$/) {
+			printf "%s:%d: invalid country code `%s'\n", \
+				iso_table, iso_NR, cc >>"/dev/stderr"
+			status = 1
+		}
+		if (cc <= cc0) {
+			printf "%s:%d: country code `%s' is %s\n", \
+				iso_table, iso_NR, cc, \
+				cc==cc0 ? "duplicate"  : "out of order" \
+				>>"/dev/stderr"
+			status = 1
+		}
+		cc0 = cc
+		if (name2cc[name]) {
+			printf "%s:%d: `%s' and `%s' have the sname name\n", \
+				iso_table, iso_NR, name2cc[name], cc \
+				>>"/dev/stderr"
+			status = 1
+		}
+		name2cc[name] = cc
+		cc2name[cc] = name
+		cc2NR[cc] = iso_NR
+	}
+
+	zone_table = "zone.tab"
+	cc0 = ""
+
+	while (getline <zone_table) {
+		zone_NR++
+		if ($0 ~ /^#/) continue
+		if (NF != 3 && NF != 4) {
+			printf "%s:%d: wrong number of columns\n",
+				zone_table, zone_NR >>"/dev/stderr"
+			status = 1
+		}
+		cc = $1
+		coordinates = $2
+		tz = $3
+		comments = $4
+		if (cc < cc0) {
+			printf "%s:%d: country code `%s' is out of order\n", \
+				zone_table, zone_NR, cc >>"/dev/stderr"
+			status = 1
+		}
+		cc0 = cc
+		if (tz2cc[tz]) {
+			printf "%s:%d: %s: duplicate TZ column\n", \
+				zone_table, zone_NR, tz >>"/dev/stderr"
+			status = 1
+		}
+		tz2cc[tz] = cc
+		tz2comments[tz] = comments
+		tz2NR[tz] = zone_NR
+		if (cc2name[cc]) {
+			cc_used[cc]++
+		} else {
+			printf "%s:%d: %s: unknown country code\n", \
+				zone_table, zone_NR, cc >>"/dev/stderr"
+			status = 1
+		}
+		if (coordinates !~ /^[-+][0-9][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9]$/ \
+		    && coordinates !~ /^[-+][0-9][0-9][0-5][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9][0-5][0-9]$/) {
+			printf "%s:%d: %s: invalid coordinates\n", \
+				zone_table, zone_NR, coordinates >>"/dev/stderr"
+			status = 1
+		}
+	}
+
+	for (tz in tz2cc) {
+		if (cc_used[tz2cc[tz]] == 1) {
+			if (tz2comments[tz]) {
+				printf "%s:%d: unnecessary comment `%s'\n", \
+					zone_table, tz2NR[tz], tz2comments[tz] \
+					>>"/dev/stderr"
+				status = 1
+			}
+		} else {
+			if (!tz2comments[tz]) {
+				printf "%s:%d: missing comment\n", \
+					zone_table, tz2NR[tz] >>"/dev/stderr"
+				status = 1
+			}
+		}
+	}
+
+	FS = " "
+}
+
+{
+	tz = ""
+	if ($1 == "Zone") tz = $2
+	if ($1 == "Link") {
+		# Ignore Link commands if source and destination basenames
+		# are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
+		src = $2
+		dst = $3
+		while ((i = index(src, "/"))) src = substr(src, i+1)
+		while ((i = index(dst, "/"))) dst = substr(dst, i+1)
+		if (src != dst) tz = $3
+	}
+	if (tz && tz ~ /\//) {
+		if (!tz2cc[tz]) {
+			printf "%s: no data for `%s'\n", zone_table, tz \
+				>>"/dev/stderr"
+			status = 1
+		}
+		zoneSeen[tz] = 1
+	}
+}
+
+END {
+	for (tz in tz2cc) {
+		if (!zoneSeen[tz]) {
+			printf "%s:%d: no Zone table for `%s'\n", \
+				zone_table, tz2NR[tz], tz >>"/dev/stderr"
+			status = 1
+		}
+	}
+
+	if (0 < want_warnings) {
+		for (cc in cc2name) {
+			if (!cc_used[cc]) {
+				printf "%s:%d: warning:" \
+					"no Zone entries for %s (%s)\n",
+					iso_table, cc2NR[cc], cc, cc2name[cc]
+			}
+		}
+	}
+
+	exit status
+}
diff --git a/time/iso3166.tab b/time/iso3166.tab
new file mode 100644
index 0000000000..3daf4abb8d
--- /dev/null
+++ b/time/iso3166.tab
@@ -0,0 +1,254 @@
+# ISO 3166 2-letter country codes
+#
+# From Paul Eggert <eggert@twinsun.com> (1996-09-03):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.
+# 2.  The usual English name for the country,
+#	chosen so that alphabetic sorting of subsets produces helpful lists.
+#
+# Columns are separated by a single tab.
+# The table is sorted by country code.
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code	country name
+AD	Andorra
+AE	United Arab Emirates
+AF	Afghanistan
+AG	Antigua & Barbuda
+AI	Anguilla
+AL	Albania
+AM	Armenia
+AN	Netherlands Antilles
+AO	Angola
+AQ	Antarctica
+AR	Argentina
+AS	Samoa (American)
+AT	Austria
+AU	Australia
+AW	Aruba
+AZ	Azerbaijan
+BA	Bosnia & Herzegovina
+BB	Barbados
+BD	Bangladesh
+BE	Belgium
+BF	Burkina Faso
+BG	Bulgaria
+BH	Bahrain
+BI	Burundi
+BJ	Benin
+BM	Bermuda
+BN	Brunei
+BO	Bolivia
+BR	Brazil
+BS	Bahamas
+BT	Bhutan
+BV	Bouvet Island
+BW	Botswana
+BY	Belarus
+BZ	Belize
+CA	Canada
+CC	Cocos (Keeling) Islands
+CF	Central African Rep.
+CG	Congo
+CH	Switzerland
+CI	Cote d'Ivoire
+CK	Cook Islands
+CL	Chile
+CM	Cameroon
+CN	China
+CO	Colombia
+CR	Costa Rica
+CU	Cuba
+CV	Cape Verde
+CX	Christmas Island
+CY	Cyprus
+CZ	Czech Republic
+DE	Germany
+DJ	Djibouti
+DK	Denmark
+DM	Dominica
+DO	Dominican Republic
+DZ	Algeria
+EC	Ecuador
+EE	Estonia
+EG	Egypt
+EH	Western Sahara
+ER	Eritrea
+ES	Spain
+ET	Ethiopia
+FI	Finland
+FJ	Fiji
+FK	Falkland Islands
+FM	Micronesia
+FO	Faeroe Islands
+FR	France
+GA	Gabon
+GB	Britain (UK)
+GD	Grenada
+GE	Georgia
+GF	French Guiana
+GH	Ghana
+GI	Gibraltar
+GL	Greenland
+GM	Gambia
+GN	Guinea
+GP	Guadeloupe
+GQ	Equatorial Guinea
+GR	Greece
+GS	South Georgia & the South Sandwich Islands
+GT	Guatemala
+GU	Guam
+GW	Guinea-Bissau
+GY	Guyana
+HK	Hong Kong
+HM	Heard Island & McDonald Islands
+HN	Honduras
+HR	Croatia
+HT	Haiti
+HU	Hungary
+ID	Indonesia
+IE	Ireland
+IL	Israel
+IN	India
+IO	British Indian Ocean Territory
+IQ	Iraq
+IR	Iran
+IS	Iceland
+IT	Italy
+JM	Jamaica
+JO	Jordan
+JP	Japan
+KE	Kenya
+KG	Kirgizstan
+KH	Cambodia
+KI	Kiribati
+KM	Comoros
+KN	St Kitts & Nevis
+KP	Korea (North)
+KR	Korea (South)
+KW	Kuwait
+KY	Cayman Islands
+KZ	Kazakhstan
+LA	Laos
+LB	Lebanon
+LC	St Lucia
+LI	Liechtenstein
+LK	Sri Lanka
+LR	Liberia
+LS	Lesotho
+LT	Lithuania
+LU	Luxembourg
+LV	Latvia
+LY	Libya
+MA	Morocco
+MC	Monaco
+MD	Moldova
+MG	Madagascar
+MH	Marshall Islands
+MK	Macedonia
+ML	Mali
+MM	Myanmar (Burma)
+MN	Mongolia
+MO	Macao
+MP	Northern Mariana Islands
+MQ	Martinique
+MR	Mauritania
+MS	Montserrat
+MT	Malta
+MU	Mauritius
+MV	Maldives
+MW	Malawi
+MX	Mexico
+MY	Malaysia
+MZ	Mozambique
+NA	Namibia
+NC	New Caledonia
+NE	Niger
+NF	Norfolk Island
+NG	Nigeria
+NI	Nicaragua
+NL	Netherlands
+NO	Norway
+NP	Nepal
+NR	Nauru
+NU	Niue
+NZ	New Zealand
+OM	Oman
+PA	Panama
+PE	Peru
+PF	French Polynesia
+PG	Papua New Guinea
+PH	Philippines
+PK	Pakistan
+PL	Poland
+PM	St Pierre & Miquelon
+PN	Pitcairn
+PR	Puerto Rico
+PT	Portugal
+PW	Palau
+PY	Paraguay
+QA	Qatar
+RE	Reunion
+RO	Romania
+RU	Russia
+RW	Rwanda
+SA	Saudi Arabia
+SB	Solomon Islands
+SC	Seychelles
+SD	Sudan
+SE	Sweden
+SG	Singapore
+SH	St Helena
+SI	Slovenia
+SJ	Svalbard & Jan Mayen
+SK	Slovakia
+SL	Sierra Leone
+SM	San Marino
+SN	Senegal
+SO	Somalia
+SR	Suriname
+ST	Sao Tome & Principe
+SV	El Salvador
+SY	Syria
+SZ	Swaziland
+TC	Turks & Caicos Is
+TD	Chad
+TF	French Southern & Antarctic Lands
+TG	Togo
+TH	Thailand
+TJ	Tajikistan
+TK	Tokelau
+TM	Turkmenistan
+TN	Tunisia
+TO	Tonga
+TP	East Timor
+TR	Turkey
+TT	Trinidad & Tobago
+TV	Tuvalu
+TW	Taiwan
+TZ	Tanzania
+UA	Ukraine
+UG	Uganda
+UM	US minor outlying islands
+US	United States
+UY	Uruguay
+UZ	Uzbekistan
+VA	Vatican City
+VC	St Vincent
+VE	Venezuela
+VG	Virgin Islands (UK)
+VI	Virgin Islands (US)
+VN	Vietnam
+VU	Vanuatu
+WF	Wallis & Futuna
+WS	Samoa (Western)
+YE	Yemen
+YT	Mayotte
+YU	Yugoslavia
+ZA	South Africa
+ZM	Zambia
+ZR	Zaire
+ZW	Zimbabwe
diff --git a/time/tzselect.ksh b/time/tzselect.ksh
new file mode 100644
index 0000000000..0f0a3bb28e
--- /dev/null
+++ b/time/tzselect.ksh
@@ -0,0 +1,292 @@
+#! /bin/ksh
+# Ask the user about the time zone, and output the resulting TZ value to stdout.
+# Interact with the user via stderr and stdin.
+
+# Contributed by Paul Eggert <eggert@twinsun.com>.
+
+# Porting notes:
+#
+# This script requires several features of the Korn shell.
+# If your host lacks the Korn shell,
+# you can use either of the following free programs instead:
+#
+#	Bourne-Again shell (bash)
+#	<URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-1.14.7.tar.gz>
+#	(or any later version)
+#
+#	Public domain ksh
+#	<URL:ftp://ftp.cs.mun.ca:/pub/pdksh/pdksh.tar.gz>
+#
+# This script also uses several features of modern awk programs.
+# If your host lacks awk, or has an old awk that does not conform to Posix.2,
+# you can use either of the following free programs instead:
+#
+#	GNU awk (gawk)
+#	<URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.0.tar.gz>
+#	(or any later version)
+#
+#	mawk
+#	<URL:ftp://oxy.edu/public/mawk1.2.2.tar.gz>
+#	(or any later version)
+
+
+# Specify default values for environment variables if they are unset.
+: ${AWK=awk}
+: ${TZDIR=$(pwd)}
+
+# Check for awk Posix compliance.
+($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
+[ $? = 123 ] || {
+	echo >&2 "$0: Sorry, your \`$AWK' program is not Posix compatible."
+	exit 1
+}
+
+# Make sure the tables are readable.
+TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
+TZ_ZONE_TABLE=$TZDIR/zone.tab
+for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
+do
+	<$f || {
+		echo >&2 "$0: time zone files are not set up correctly"
+		exit 1
+	}
+done
+
+newline='
+'
+IFS=$newline
+
+
+# Work around a bash bug, where $PS3 is sent to stdout.
+case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in
+?*) PS3=
+esac
+
+
+# Begin the main loop.  We come back here if the user wants to retry.
+while
+
+	echo >&2 'Please identify a location' \
+		'so that time zone rules can be set correctly.'
+
+	continent=
+	country=
+	region=
+
+
+	# Ask the user for continent or ocean.
+
+	echo >&2 'Please select a continent or ocean.'
+
+	select continent in \
+	    Africa \
+	    Americas \
+	    Antarctica \
+	    'Arctic Ocean' \
+	    Asia \
+	    'Atlantic Ocean' \
+	    Australia \
+	    Europe \
+	    'Indian Ocean' \
+	    'Pacific Ocean' \
+	    'none - I want to specify the time zone using the Posix TZ format.'
+	do
+	    case $continent in
+	    '')
+		echo >&2 'Please enter a number in range.';;
+	    ?*)
+		case $continent in
+		Americas) continent=America;;
+		*' '*) continent=$(expr "$continent" : '\([^ ]*\)')
+		esac
+		break
+	    esac
+	done
+	case $continent in
+	'')
+		exit 1;;
+	none)
+		# Ask the user for a Posix TZ string.  Check that it conforms.
+		while
+			echo >&2 'Please enter the desired value' \
+				'of the TZ environment variable.'
+			echo >&2 'For example, GST-10 is a zone named GST' \
+				'that is 10 hours ahead (east) of UTC.'
+			read TZ
+			$AWK -v TZ="$TZ" 'BEGIN {
+				tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
+				time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
+				offset = "[-+]?" time
+				date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)"
+				datetime = "," date "(/" time ")?"
+				tzpattern = "^(:.*|" tzname offset "(" tzname \
+				  "(" offset ")?(" datetime datetime ")?)?)$"
+				if (TZ ~ tzpattern) exit 1
+				exit 0
+			}'
+		do
+			echo >&2 "\`$TZ' is not a conforming" \
+				'Posix time zone string.'
+		done
+		TZ_for_date=$TZ;;
+	*)
+		# Get list of names of countries in the continent or ocean.
+		countries=$($AWK -F'\t' \
+			-v continent="$continent" \
+			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+		'
+			/^#/ { next }
+			$3 ~ ("^" continent "/") {
+				if (!cc_seen[$1]++) cc_list[++ccs] = $1
+			}
+			END {
+				while (getline <TZ_COUNTRY_TABLE) {
+					if ($0 !~ /^#/) cc_name[$1] = $2
+				}
+				for (i = 1; i <= ccs; i++) {
+					country = cc_list[i]
+					if (cc_name[country]) {
+					  country = cc_name[country]
+					}
+					print country
+				}
+			}
+		' <$TZ_ZONE_TABLE | sort -f)
+
+
+		# If there's more than one country, ask the user which one.
+		case $countries in
+		*"$newline"*)
+			echo >&2 'Please select a country.'
+			select country in $countries
+			do
+			    case $country in
+			    '') echo >&2 'Please enter a number in range.';;
+			    ?*) break
+			    esac
+			done
+
+			case $country in
+			'') exit 1
+			esac;;
+		*)
+			country=$countries
+		esac
+
+
+		# Get list of names of time zone rule regions in the country.
+		regions=$($AWK -F'\t' \
+			-v country="$country" \
+			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+		'
+			BEGIN {
+				cc = country
+				while (getline <TZ_COUNTRY_TABLE) {
+					if ($0 !~ /^#/  &&  country == $2) {
+						cc = $1
+						break
+					}
+				}
+			}
+			$1 == cc { print $4 }
+		' <$TZ_ZONE_TABLE)
+
+
+		# If there's more than one region, ask the user which one.
+		case $regions in
+		*"$newline"*)
+			echo >&2 'Please select one of the following' \
+				'time zone regions.'
+			select region in $regions
+			do
+				case $region in
+				'') echo >&2 'Please enter a number in range.';;
+				?*) break
+				esac
+			done
+			case $region in
+			'') exit 1
+			esac;;
+		*)
+			region=$regions
+		esac
+
+		# Determine TZ from country and region.
+		TZ=$($AWK -F'\t' \
+			-v country="$country" \
+			-v region="$region" \
+			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+		'
+			BEGIN {
+				cc = country
+				while (getline <TZ_COUNTRY_TABLE) {
+					if ($0 !~ /^#/  &&  country == $2) {
+						cc = $1
+						break
+					}
+				}
+			}
+			$1 == cc && $4 == region { print $3 }
+		' <$TZ_ZONE_TABLE)
+
+		# Make sure the corresponding zoneinfo file exists.
+		TZ_for_date=$TZDIR/$TZ
+		<$TZ_for_date || {
+			echo >&2 "$0: time zone files are not set up correctly"
+			exit 1
+		}
+	esac
+
+
+	# Use the proposed TZ to output the current date relative to UTC.
+	# Loop until they agree in seconds.
+	# Give up after 8 unsuccessful tries.
+
+	extra_info=
+	for i in 1 2 3 4 5 6 7 8
+	do
+		TZdate=$(LANG=C TZ="$TZ_for_date" date)
+		UTdate=$(LANG=C TZ=UTC0 date)
+		TZsec=$(expr "$TZdate" : '.*:\([0-5][0-9]\)')
+		UTsec=$(expr "$UTdate" : '.*:\([0-5][0-9]\)')
+		case $TZsec in
+		$UTsec)
+			extra_info="
+Local time is now:	$TZdate.
+Universal Time is now:	$UTdate."
+			break
+		esac
+	done
+
+
+	# Output TZ info and ask the user to confirm.
+
+	echo >&2 ""
+	echo >&2 "The following information has been given:"
+	echo >&2 ""
+	case $country+$region in
+	?*+?*)	echo >&2 "	$country$newline	$region";;
+	?*+)	echo >&2 "	$country";;
+	+)	echo >&2 "	TZ='$TZ'"
+	esac
+	echo >&2 ""
+	echo >&2 "Therefore TZ='$TZ' will be used.$extra_info"
+	echo >&2 "Is the above information OK?"
+
+	ok=
+	select ok in Yes No
+	do
+	    case $ok in
+	    '') echo >&2 'Please enter 1 for Yes, or 2 for No.';;
+	    ?*) break
+	    esac
+	done
+	case $ok in
+	'') exit 1;;
+	Yes) break
+	esac
+do :
+done
+
+# Output the answer.
+echo "$TZ"
diff --git a/time/zone.tab b/time/zone.tab
new file mode 100644
index 0000000000..fef6a7244f
--- /dev/null
+++ b/time/zone.tab
@@ -0,0 +1,356 @@
+# TZ zone descriptions
+#
+# From Paul Eggert <eggert@twinsun.com> (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
+# 2.  Latitude and longitude of the zone's principal location
+#     in ISO 6709 sign-degrees-minutes-seconds format,
+#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+#     first latitude (+ is north), then longitude (+ is east).
+# 3.  Zone name used in value of TZ environment variable.
+# 4.  Comments; present if and only if the country has multiple rows.
+#     
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code	coordinates	TZ			comments
+AD	+4230+00131	Europe/Andorra
+AE	+2518+05518	Asia/Dubai
+AF	+3431+06912	Asia/Kabul
+AG	+1703-06148	America/Antigua
+AI	+1812-06304	America/Anguilla
+AL	+4120+01950	Europe/Tirane
+AM	+4011+04430	Asia/Yerevan
+AN	+1211-06900	America/Curacao
+AO	-0848+01314	Africa/Luanda
+AQ	-7750+16636	Antarctica/McMurdo	McMurdo Station, Ross Island
+AQ	-9000+00000	Antarctica/South_Pole	Amundsen-Scott Station, South Pole
+AQ	-6617+11031	Antarctica/Casey	Casey Station, Bailey Peninsula
+AQ	-6736+06253	Antarctica/Mawson	Mawson Station, Holme Bay
+AR	-3436-05827	America/Buenos_Aires
+AS	-1416-17042	Pacific/Pago_Pago
+AT	+4813+01620	Europe/Vienna
+AU	-3133+15905	Australia/Lord_Howe	Lord Howe Island
+AU	-4253+14719	Australia/Hobart	Tasmania
+AU	-3749+14458	Australia/Melbourne	Victoria
+AU	-3352+15113	Australia/Sydney	New South Wales - most locations
+AU	-3157+14127	Australia/Broken_Hill	New South Wales - Broken Hill
+AU	-2728+15302	Australia/Brisbane	Queensland
+AU	-3455+13835	Australia/Adelaide	South Australia
+AU	-1228+13050	Australia/Darwin	Northern Territory
+AU	-3157+11551	Australia/Perth	Western Australia
+AW	+1230-06858	America/Aruba
+AZ	+4023+04951	Asia/Baku
+BA	+4352+01825	Europe/Sarajevo
+BB	+1306-05937	America/Barbados
+BD	+2343+09025	Asia/Dacca
+BE	+5050+00420	Europe/Brussels
+BF	+1222-00131	Africa/Ouagadougou
+BG	+4241+02319	Europe/Sofia
+BH	+2623+05035	Asia/Bahrain
+BI	-0323+02922	Africa/Bujumbura
+BJ	+0629+00237	Africa/Porto-Novo
+BM	+3217-06446	Atlantic/Bermuda
+BN	+0456+11455	Asia/Brunei
+BO	-1630-06809	America/La_Paz
+BR	-0351-03225	America/Noronha	Atlantic islands
+BR	-2332-04637	America/Sao_Paulo	east Brazil
+BR	-0308-06001	America/Manaus	west Brazil
+BR	-0934-06731	America/Porto_Acre	Acre
+BS	+2505-07721	America/Nassau
+BT	+2728+08939	Asia/Thimbu
+BW	-2545+02555	Africa/Gaborone
+BY	+5354+02734	Europe/Minsk
+BZ	+1730-08812	America/Belize
+CA	+4734-05243	America/St_Johns	Newfoundland Island
+CA	+4439-06336	America/Halifax	Atlantic Time - Nova Scotia (most locations), New Brunswick, Labrador & PEI
+CA	+4612-05957	America/Glace_Bay	Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA	+6608-06544	America/Pangnirtung	Atlantic Time - Northwest Territories
+CA	+4531-07334	America/Montreal	Eastern Time - Ontario & Quebec - most locations
+CA	+4901-08816	America/Nipigon	Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA	+4823-08915	America/Thunder_Bay	Eastern Time - Thunder Bay, Ontario
+CA	+6344-06828	America/Iqaluit	Eastern Time - Northwest Territories
+CA	+4953-09709	America/Winnipeg	Central Time - Manitoba & west Ontario
+CA	+4843-09429	America/Rainy_River	Central Time - Rainy River & Fort Frances, Ontario
+CA	+6245-09210	America/Rankin_Inlet	Central Time - Northwest Territories
+CA	+5024-10439	America/Regina	Central Standard Time - Saskatchewan - most locations
+CA	+5017-10750	America/Swift_Current	Central Standard Time - Saskatchewan - midwest
+CA	+5333-11328	America/Edmonton	Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA	+6227-11421	America/Yellowknife	Mountain Time - central Northwest Territories
+CA	+6825-11330	America/Inuvik	Mountain Time - west Northwest Territories
+CA	+5946-12014	America/Dawson_Creek	Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA	+4916-12307	America/Vancouver	Pacific Time - west British Columbia
+CA	+6043-13503	America/Whitehorse	Pacific Time - south Yukon
+CA	+6404-13925	America/Dawson	Pacific Time - north Yukon
+CC	-1210+09655	Indian/Cocos
+CF	+0422+01835	Africa/Bangui
+CG	-0416+01517	Africa/Brazzaville
+CH	+4723+00832	Europe/Zurich
+CI	+0519-00402	Africa/Abidjan
+CK	-2114-15946	Pacific/Rarotonga
+CL	-3327-07040	America/Santiago	mainland
+CL	-2710-10927	Pacific/Easter	Easter Island
+CM	+0403+00942	Africa/Douala
+CN	+4545+12641	Asia/Harbin	north Manchuria
+CN	+3114+12128	Asia/Shanghai	China coast
+CN	+2934+10635	Asia/Chungking	China mountains
+CN	+4348+08735	Asia/Urumqi	Tibet & Xinjiang
+CN	+3929+07559	Asia/Kashgar	Eastern Turkestan
+CO	+0436-07405	America/Bogota
+CR	+0956-08405	America/Costa_Rica
+CU	+2308-08222	America/Havana
+CV	+1455-02331	Atlantic/Cape_Verde
+CX	-1025+10543	Indian/Christmas
+CY	+3510+03322	Asia/Nicosia
+CZ	+5005+01426	Europe/Prague
+DE	+5230+01322	Europe/Berlin
+DJ	+1136+04309	Africa/Djibouti
+DK	+5540+01235	Europe/Copenhagen
+DM	+1518-06124	America/Dominica
+DO	+1828-06954	America/Santo_Domingo
+DZ	+3647+00303	Africa/Algiers
+EC	-0210-07950	America/Guayaquil	mainland
+EC	-0054-08936	Pacific/Galapagos	Galapagos Islands
+EE	+5925+02445	Europe/Tallinn
+EG	+3003+03115	Africa/Cairo
+EH	+2709-01312	Africa/El_Aaiun
+ER	+1520+03853	Africa/Asmera
+ES	+4024-00341	Europe/Madrid	mainland
+ES	+3553-00519	Africa/Ceuta	Ceuta & Melilla
+ES	+2806-01524	Atlantic/Canary	Canary Islands
+ET	+0902+03842	Africa/Addis_Ababa
+FI	+6010+02458	Europe/Helsinki
+FJ	-1808+17825	Pacific/Fiji
+FK	-5142-05751	Atlantic/Stanley
+FM	+0931+13808	Pacific/Yap	Yap
+FM	+0725+15147	Pacific/Truk	Truk (Chuuk)
+FM	+0658+15813	Pacific/Ponape	Ponape (Pohnpei)
+FM	+0519+16259	Pacific/Kosrae	Kosrae
+FO	+6201-00646	Atlantic/Faeroe
+FR	+4852+00220	Europe/Paris
+GA	+0023+00927	Africa/Libreville
+GB	+512830-0001845	Europe/London	Great Britain
+GB	+5435-00555	Europe/Belfast	Northern Ireland
+GD	+1203-06145	America/Grenada
+GE	+4143+04449	Asia/Tbilisi
+GF	+0456-05220	America/Cayenne
+GH	+0533-00013	Africa/Accra
+GI	+3608-00521	Europe/Gibraltar
+GL	+7030-02215	America/Scoresbysund	east Greenland
+GL	+6411-05144	America/Godthab	southwest Greenland
+GL	+7634-06847	America/Thule	northwest Greenland
+GM	+1328-01639	Africa/Banjul
+GN	+0931-01343	Africa/Conakry
+GP	+1614-06132	America/Guadeloupe
+GQ	+0345+00847	Africa/Malabo
+GR	+3758+02343	Europe/Athens
+GS	-5416-03632	Atlantic/South_Georgia
+GT	+1438-09031	America/Guatemala
+GU	+1328+14445	Pacific/Guam
+GW	+1151-01535	Africa/Bissau
+GY	+0648-05810	America/Guyana
+HK	+2217+11409	Asia/Hong_Kong
+HN	+1406-08713	America/Tegucigalpa
+HR	+4548+01558	Europe/Zagreb
+HT	+1832-07220	America/Port-au-Prince
+HU	+4730+01905	Europe/Budapest
+ID	-0610+10648	Asia/Jakarta	Java & Sumatra
+ID	-0507+11924	Asia/Ujung_Pandang	Borneo & Celebes
+ID	-0232+14042	Asia/Jayapura	Irian Jaya & the Moluccas
+IE	+5320-00615	Europe/Dublin
+IL	+3146+03514	Asia/Jerusalem	most locations
+IL	+3130+03428	Asia/Gaza	Gaza Strip
+IN	+2232+08822	Asia/Calcutta
+IO	-0720+07225	Indian/Chagos
+IQ	+3321+04425	Asia/Baghdad
+IR	+3540+05126	Asia/Tehran
+IS	+6409-02151	Atlantic/Reykjavik
+IT	+4154+01229	Europe/Rome
+JM	+1800-07648	America/Jamaica
+JO	+3157+03556	Asia/Amman
+JP	+3542+13946	Asia/Tokyo	most locations
+JP	+2420+12409	Asia/Ishigaki	south Ryukyu Islands
+KE	-0117+03649	Africa/Nairobi
+KG	+4254+07436	Asia/Bishkek
+KH	+1133+10455	Asia/Phnom_Penh
+KI	+0125+17300	Pacific/Tarawa	Gilbert Islands
+KI	-0308-17105	Pacific/Enderbury	Phoenix Islands
+KI	+0152-15720	Pacific/Kiritimati	Line Islands
+KM	-1141+04316	Indian/Comoro
+KN	+1718-06243	America/St_Kitts
+KP	+3901+12545	Asia/Pyongyang
+KR	+3733+12658	Asia/Seoul
+KW	+2920+04759	Asia/Kuwait
+KY	+1918-08123	America/Cayman
+KZ	+4315+07657	Asia/Alma-Ata	east Kazakhstan
+KZ	+5016+07302	Asia/Aktau	west Kazakhstan
+LA	+1758+10236	Asia/Vientiane
+LB	+3353+03530	Asia/Beirut
+LC	+1401-06100	America/St_Lucia
+LI	+4709+00931	Europe/Vaduz
+LK	+0656+07951	Asia/Colombo
+LR	+0618-01047	Africa/Monrovia
+LS	-2928+02730	Africa/Maseru
+LT	+5441+02519	Europe/Vilnius
+LU	+4936+00609	Europe/Luxembourg
+LV	+5657+02406	Europe/Riga
+LY	+3254+01311	Africa/Tripoli
+MA	+3339-00735	Africa/Casablanca
+MC	+4342+00723	Europe/Monaco
+MD	+4700+02850	Europe/Chisinau
+MG	-1855+04731	Indian/Antananarivo
+MH	+0709+17112	Pacific/Majuro	most locations
+MH	+0905+16720	Pacific/Kwajalein	Kwajalein
+MK	+4159+02126	Europe/Skopje
+ML	+1239-00800	Africa/Bamako	southwest Mali
+ML	+1446-00301	Africa/Timbuktu	northeast Mali
+MM	+1647+09610	Asia/Rangoon
+MN	+4755+10653	Asia/Ulan_Bator
+MO	+2214+11335	Asia/Macao
+MP	+1512+14545	Pacific/Saipan
+MQ	+1436-06105	America/Martinique
+MR	+1806-01557	Africa/Nouakchott
+MS	+1642-06213	America/Montserrat
+MT	+3554+01431	Europe/Malta
+MU	-2010+05730	Indian/Mauritius
+MV	+0410+07330	Indian/Maldives
+MW	-1547+03500	Africa/Blantyre
+MX	+1924-09909	America/Mexico_City	Central Time
+MX	+2313-10625	America/Mazatlan	Mountain Time
+MX	+3152-11637	America/Ensenada	Pacific Time - most locations
+MX	+3232-11701	America/Tijuana	Pacific Time - north Baja California
+MY	+0310+10142	Asia/Kuala_Lumpur	peninsular Malaysia
+MY	+0133+11020	Asia/Kuching	Sabah & Sarawak
+MZ	-2558+03235	Africa/Maputo
+NA	-2234+01706	Africa/Windhoek
+NC	-2216+16530	Pacific/Noumea
+NE	+1331+00207	Africa/Niamey
+NF	-2903+16758	Pacific/Norfolk
+NG	+0627+00324	Africa/Lagos
+NI	+1209-08617	America/Managua
+NL	+5222+00454	Europe/Amsterdam
+NO	+5955+01045	Europe/Oslo
+NP	+2743+08519	Asia/Katmandu
+NR	-0031+16655	Pacific/Nauru
+NU	-1901+16955	Pacific/Niue
+NZ	-3652+17446	Pacific/Auckland	most locations
+NZ	-4355+17630	Pacific/Chatham	Chatham Island
+OM	+2336+05835	Asia/Muscat
+PA	+0858-07932	America/Panama
+PE	-1203-07703	America/Lima
+PF	-1732-14934	Pacific/Tahiti	Society Islands
+PF	-0900-13930	Pacific/Marquesas	Marquesas Islands
+PF	-2308-13457	Pacific/Gambier	Gambier Islands
+PG	-0930+14710	Pacific/Port_Moresby
+PH	+1435+12100	Asia/Manila
+PK	+2452+06703	Asia/Karachi
+PL	+5215+02100	Europe/Warsaw
+PM	+4703-05620	America/Miquelon
+PN	-2504-13005	Pacific/Pitcairn
+PR	+182806-0660622	America/Puerto_Rico
+PT	+3843-00908	Europe/Lisbon	mainland
+PT	+3238-01654	Atlantic/Madeira	Madeira Islands
+PT	+3744-02540	Atlantic/Azores	Azores
+PW	+0720+13429	Pacific/Palau
+PY	-2516-05740	America/Asuncion
+QA	+2517+05132	Asia/Qatar
+RE	-2052+05528	Indian/Reunion
+RO	+4426+02606	Europe/Bucharest
+RU	+5545+03735	Europe/Moscow	Moscow+00 - west Russia
+RU	+5312+05009	Europe/Kuybyshev	Moscow+01 - Caspian Sea
+RU	+5651+06036	Asia/Yekaterinburg	Moscow+02 - Urals
+RU	+5500+07324	Asia/Omsk	Moscow+03 - west Siberia
+RU	+5502+08255	Asia/Novosibirsk	Moscow+03 - Novosibirsk
+RU	+5601+09250	Asia/Krasnoyarsk	Moscow+04 - Yenisei River
+RU	+5216+10420	Asia/Irkutsk	Moscow+05 - Irkutsk
+RU	+6200+12940	Asia/Yakutsk	Moscow+06 - Lena River
+RU	+4310+13156	Asia/Vladivostok	Moscow+07 - Vladivostok
+RU	+5934+15048	Asia/Magadan	Moscow+08 - Magadan & Sakhalin
+RU	+5301+15839	Asia/Kamchatka	Moscow+09 - Kamchatka
+RU	+6445+17729	Asia/Anadyr	Moscow+10 - Bering Sea
+RW	-0157+03004	Africa/Kigali
+SA	+2438+04643	Asia/Riyadh
+SB	-0932+16012	Pacific/Guadalcanal
+SC	-0440+05528	Indian/Mahe
+SD	+1536+03232	Africa/Khartoum
+SE	+5920+01803	Europe/Stockholm
+SG	+0117+10351	Asia/Singapore
+SH	-1555-00542	Atlantic/St_Helena
+SI	+4603+01431	Europe/Ljubljana
+SJ	+7800+01600	Arctic/Longyearbyen	Svalbard
+SJ	+7059-00805	Atlantic/Jan_Mayen	Jan Mayen
+SK	+4809+01707	Europe/Bratislava
+SL	+0830-01315	Africa/Freetown
+SM	+4355+01228	Europe/San_Marino
+SN	+1440-01726	Africa/Dakar
+SO	+0204+04522	Africa/Mogadishu
+SR	+0550-05510	America/Paramaribo
+ST	+0020+00644	Africa/Sao_Tome
+SV	+1342-08912	America/El_Salvador
+SY	+3330+03618	Asia/Damascus
+SZ	-2618+03106	Africa/Mbabane
+TC	+2128-07108	America/Grand_Turk
+TD	+1207+01503	Africa/Ndjamena
+TG	+0608+00113	Africa/Lome
+TH	+1345+10031	Asia/Bangkok
+TJ	+3835+06848	Asia/Dushanbe
+TK	-0922-17114	Pacific/Fakaofo
+TM	+3757+05823	Asia/Ashkhabad
+TN	+3648+01011	Africa/Tunis
+TO	-2110+17510	Pacific/Tongatapu
+TR	+4101+02858	Europe/Istanbul
+TT	+1039-06131	America/Port_of_Spain
+TV	-0831+17913	Pacific/Funafuti
+TW	+2503+12130	Asia/Taipei
+TZ	-0648+03917	Africa/Dar_es_Salaam
+UA	+5026+03031	Europe/Kiev	most locations
+UA	+4457+03406	Europe/Simferopol	Crimea
+UG	+0019+03225	Africa/Kampala
+UM	+1700-16830	Pacific/Johnston	Johnston Atoll
+UM	+2813-17722	Pacific/Midway	Midway Islands
+UM	+1917+16637	Pacific/Wake	Wake Island
+US	+404251-0740023	America/New_York	Eastern Time
+US	+421953-0830245	America/Detroit	Eastern Time - Michigan - most locations
+US	+381515-0854534	America/Louisville	Eastern Time - Louisville, Kentucky
+US	+394606-0860929	America/Indianapolis	Eastern Standard Time - Indiana - most locations
+US	+382232-0862041	America/Indiana/Marengo	Eastern Standard Time - Indiana - Crawford County
+US	+411745-0863730	America/Indiana/Knox	Eastern Standard Time - Indiana - Starke County
+US	+384452-0850402	America/Indiana/Vevay	Eastern Standard Time - Indiana - Switzerland County
+US	+415100-0873900	America/Chicago	Central Time
+US	+450628-0873651	America/Menominee	Central Time - Michigan - Wisconsin border
+US	+394421-1045903	America/Denver	Mountain Time
+US	+433649-1161209	America/Boise	Mountain Time - south Idaho & east Oregon
+US	+364708-1084111	America/Shiprock	Mountain Time - Navajo
+US	+332654-1120424	America/Phoenix	Mountain Standard Time - Arizona
+US	+340308-1181434	America/Los_Angeles	Pacific Time
+US	+611305-1495401	America/Anchorage	Alaska Time
+US	+581807-1342511	America/Juneau	Alaska Time - Alaska panhandle
+US	+593249-1394338	America/Yakutat	Alaska Time - Alaska panhandle neck
+US	+643004-1652423	America/Nome	Alaska Time - west Alaska
+US	+515248-1763929	America/Adak	Aleutian Islands
+US	+211825-1575130	Pacific/Honolulu	Hawaii
+UY	-3453-05611	America/Montevideo
+UZ	+4120+06918	Asia/Tashkent
+VA	+4154+01227	Europe/Vatican
+VC	+1309-06114	America/St_Vincent
+VE	+1030-06656	America/Caracas
+VG	+1827-06437	America/Tortola
+VI	+1821-06456	America/St_Thomas
+VN	+1045+10640	Asia/Saigon
+VU	-1740+16825	Pacific/Efate
+WF	-1318-17610	Pacific/Wallis
+WS	-1350-17144	Pacific/Apia
+YE	+1245+04512	Asia/Aden
+YT	-1247+04514	Indian/Mayotte
+YU	+4450+02030	Europe/Belgrade
+ZA	-2615+02800	Africa/Johannesburg
+ZM	-1525+02817	Africa/Lusaka
+ZR	-0418+01518	Africa/Kinshasa	west Zaire
+ZR	-1140+02728	Africa/Lubumbashi	east Zaire
+ZW	-1750+03103	Africa/Harare