From f9443a080ef8e3382bbbad8791b223089287d4af Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 26 Apr 2024 12:16:55 +0200 Subject: [PATCH] [utils,doc] update timezone sync procedure * add new C# utility to generate timezone mappings * update procedure to follow for updating timezones * remove obsolete TimeZones.csx script * update generated files with new tool --- docs/README.timezones | 22 +- scripts/TimeZones.csx | 205 ---- winpr/libwinpr/timezone/TimeZoneNameMap.c | 3 + .../libwinpr/timezone/TimeZoneNameMapUtils.c | 4 +- winpr/libwinpr/timezone/WindowsZones.c | 1050 +++++++++-------- winpr/libwinpr/timezone/WindowsZones.h | 4 +- winpr/libwinpr/timezone/utils/CMakeLists.txt | 27 + winpr/libwinpr/timezone/utils/tzextract.cs | 172 +++ 8 files changed, 752 insertions(+), 735 deletions(-) delete mode 100644 scripts/TimeZones.csx create mode 100644 winpr/libwinpr/timezone/utils/CMakeLists.txt create mode 100644 winpr/libwinpr/timezone/utils/tzextract.cs diff --git a/docs/README.timezones b/docs/README.timezones index 545430e36..57b2a129e 100644 --- a/docs/README.timezones +++ b/docs/README.timezones @@ -1,12 +1,22 @@ -On an up to date windows machine run the following scripts (from checkout root): +On an up to date windows machine run the following binary after a build with -DWITH_TIMEZONE_UPDATER=ON (from build directory): -csi.exe scripts/TimeZones.csx -csi.exe scripts/WindowsZones.csx +tzextract \winpr\libwinpr\timezone After running the scripts check - * winpr/libwinpr/timezone/TimeZones.c + * git clang-format -f to eliminate formatting changes * winpr/libwinpr/timezone/WindowsZones.c for changes. -Commit if the definitions changed and create a pull request at -https://github.com/FreeRDP/FreeRDP +on any machine run the following script from checkout root: + +./scripts/update-windows-zones.py + +After running the scripts check + * git clang-format -f to eliminate formatting changes + * winpr/libwinpr/timezone/WindowsZones.c +for changes. + +Commit if the definitions changed: +1. run `git clang-format -f` on these changed files +2. commit these changes +3. create a pull request at https://github.com/FreeRDP/FreeRDP diff --git a/scripts/TimeZones.csx b/scripts/TimeZones.csx deleted file mode 100644 index d0a39ba00..000000000 --- a/scripts/TimeZones.csx +++ /dev/null @@ -1,205 +0,0 @@ -/** - * FreeRDP: A Remote Desktop Protocol Implementation - * Time Zone Redirection Table Generator - * - * Copyright 2012 Marc-Andre Moreau - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/* Run with ' csi scripts/TimeZones.csx' from freerdp checkout root */ - -using System; -using System.IO; -using System.Globalization; -using System.Collections.ObjectModel; - -struct SYSTEM_TIME_ENTRY -{ - public UInt16 wYear; - public UInt16 wMonth; - public UInt16 wDayOfWeek; - public UInt16 wDay; - public UInt16 wHour; - public UInt16 wMinute; - public UInt16 wSecond; - public UInt16 wMilliseconds; -}; - -struct TIME_ZONE_RULE_ENTRY -{ - public long TicksStart; - public long TicksEnd; - public Int32 DaylightDelta; - public SYSTEM_TIME_ENTRY StandardDate; - public SYSTEM_TIME_ENTRY DaylightDate; -}; - -struct TIME_ZONE_ENTRY -{ - public string Id; - public Int32 Bias; - public bool SupportsDST; - public string DisplayName; - public string StandardName; - public string DaylightName; - public string RuleTable; - public UInt32 RuleTableCount; -}; - -int i; -UInt32 index; -const string file = @"winpr/libwinpr/timezone/TimeZones.c"; -TimeZoneInfo.AdjustmentRule[] rules; -StreamWriter stream = new StreamWriter(file, false); -ReadOnlyCollection timeZones = TimeZoneInfo.GetSystemTimeZones(); - -Console.WriteLine("Updating " + file); -stream.WriteLine("/* "); -stream.WriteLine(" * Automatically generated with scripts/TimeZones.csx"); -stream.WriteLine(" */ "); -stream.WriteLine(); - -stream.WriteLine("#include \"TimeZones.h\""); -stream.WriteLine(); - -index = 0; - -foreach (TimeZoneInfo timeZone in timeZones) -{ - rules = timeZone.GetAdjustmentRules(); - - if ((!timeZone.SupportsDaylightSavingTime) || (rules.Length < 1)) - { - index++; - continue; - } - - stream.WriteLine("static const TIME_ZONE_RULE_ENTRY TimeZoneRuleTable_{0}[] =", index); - stream.WriteLine("{"); - - i = 0; - foreach (TimeZoneInfo.AdjustmentRule rule in rules) - { - DateTime time; - TIME_ZONE_RULE_ENTRY tzr; - TimeZoneInfo.TransitionTime transition; - - tzr.TicksStart = rule.DateEnd.ToUniversalTime().Ticks; - tzr.TicksEnd = rule.DateStart.ToUniversalTime().Ticks; - tzr.DaylightDelta = (Int32)rule.DaylightDelta.TotalMinutes; - - transition = rule.DaylightTransitionEnd; - time = transition.TimeOfDay; - - tzr.StandardDate.wYear = (UInt16)0; - tzr.StandardDate.wMonth = (UInt16)transition.Month; - tzr.StandardDate.wDayOfWeek = (UInt16)transition.DayOfWeek; - tzr.StandardDate.wDay = (UInt16)transition.Week; - tzr.StandardDate.wHour = (UInt16)time.Hour; - tzr.StandardDate.wMinute = (UInt16)time.Minute; - tzr.StandardDate.wSecond = (UInt16)time.Second; - tzr.StandardDate.wMilliseconds = (UInt16)time.Millisecond; - - transition = rule.DaylightTransitionStart; - time = transition.TimeOfDay; - - tzr.DaylightDate.wYear = (UInt16)0; - tzr.DaylightDate.wMonth = (UInt16)transition.Month; - tzr.DaylightDate.wDayOfWeek = (UInt16)transition.DayOfWeek; - tzr.DaylightDate.wDay = (UInt16)transition.Week; - tzr.DaylightDate.wHour = (UInt16)time.Hour; - tzr.DaylightDate.wMinute = (UInt16)time.Minute; - tzr.DaylightDate.wSecond = (UInt16)time.Second; - tzr.DaylightDate.wMilliseconds = (UInt16)time.Millisecond; - - stream.Write("\t{"); - stream.Write(" {0}ULL, {1}ULL, {2},", tzr.TicksStart, tzr.TicksEnd, tzr.DaylightDelta); - - stream.Write(" { "); - stream.Write("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", - tzr.StandardDate.wYear, tzr.StandardDate.wMonth, tzr.StandardDate.wDayOfWeek, - tzr.StandardDate.wDay, tzr.StandardDate.wHour, tzr.StandardDate.wMinute, - tzr.StandardDate.wSecond, tzr.StandardDate.wMilliseconds); - stream.Write(" }, "); - - stream.Write("{ "); - stream.Write("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", - tzr.DaylightDate.wYear, tzr.DaylightDate.wMonth, tzr.DaylightDate.wDayOfWeek, - tzr.DaylightDate.wDay, tzr.DaylightDate.wHour, tzr.DaylightDate.wMinute, - tzr.DaylightDate.wSecond, tzr.DaylightDate.wMilliseconds); - stream.Write(" },"); - - if (++i < rules.Length) - stream.WriteLine(" },"); - else - stream.WriteLine(" }"); - } - - stream.WriteLine("};"); - stream.WriteLine(); - index++; -} - -index = 0; -stream.WriteLine("const TIME_ZONE_ENTRY TimeZoneTable[] ="); -stream.WriteLine("{"); - -foreach (TimeZoneInfo timeZone in timeZones) -{ - TIME_ZONE_ENTRY tz; - TimeSpan offset = timeZone.BaseUtcOffset; - - rules = timeZone.GetAdjustmentRules(); - - tz.Id = timeZone.Id; - tz.Bias = -(Int32)offset.TotalMinutes; - - tz.SupportsDST = timeZone.SupportsDaylightSavingTime; - - tz.DisplayName = timeZone.DisplayName; - tz.StandardName = timeZone.StandardName; - tz.DaylightName = timeZone.DaylightName; - - if ((!tz.SupportsDST) || (rules.Length < 1)) - { - tz.RuleTableCount = 0; - tz.RuleTable = "NULL"; - } - else - { - tz.RuleTableCount = (UInt32)rules.Length; - tz.RuleTable = "TimeZoneRuleTable_" + index; - } - - stream.WriteLine("\t{"); - - stream.WriteLine("\t\t\"{0}\", {1}, {2}, \"{3}\",", - tz.Id, tz.Bias, tz.SupportsDST ? "TRUE" : "FALSE", tz.DisplayName); - - stream.WriteLine("\t\t\"{0}\", \"{1}\",", tz.StandardName, tz.DaylightName); - stream.WriteLine("\t\t{0}, {1}", tz.RuleTable, tz.RuleTableCount); - - index++; - - if ((int)index < timeZones.Count) - stream.WriteLine("\t},"); - else - stream.WriteLine("\t}"); -} -stream.WriteLine("};"); -stream.WriteLine(); -stream.WriteLine("const size_t TimeZoneTableNrElements = ARRAYSIZE(TimeZoneTable);"); -stream.WriteLine(); - -stream.Close(); - diff --git a/winpr/libwinpr/timezone/TimeZoneNameMap.c b/winpr/libwinpr/timezone/TimeZoneNameMap.c index 165be208c..0237ad5e9 100644 --- a/winpr/libwinpr/timezone/TimeZoneNameMap.c +++ b/winpr/libwinpr/timezone/TimeZoneNameMap.c @@ -1,3 +1,5 @@ +/* Automatically generated by tzextract */ + #include "TimeZoneNameMap.h" const TimeZoneNameMapEntry TimeZoneNameMap[] = { @@ -286,4 +288,5 @@ const TimeZoneNameMapEntry TimeZoneNameMap[] = { { "Line Islands Standard Time", "Line Islands Standard Time", "(UTC+14:00) Kiritimati Island", "Line Islands Daylight Time", "Pacific/Kiritimati" }, }; + const size_t TimeZoneNameMapSize = ARRAYSIZE(TimeZoneNameMap); diff --git a/winpr/libwinpr/timezone/TimeZoneNameMapUtils.c b/winpr/libwinpr/timezone/TimeZoneNameMapUtils.c index fc1d7998b..16e4f91b0 100644 --- a/winpr/libwinpr/timezone/TimeZoneNameMapUtils.c +++ b/winpr/libwinpr/timezone/TimeZoneNameMapUtils.c @@ -112,9 +112,9 @@ static const char* map_fallback(const char* iana, TimeZoneNameType type) if (!iana) return NULL; - for (size_t x = 0; x < WindowsTimeZoneIdTableNrElements; x++) + for (size_t x = 0; x < WindowsZonesNrElements; x++) { - const WINDOWS_TZID_ENTRY* const entry = &WindowsTimeZoneIdTable[x]; + const WINDOWS_TZID_ENTRY* const entry = &WindowsZones[x]; if (strcmp(entry->tzid, iana) == 0) return entry->windows; } diff --git a/winpr/libwinpr/timezone/WindowsZones.c b/winpr/libwinpr/timezone/WindowsZones.c index 8e59de7c1..d0b5b1105 100644 --- a/winpr/libwinpr/timezone/WindowsZones.c +++ b/winpr/libwinpr/timezone/WindowsZones.c @@ -1,528 +1,538 @@ -/* - * Automatically generated with scripts/update-windows-zones.py +/* Automatically generated by tzextract + * + * url https://raw.githubusercontent.com/unicode-org/cldr/main/common/supplemental/windowsZones.xml + * version: $Revision$ + +#include "WindowsZones.h" + +const " + fname + "Entry " + fname + "[] ={ + * mapTimezones: otherVersion: 7e11800, typeVersion: 2021a */ #include "WindowsZones.h" -const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[] = { - { "AUS Central Standard Time", "Australia/Darwin" }, - { "AUS Central Standard Time", "Australia/Darwin" }, - { "AUS Eastern Standard Time", "Australia/Sydney Australia/Melbourne" }, - { "AUS Eastern Standard Time", "Australia/Sydney" }, - { "Afghanistan Standard Time", "Asia/Kabul" }, - { "Afghanistan Standard Time", "Asia/Kabul" }, - { "Alaskan Standard Time", "America/Anchorage America/Juneau America/Metlakatla America/Nome " - "America/Sitka America/Yakutat" }, - { "Alaskan Standard Time", "America/Anchorage" }, - { "Aleutian Standard Time", "America/Adak" }, - { "Aleutian Standard Time", "America/Adak" }, - { "Altai Standard Time", "Asia/Barnaul" }, - { "Altai Standard Time", "Asia/Barnaul" }, - { "Arab Standard Time", "Asia/Aden" }, - { "Arab Standard Time", "Asia/Bahrain" }, - { "Arab Standard Time", "Asia/Kuwait" }, - { "Arab Standard Time", "Asia/Qatar" }, - { "Arab Standard Time", "Asia/Riyadh" }, - { "Arab Standard Time", "Asia/Riyadh" }, - { "Arabian Standard Time", "Asia/Dubai" }, - { "Arabian Standard Time", "Asia/Dubai" }, - { "Arabian Standard Time", "Asia/Muscat" }, - { "Arabian Standard Time", "Etc/GMT-4" }, - { "Arabic Standard Time", "Asia/Baghdad" }, - { "Arabic Standard Time", "Asia/Baghdad" }, - { "Argentina Standard Time", - "America/Buenos_Aires America/Argentina/La_Rioja America/Argentina/Rio_Gallegos " +const WINDOWS_TZID_ENTRY WindowsZones[] = { + { "Etc/GMT+12", "Dateline Standard Time" }, // 001 + { "Etc/GMT+12", "Dateline Standard Time" }, // ZZ + { "Etc/GMT+11", "UTC-11" }, // 001 + { "Pacific/Pago_Pago", "UTC-11" }, // AS + { "Pacific/Niue", "UTC-11" }, // NU + { "Pacific/Midway", "UTC-11" }, // UM + { "Etc/GMT+11", "UTC-11" }, // ZZ + { "America/Adak", "Aleutian Standard Time" }, // 001 + { "America/Adak", "Aleutian Standard Time" }, // US + { "Pacific/Honolulu", "Hawaiian Standard Time" }, // 001 + { "Pacific/Rarotonga", "Hawaiian Standard Time" }, // CK + { "Pacific/Tahiti", "Hawaiian Standard Time" }, // PF + { "Pacific/Honolulu", "Hawaiian Standard Time" }, // US + { "Etc/GMT+10", "Hawaiian Standard Time" }, // ZZ + { "Pacific/Marquesas", "Marquesas Standard Time" }, // 001 + { "Pacific/Marquesas", "Marquesas Standard Time" }, // PF + { "America/Anchorage", "Alaskan Standard Time" }, // 001 + { "America/Anchorage America/Juneau America/Metlakatla America/Nome America/Sitka " + "America/Yakutat", + "Alaskan Standard Time" }, // US + { "Etc/GMT+9", "UTC-09" }, // 001 + { "Pacific/Gambier", "UTC-09" }, // PF + { "Etc/GMT+9", "UTC-09" }, // ZZ + { "America/Tijuana", "Pacific Standard Time (Mexico)" }, // 001 + { "America/Tijuana", "Pacific Standard Time (Mexico)" }, // MX + { "Etc/GMT+8", "UTC-08" }, // 001 + { "Pacific/Pitcairn", "UTC-08" }, // PN + { "Etc/GMT+8", "UTC-08" }, // ZZ + { "America/Los_Angeles", "Pacific Standard Time" }, // 001 + { "America/Vancouver", "Pacific Standard Time" }, // CA + { "America/Los_Angeles", "Pacific Standard Time" }, // US + { "PST8PDT", "Pacific Standard Time" }, // ZZ + { "America/Phoenix", "US Mountain Standard Time" }, // 001 + { "America/Creston America/Dawson_Creek America/Fort_Nelson", + "US Mountain Standard Time" }, // CA + { "America/Hermosillo", "US Mountain Standard Time" }, // MX + { "America/Phoenix", "US Mountain Standard Time" }, // US + { "Etc/GMT+7", "US Mountain Standard Time" }, // ZZ + { "America/Mazatlan", "Mountain Standard Time (Mexico)" }, // 001 + { "America/Mazatlan", "Mountain Standard Time (Mexico)" }, // MX + { "America/Denver", "Mountain Standard Time" }, // 001 + { "America/Edmonton America/Cambridge_Bay America/Inuvik", "Mountain Standard Time" }, // CA + { "America/Ciudad_Juarez", "Mountain Standard Time" }, // MX + { "America/Denver America/Boise", "Mountain Standard Time" }, // US + { "MST7MDT", "Mountain Standard Time" }, // ZZ + { "America/Whitehorse", "Yukon Standard Time" }, // 001 + { "America/Whitehorse America/Dawson", "Yukon Standard Time" }, // CA + { "America/Guatemala", "Central America Standard Time" }, // 001 + { "America/Belize", "Central America Standard Time" }, // BZ + { "America/Costa_Rica", "Central America Standard Time" }, // CR + { "Pacific/Galapagos", "Central America Standard Time" }, // EC + { "America/Guatemala", "Central America Standard Time" }, // GT + { "America/Tegucigalpa", "Central America Standard Time" }, // HN + { "America/Managua", "Central America Standard Time" }, // NI + { "America/El_Salvador", "Central America Standard Time" }, // SV + { "Etc/GMT+6", "Central America Standard Time" }, // ZZ + { "America/Chicago", "Central Standard Time" }, // 001 + { "America/Winnipeg America/Rankin_Inlet America/Resolute", "Central Standard Time" }, // CA + { "America/Matamoros America/Ojinaga", "Central Standard Time" }, // MX + { "America/Chicago America/Indiana/Knox America/Indiana/Tell_City America/Menominee " + "America/North_Dakota/Beulah America/North_Dakota/Center America/North_Dakota/New_Salem", + "Central Standard Time" }, // US + { "CST6CDT", "Central Standard Time" }, // ZZ + { "Pacific/Easter", "Easter Island Standard Time" }, // 001 + { "Pacific/Easter", "Easter Island Standard Time" }, // CL + { "America/Mexico_City", "Central Standard Time (Mexico)" }, // 001 + { "America/Mexico_City America/Bahia_Banderas America/Merida America/Monterrey " + "America/Chihuahua ", + "Central Standard Time (Mexico)" }, // MX + { "America/Regina", "Canada Central Standard Time" }, // 001 + { "America/Regina America/Swift_Current", "Canada Central Standard Time" }, // CA + { "America/Bogota", "SA Pacific Standard Time" }, // 001 + { "America/Rio_Branco America/Eirunepe", "SA Pacific Standard Time" }, // BR + { "America/Coral_Harbour", "SA Pacific Standard Time" }, // CA + { "America/Bogota", "SA Pacific Standard Time" }, // CO + { "America/Guayaquil", "SA Pacific Standard Time" }, // EC + { "America/Jamaica", "SA Pacific Standard Time" }, // JM + { "America/Cayman", "SA Pacific Standard Time" }, // KY + { "America/Panama", "SA Pacific Standard Time" }, // PA + { "America/Lima", "SA Pacific Standard Time" }, // PE + { "Etc/GMT+5", "SA Pacific Standard Time" }, // ZZ + { "America/Cancun", "Eastern Standard Time (Mexico)" }, // 001 + { "America/Cancun", "Eastern Standard Time (Mexico)" }, // MX + { "America/New_York", "Eastern Standard Time" }, // 001 + { "America/Nassau", "Eastern Standard Time" }, // BS + { "America/Toronto America/Iqaluit", "Eastern Standard Time" }, // CA + { "America/New_York America/Detroit America/Indiana/Petersburg America/Indiana/Vincennes " + "America/Indiana/Winamac America/Kentucky/Monticello America/Louisville", + "Eastern Standard Time" }, // US + { "EST5EDT", "Eastern Standard Time" }, // ZZ + { "America/Port-au-Prince", "Haiti Standard Time" }, // 001 + { "America/Port-au-Prince", "Haiti Standard Time" }, // HT + { "America/Havana", "Cuba Standard Time" }, // 001 + { "America/Havana", "Cuba Standard Time" }, // CU + { "America/Indianapolis", "US Eastern Standard Time" }, // 001 + { "America/Indianapolis America/Indiana/Marengo America/Indiana/Vevay", + "US Eastern Standard Time" }, // US + { "America/Grand_Turk", "Turks And Caicos Standard Time" }, // 001 + { "America/Grand_Turk", "Turks And Caicos Standard Time" }, // TC + { "America/Asuncion", "Paraguay Standard Time" }, // 001 + { "America/Asuncion", "Paraguay Standard Time" }, // PY + { "America/Halifax", "Atlantic Standard Time" }, // 001 + { "Atlantic/Bermuda", "Atlantic Standard Time" }, // BM + { "America/Halifax America/Glace_Bay America/Goose_Bay America/Moncton", + "Atlantic Standard Time" }, // CA + { "America/Thule", "Atlantic Standard Time" }, // GL + { "America/Caracas", "Venezuela Standard Time" }, // 001 + { "America/Caracas", "Venezuela Standard Time" }, // VE + { "America/Cuiaba", "Central Brazilian Standard Time" }, // 001 + { "America/Cuiaba America/Campo_Grande", "Central Brazilian Standard Time" }, // BR + { "America/La_Paz", "SA Western Standard Time" }, // 001 + { "America/Antigua", "SA Western Standard Time" }, // AG + { "America/Anguilla", "SA Western Standard Time" }, // AI + { "America/Aruba", "SA Western Standard Time" }, // AW + { "America/Barbados", "SA Western Standard Time" }, // BB + { "America/St_Barthelemy", "SA Western Standard Time" }, // BL + { "America/La_Paz", "SA Western Standard Time" }, // BO + { "America/Kralendijk", "SA Western Standard Time" }, // BQ + { "America/Manaus America/Boa_Vista America/Porto_Velho", "SA Western Standard Time" }, // BR + { "America/Blanc-Sablon", "SA Western Standard Time" }, // CA + { "America/Curacao", "SA Western Standard Time" }, // CW + { "America/Dominica", "SA Western Standard Time" }, // DM + { "America/Santo_Domingo", "SA Western Standard Time" }, // DO + { "America/Grenada", "SA Western Standard Time" }, // GD + { "America/Guadeloupe", "SA Western Standard Time" }, // GP + { "America/Guyana", "SA Western Standard Time" }, // GY + { "America/St_Kitts", "SA Western Standard Time" }, // KN + { "America/St_Lucia", "SA Western Standard Time" }, // LC + { "America/Marigot", "SA Western Standard Time" }, // MF + { "America/Martinique", "SA Western Standard Time" }, // MQ + { "America/Montserrat", "SA Western Standard Time" }, // MS + { "America/Puerto_Rico", "SA Western Standard Time" }, // PR + { "America/Lower_Princes", "SA Western Standard Time" }, // SX + { "America/Port_of_Spain", "SA Western Standard Time" }, // TT + { "America/St_Vincent", "SA Western Standard Time" }, // VC + { "America/Tortola", "SA Western Standard Time" }, // VG + { "America/St_Thomas", "SA Western Standard Time" }, // VI + { "Etc/GMT+4", "SA Western Standard Time" }, // ZZ + { "America/Santiago", "Pacific SA Standard Time" }, // 001 + { "America/Santiago", "Pacific SA Standard Time" }, // CL + { "America/St_Johns", "Newfoundland Standard Time" }, // 001 + { "America/St_Johns", "Newfoundland Standard Time" }, // CA + { "America/Araguaina", "Tocantins Standard Time" }, // 001 + { "America/Araguaina", "Tocantins Standard Time" }, // BR + { "America/Sao_Paulo", "E. South America Standard Time" }, // 001 + { "America/Sao_Paulo", "E. South America Standard Time" }, // BR + { "America/Cayenne", "SA Eastern Standard Time" }, // 001 + { "Antarctica/Rothera Antarctica/Palmer", "SA Eastern Standard Time" }, // AQ + { "America/Fortaleza America/Belem America/Maceio America/Recife America/Santarem", + "SA Eastern Standard Time" }, // BR + { "Atlantic/Stanley", "SA Eastern Standard Time" }, // FK + { "America/Cayenne", "SA Eastern Standard Time" }, // GF + { "America/Paramaribo", "SA Eastern Standard Time" }, // SR + { "Etc/GMT+3", "SA Eastern Standard Time" }, // ZZ + { "America/Buenos_Aires", "Argentina Standard Time" }, // 001 + { "America/Buenos_Aires America/Argentina/La_Rioja America/Argentina/Rio_Gallegos " "America/Argentina/Salta America/Argentina/San_Juan America/Argentina/San_Luis " "America/Argentina/Tucuman America/Argentina/Ushuaia America/Catamarca America/Cordoba " - "America/Jujuy America/Mendoza" }, - { "Argentina Standard Time", "America/Buenos_Aires" }, - { "Astrakhan Standard Time", "Europe/Astrakhan Europe/Ulyanovsk" }, - { "Astrakhan Standard Time", "Europe/Astrakhan" }, - { "Atlantic Standard Time", - "America/Halifax America/Glace_Bay America/Goose_Bay America/Moncton" }, - { "Atlantic Standard Time", "America/Halifax" }, - { "Atlantic Standard Time", "America/Thule" }, - { "Atlantic Standard Time", "Atlantic/Bermuda" }, - { "Aus Central W. Standard Time", "Australia/Eucla" }, - { "Aus Central W. Standard Time", "Australia/Eucla" }, - { "Azerbaijan Standard Time", "Asia/Baku" }, - { "Azerbaijan Standard Time", "Asia/Baku" }, - { "Azores Standard Time", "America/Scoresbysund" }, - { "Azores Standard Time", "Atlantic/Azores" }, - { "Azores Standard Time", "Atlantic/Azores" }, - { "Bahia Standard Time", "America/Bahia" }, - { "Bahia Standard Time", "America/Bahia" }, - { "Bangladesh Standard Time", "Asia/Dhaka" }, - { "Bangladesh Standard Time", "Asia/Dhaka" }, - { "Bangladesh Standard Time", "Asia/Thimphu" }, - { "Belarus Standard Time", "Europe/Minsk" }, - { "Belarus Standard Time", "Europe/Minsk" }, - { "Bougainville Standard Time", "Pacific/Bougainville" }, - { "Bougainville Standard Time", "Pacific/Bougainville" }, - { "Canada Central Standard Time", "America/Regina America/Swift_Current" }, - { "Canada Central Standard Time", "America/Regina" }, - { "Cape Verde Standard Time", "Atlantic/Cape_Verde" }, - { "Cape Verde Standard Time", "Atlantic/Cape_Verde" }, - { "Cape Verde Standard Time", "Etc/GMT+1" }, - { "Caucasus Standard Time", "Asia/Yerevan" }, - { "Caucasus Standard Time", "Asia/Yerevan" }, - { "Cen. Australia Standard Time", "Australia/Adelaide Australia/Broken_Hill" }, - { "Cen. Australia Standard Time", "Australia/Adelaide" }, - { "Central America Standard Time", "America/Belize" }, - { "Central America Standard Time", "America/Costa_Rica" }, - { "Central America Standard Time", "America/El_Salvador" }, - { "Central America Standard Time", "America/Guatemala" }, - { "Central America Standard Time", "America/Guatemala" }, - { "Central America Standard Time", "America/Managua" }, - { "Central America Standard Time", "America/Tegucigalpa" }, - { "Central America Standard Time", "Etc/GMT+6" }, - { "Central America Standard Time", "Pacific/Galapagos" }, - { "Central Asia Standard Time", "Antarctica/Vostok" }, - { "Central Asia Standard Time", "Asia/Bishkek" }, - { "Central Asia Standard Time", "Asia/Bishkek" }, - { "Central Asia Standard Time", "Asia/Urumqi" }, - { "Central Asia Standard Time", "Etc/GMT-6" }, - { "Central Asia Standard Time", "Indian/Chagos" }, - { "Central Brazilian Standard Time", "America/Cuiaba America/Campo_Grande" }, - { "Central Brazilian Standard Time", "America/Cuiaba" }, - { "Central Europe Standard Time", "Europe/Belgrade" }, - { "Central Europe Standard Time", "Europe/Bratislava" }, - { "Central Europe Standard Time", "Europe/Budapest" }, - { "Central Europe Standard Time", "Europe/Budapest" }, - { "Central Europe Standard Time", "Europe/Ljubljana" }, - { "Central Europe Standard Time", "Europe/Podgorica" }, - { "Central Europe Standard Time", "Europe/Prague" }, - { "Central Europe Standard Time", "Europe/Tirane" }, - { "Central European Standard Time", "Europe/Sarajevo" }, - { "Central European Standard Time", "Europe/Skopje" }, - { "Central European Standard Time", "Europe/Warsaw" }, - { "Central European Standard Time", "Europe/Warsaw" }, - { "Central European Standard Time", "Europe/Zagreb" }, - { "Central Pacific Standard Time", "Antarctica/Casey" }, - { "Central Pacific Standard Time", "Etc/GMT-11" }, - { "Central Pacific Standard Time", "Pacific/Efate" }, - { "Central Pacific Standard Time", "Pacific/Guadalcanal" }, - { "Central Pacific Standard Time", "Pacific/Guadalcanal" }, - { "Central Pacific Standard Time", "Pacific/Noumea" }, - { "Central Pacific Standard Time", "Pacific/Ponape Pacific/Kosrae" }, - { "Central Standard Time (Mexico)", "America/Mexico_City America/Bahia_Banderas America/Merida " - "America/Monterrey America/Chihuahua " }, - { "Central Standard Time (Mexico)", "America/Mexico_City" }, - { "Central Standard Time", - "America/Chicago America/Indiana/Knox America/Indiana/Tell_City America/Menominee " - "America/North_Dakota/Beulah America/North_Dakota/Center America/North_Dakota/New_Salem" }, - { "Central Standard Time", "America/Chicago" }, - { "Central Standard Time", "America/Matamoros America/Ojinaga" }, - { "Central Standard Time", "America/Winnipeg America/Rankin_Inlet America/Resolute" }, - { "Central Standard Time", "CST6CDT" }, - { "Chatham Islands Standard Time", "Pacific/Chatham" }, - { "Chatham Islands Standard Time", "Pacific/Chatham" }, - { "China Standard Time", "Asia/Hong_Kong" }, - { "China Standard Time", "Asia/Macau" }, - { "China Standard Time", "Asia/Shanghai" }, - { "China Standard Time", "Asia/Shanghai" }, - { "Cuba Standard Time", "America/Havana" }, - { "Cuba Standard Time", "America/Havana" }, - { "Dateline Standard Time", "Etc/GMT+12" }, - { "Dateline Standard Time", "Etc/GMT+12" }, - { "E. Africa Standard Time", "Africa/Addis_Ababa" }, - { "E. Africa Standard Time", "Africa/Asmera" }, - { "E. Africa Standard Time", "Africa/Dar_es_Salaam" }, - { "E. Africa Standard Time", "Africa/Djibouti" }, - { "E. Africa Standard Time", "Africa/Kampala" }, - { "E. Africa Standard Time", "Africa/Mogadishu" }, - { "E. Africa Standard Time", "Africa/Nairobi" }, - { "E. Africa Standard Time", "Africa/Nairobi" }, - { "E. Africa Standard Time", "Antarctica/Syowa" }, - { "E. Africa Standard Time", "Etc/GMT-3" }, - { "E. Africa Standard Time", "Indian/Antananarivo" }, - { "E. Africa Standard Time", "Indian/Comoro" }, - { "E. Africa Standard Time", "Indian/Mayotte" }, - { "E. Australia Standard Time", "Australia/Brisbane Australia/Lindeman" }, - { "E. Australia Standard Time", "Australia/Brisbane" }, - { "E. Europe Standard Time", "Europe/Chisinau" }, - { "E. Europe Standard Time", "Europe/Chisinau" }, - { "E. South America Standard Time", "America/Sao_Paulo" }, - { "E. South America Standard Time", "America/Sao_Paulo" }, - { "Easter Island Standard Time", "Pacific/Easter" }, - { "Easter Island Standard Time", "Pacific/Easter" }, - { "Eastern Standard Time (Mexico)", "America/Cancun" }, - { "Eastern Standard Time (Mexico)", "America/Cancun" }, - { "Eastern Standard Time", "America/Nassau" }, - { "Eastern Standard Time", - "America/New_York America/Detroit America/Indiana/Petersburg America/Indiana/Vincennes " - "America/Indiana/Winamac America/Kentucky/Monticello America/Louisville" }, - { "Eastern Standard Time", "America/New_York" }, - { "Eastern Standard Time", "America/Toronto America/Iqaluit" }, - { "Eastern Standard Time", "EST5EDT" }, - { "Egypt Standard Time", "Africa/Cairo" }, - { "Egypt Standard Time", "Africa/Cairo" }, - { "Ekaterinburg Standard Time", "Asia/Yekaterinburg" }, - { "Ekaterinburg Standard Time", "Asia/Yekaterinburg" }, - { "FLE Standard Time", "Europe/Helsinki" }, - { "FLE Standard Time", "Europe/Kiev" }, - { "FLE Standard Time", "Europe/Kiev" }, - { "FLE Standard Time", "Europe/Mariehamn" }, - { "FLE Standard Time", "Europe/Riga" }, - { "FLE Standard Time", "Europe/Sofia" }, - { "FLE Standard Time", "Europe/Tallinn" }, - { "FLE Standard Time", "Europe/Vilnius" }, - { "Fiji Standard Time", "Pacific/Fiji" }, - { "Fiji Standard Time", "Pacific/Fiji" }, - { "GMT Standard Time", "Atlantic/Canary" }, - { "GMT Standard Time", "Atlantic/Faeroe" }, - { "GMT Standard Time", "Europe/Dublin" }, - { "GMT Standard Time", "Europe/Guernsey" }, - { "GMT Standard Time", "Europe/Isle_of_Man" }, - { "GMT Standard Time", "Europe/Jersey" }, - { "GMT Standard Time", "Europe/Lisbon Atlantic/Madeira" }, - { "GMT Standard Time", "Europe/London" }, - { "GMT Standard Time", "Europe/London" }, - { "GTB Standard Time", "Asia/Nicosia Asia/Famagusta" }, - { "GTB Standard Time", "Europe/Athens" }, - { "GTB Standard Time", "Europe/Bucharest" }, - { "GTB Standard Time", "Europe/Bucharest" }, - { "Georgian Standard Time", "Asia/Tbilisi" }, - { "Georgian Standard Time", "Asia/Tbilisi" }, - { "Greenland Standard Time", "America/Godthab" }, - { "Greenland Standard Time", "America/Godthab" }, - { "Greenwich Standard Time", "Africa/Abidjan" }, - { "Greenwich Standard Time", "Africa/Accra" }, - { "Greenwich Standard Time", "Africa/Bamako" }, - { "Greenwich Standard Time", "Africa/Banjul" }, - { "Greenwich Standard Time", "Africa/Bissau" }, - { "Greenwich Standard Time", "Africa/Conakry" }, - { "Greenwich Standard Time", "Africa/Dakar" }, - { "Greenwich Standard Time", "Africa/Freetown" }, - { "Greenwich Standard Time", "Africa/Lome" }, - { "Greenwich Standard Time", "Africa/Monrovia" }, - { "Greenwich Standard Time", "Africa/Nouakchott" }, - { "Greenwich Standard Time", "Africa/Ouagadougou" }, - { "Greenwich Standard Time", "America/Danmarkshavn" }, - { "Greenwich Standard Time", "Atlantic/Reykjavik" }, - { "Greenwich Standard Time", "Atlantic/Reykjavik" }, - { "Greenwich Standard Time", "Atlantic/St_Helena" }, - { "Haiti Standard Time", "America/Port-au-Prince" }, - { "Haiti Standard Time", "America/Port-au-Prince" }, - { "Hawaiian Standard Time", "Etc/GMT+10" }, - { "Hawaiian Standard Time", "Pacific/Honolulu" }, - { "Hawaiian Standard Time", "Pacific/Honolulu" }, - { "Hawaiian Standard Time", "Pacific/Rarotonga" }, - { "Hawaiian Standard Time", "Pacific/Tahiti" }, - { "India Standard Time", "Asia/Calcutta" }, - { "India Standard Time", "Asia/Calcutta" }, - { "Iran Standard Time", "Asia/Tehran" }, - { "Iran Standard Time", "Asia/Tehran" }, - { "Israel Standard Time", "Asia/Jerusalem" }, - { "Israel Standard Time", "Asia/Jerusalem" }, - { "Jordan Standard Time", "Asia/Amman" }, - { "Jordan Standard Time", "Asia/Amman" }, - { "Kaliningrad Standard Time", "Europe/Kaliningrad" }, - { "Kaliningrad Standard Time", "Europe/Kaliningrad" }, - { "Korea Standard Time", "Asia/Seoul" }, - { "Korea Standard Time", "Asia/Seoul" }, - { "Libya Standard Time", "Africa/Tripoli" }, - { "Libya Standard Time", "Africa/Tripoli" }, - { "Line Islands Standard Time", "Etc/GMT-14" }, - { "Line Islands Standard Time", "Pacific/Kiritimati" }, - { "Line Islands Standard Time", "Pacific/Kiritimati" }, - { "Lord Howe Standard Time", "Australia/Lord_Howe" }, - { "Lord Howe Standard Time", "Australia/Lord_Howe" }, - { "Magadan Standard Time", "Asia/Magadan" }, - { "Magadan Standard Time", "Asia/Magadan" }, - { "Magallanes Standard Time", "America/Punta_Arenas" }, - { "Magallanes Standard Time", "America/Punta_Arenas" }, - { "Marquesas Standard Time", "Pacific/Marquesas" }, - { "Marquesas Standard Time", "Pacific/Marquesas" }, - { "Mauritius Standard Time", "Indian/Mahe" }, - { "Mauritius Standard Time", "Indian/Mauritius" }, - { "Mauritius Standard Time", "Indian/Mauritius" }, - { "Mauritius Standard Time", "Indian/Reunion" }, - { "Middle East Standard Time", "Asia/Beirut" }, - { "Middle East Standard Time", "Asia/Beirut" }, - { "Montevideo Standard Time", "America/Montevideo" }, - { "Montevideo Standard Time", "America/Montevideo" }, - { "Morocco Standard Time", "Africa/Casablanca" }, - { "Morocco Standard Time", "Africa/Casablanca" }, - { "Morocco Standard Time", "Africa/El_Aaiun" }, - { "Mountain Standard Time (Mexico)", "America/Mazatlan" }, - { "Mountain Standard Time (Mexico)", "America/Mazatlan" }, - { "Mountain Standard Time", "America/Ciudad_Juarez" }, - { "Mountain Standard Time", "America/Denver America/Boise" }, - { "Mountain Standard Time", "America/Denver" }, - { "Mountain Standard Time", "America/Edmonton America/Cambridge_Bay America/Inuvik" }, - { "Mountain Standard Time", "MST7MDT" }, - { "Myanmar Standard Time", "Asia/Rangoon" }, - { "Myanmar Standard Time", "Asia/Rangoon" }, - { "Myanmar Standard Time", "Indian/Cocos" }, - { "N. Central Asia Standard Time", "Asia/Novosibirsk" }, - { "N. Central Asia Standard Time", "Asia/Novosibirsk" }, - { "Namibia Standard Time", "Africa/Windhoek" }, - { "Namibia Standard Time", "Africa/Windhoek" }, - { "Nepal Standard Time", "Asia/Katmandu" }, - { "Nepal Standard Time", "Asia/Katmandu" }, - { "New Zealand Standard Time", "Antarctica/McMurdo" }, - { "New Zealand Standard Time", "Pacific/Auckland" }, - { "New Zealand Standard Time", "Pacific/Auckland" }, - { "Newfoundland Standard Time", "America/St_Johns" }, - { "Newfoundland Standard Time", "America/St_Johns" }, - { "Norfolk Standard Time", "Pacific/Norfolk" }, - { "Norfolk Standard Time", "Pacific/Norfolk" }, - { "North Asia East Standard Time", "Asia/Irkutsk" }, - { "North Asia East Standard Time", "Asia/Irkutsk" }, - { "North Asia Standard Time", "Asia/Krasnoyarsk Asia/Novokuznetsk" }, - { "North Asia Standard Time", "Asia/Krasnoyarsk" }, - { "North Korea Standard Time", "Asia/Pyongyang" }, - { "North Korea Standard Time", "Asia/Pyongyang" }, - { "Omsk Standard Time", "Asia/Omsk" }, - { "Omsk Standard Time", "Asia/Omsk" }, - { "Pacific SA Standard Time", "America/Santiago" }, - { "Pacific SA Standard Time", "America/Santiago" }, - { "Pacific Standard Time (Mexico)", "America/Tijuana" }, - { "Pacific Standard Time (Mexico)", "America/Tijuana" }, - { "Pacific Standard Time", "America/Los_Angeles" }, - { "Pacific Standard Time", "America/Los_Angeles" }, - { "Pacific Standard Time", "America/Vancouver" }, - { "Pacific Standard Time", "PST8PDT" }, - { "Pakistan Standard Time", "Asia/Karachi" }, - { "Pakistan Standard Time", "Asia/Karachi" }, - { "Paraguay Standard Time", "America/Asuncion" }, - { "Paraguay Standard Time", "America/Asuncion" }, - { "Qyzylorda Standard Time", "Asia/Qyzylorda" }, - { "Qyzylorda Standard Time", "Asia/Qyzylorda" }, - { "Romance Standard Time", "Europe/Brussels" }, - { "Romance Standard Time", "Europe/Copenhagen" }, - { "Romance Standard Time", "Europe/Madrid Africa/Ceuta" }, - { "Romance Standard Time", "Europe/Paris" }, - { "Romance Standard Time", "Europe/Paris" }, - { "Russia Time Zone 10", "Asia/Srednekolymsk" }, - { "Russia Time Zone 10", "Asia/Srednekolymsk" }, - { "Russia Time Zone 11", "Asia/Kamchatka Asia/Anadyr" }, - { "Russia Time Zone 11", "Asia/Kamchatka" }, - { "Russia Time Zone 3", "Europe/Samara" }, - { "Russia Time Zone 3", "Europe/Samara" }, - { "Russian Standard Time", "Europe/Moscow Europe/Kirov" }, - { "Russian Standard Time", "Europe/Moscow" }, - { "Russian Standard Time", "Europe/Simferopol" }, - { "SA Eastern Standard Time", "America/Cayenne" }, - { "SA Eastern Standard Time", "America/Cayenne" }, - { "SA Eastern Standard Time", - "America/Fortaleza America/Belem America/Maceio America/Recife America/Santarem" }, - { "SA Eastern Standard Time", "America/Paramaribo" }, - { "SA Eastern Standard Time", "Antarctica/Rothera Antarctica/Palmer" }, - { "SA Eastern Standard Time", "Atlantic/Stanley" }, - { "SA Eastern Standard Time", "Etc/GMT+3" }, - { "SA Pacific Standard Time", "America/Bogota" }, - { "SA Pacific Standard Time", "America/Bogota" }, - { "SA Pacific Standard Time", "America/Cayman" }, - { "SA Pacific Standard Time", "America/Coral_Harbour" }, - { "SA Pacific Standard Time", "America/Guayaquil" }, - { "SA Pacific Standard Time", "America/Jamaica" }, - { "SA Pacific Standard Time", "America/Lima" }, - { "SA Pacific Standard Time", "America/Panama" }, - { "SA Pacific Standard Time", "America/Rio_Branco America/Eirunepe" }, - { "SA Pacific Standard Time", "Etc/GMT+5" }, - { "SA Western Standard Time", "America/Anguilla" }, - { "SA Western Standard Time", "America/Antigua" }, - { "SA Western Standard Time", "America/Aruba" }, - { "SA Western Standard Time", "America/Barbados" }, - { "SA Western Standard Time", "America/Blanc-Sablon" }, - { "SA Western Standard Time", "America/Curacao" }, - { "SA Western Standard Time", "America/Dominica" }, - { "SA Western Standard Time", "America/Grenada" }, - { "SA Western Standard Time", "America/Guadeloupe" }, - { "SA Western Standard Time", "America/Guyana" }, - { "SA Western Standard Time", "America/Kralendijk" }, - { "SA Western Standard Time", "America/La_Paz" }, - { "SA Western Standard Time", "America/La_Paz" }, - { "SA Western Standard Time", "America/Lower_Princes" }, - { "SA Western Standard Time", "America/Manaus America/Boa_Vista America/Porto_Velho" }, - { "SA Western Standard Time", "America/Marigot" }, - { "SA Western Standard Time", "America/Martinique" }, - { "SA Western Standard Time", "America/Montserrat" }, - { "SA Western Standard Time", "America/Port_of_Spain" }, - { "SA Western Standard Time", "America/Puerto_Rico" }, - { "SA Western Standard Time", "America/Santo_Domingo" }, - { "SA Western Standard Time", "America/St_Barthelemy" }, - { "SA Western Standard Time", "America/St_Kitts" }, - { "SA Western Standard Time", "America/St_Lucia" }, - { "SA Western Standard Time", "America/St_Thomas" }, - { "SA Western Standard Time", "America/St_Vincent" }, - { "SA Western Standard Time", "America/Tortola" }, - { "SA Western Standard Time", "Etc/GMT+4" }, - { "SE Asia Standard Time", "Antarctica/Davis" }, - { "SE Asia Standard Time", "Asia/Bangkok" }, - { "SE Asia Standard Time", "Asia/Bangkok" }, - { "SE Asia Standard Time", "Asia/Jakarta Asia/Pontianak" }, - { "SE Asia Standard Time", "Asia/Phnom_Penh" }, - { "SE Asia Standard Time", "Asia/Saigon" }, - { "SE Asia Standard Time", "Asia/Vientiane" }, - { "SE Asia Standard Time", "Etc/GMT-7" }, - { "SE Asia Standard Time", "Indian/Christmas" }, - { "Saint Pierre Standard Time", "America/Miquelon" }, - { "Saint Pierre Standard Time", "America/Miquelon" }, - { "Sakhalin Standard Time", "Asia/Sakhalin" }, - { "Sakhalin Standard Time", "Asia/Sakhalin" }, - { "Samoa Standard Time", "Pacific/Apia" }, - { "Samoa Standard Time", "Pacific/Apia" }, - { "Sao Tome Standard Time", "Africa/Sao_Tome" }, - { "Sao Tome Standard Time", "Africa/Sao_Tome" }, - { "Saratov Standard Time", "Europe/Saratov" }, - { "Saratov Standard Time", "Europe/Saratov" }, - { "Singapore Standard Time", "Asia/Brunei" }, - { "Singapore Standard Time", "Asia/Kuala_Lumpur Asia/Kuching" }, - { "Singapore Standard Time", "Asia/Makassar" }, - { "Singapore Standard Time", "Asia/Manila" }, - { "Singapore Standard Time", "Asia/Singapore" }, - { "Singapore Standard Time", "Asia/Singapore" }, - { "Singapore Standard Time", "Etc/GMT-8" }, - { "South Africa Standard Time", "Africa/Blantyre" }, - { "South Africa Standard Time", "Africa/Bujumbura" }, - { "South Africa Standard Time", "Africa/Gaborone" }, - { "South Africa Standard Time", "Africa/Harare" }, - { "South Africa Standard Time", "Africa/Johannesburg" }, - { "South Africa Standard Time", "Africa/Johannesburg" }, - { "South Africa Standard Time", "Africa/Kigali" }, - { "South Africa Standard Time", "Africa/Lubumbashi" }, - { "South Africa Standard Time", "Africa/Lusaka" }, - { "South Africa Standard Time", "Africa/Maputo" }, - { "South Africa Standard Time", "Africa/Maseru" }, - { "South Africa Standard Time", "Africa/Mbabane" }, - { "South Africa Standard Time", "Etc/GMT-2" }, - { "South Sudan Standard Time", "Africa/Juba" }, - { "South Sudan Standard Time", "Africa/Juba" }, - { "Sri Lanka Standard Time", "Asia/Colombo" }, - { "Sri Lanka Standard Time", "Asia/Colombo" }, - { "Sudan Standard Time", "Africa/Khartoum" }, - { "Sudan Standard Time", "Africa/Khartoum" }, - { "Syria Standard Time", "Asia/Damascus" }, - { "Syria Standard Time", "Asia/Damascus" }, - { "Taipei Standard Time", "Asia/Taipei" }, - { "Taipei Standard Time", "Asia/Taipei" }, - { "Tasmania Standard Time", "Australia/Hobart Antarctica/Macquarie" }, - { "Tasmania Standard Time", "Australia/Hobart" }, - { "Tocantins Standard Time", "America/Araguaina" }, - { "Tocantins Standard Time", "America/Araguaina" }, - { "Tokyo Standard Time", "Asia/Dili" }, - { "Tokyo Standard Time", "Asia/Jayapura" }, - { "Tokyo Standard Time", "Asia/Tokyo" }, - { "Tokyo Standard Time", "Asia/Tokyo" }, - { "Tokyo Standard Time", "Etc/GMT-9" }, - { "Tokyo Standard Time", "Pacific/Palau" }, - { "Tomsk Standard Time", "Asia/Tomsk" }, - { "Tomsk Standard Time", "Asia/Tomsk" }, - { "Tonga Standard Time", "Pacific/Tongatapu" }, - { "Tonga Standard Time", "Pacific/Tongatapu" }, - { "Transbaikal Standard Time", "Asia/Chita" }, - { "Transbaikal Standard Time", "Asia/Chita" }, - { "Turkey Standard Time", "Europe/Istanbul" }, - { "Turkey Standard Time", "Europe/Istanbul" }, - { "Turks And Caicos Standard Time", "America/Grand_Turk" }, - { "Turks And Caicos Standard Time", "America/Grand_Turk" }, - { "US Eastern Standard Time", - "America/Indianapolis America/Indiana/Marengo America/Indiana/Vevay" }, - { "US Eastern Standard Time", "America/Indianapolis" }, - { "US Mountain Standard Time", "America/Creston America/Dawson_Creek America/Fort_Nelson" }, - { "US Mountain Standard Time", "America/Hermosillo" }, - { "US Mountain Standard Time", "America/Phoenix" }, - { "US Mountain Standard Time", "America/Phoenix" }, - { "US Mountain Standard Time", "Etc/GMT+7" }, - { "UTC", "Etc/UTC Etc/GMT" }, - { "UTC", "Etc/UTC" }, - { "UTC+12", "Etc/GMT-12" }, - { "UTC+12", "Etc/GMT-12" }, - { "UTC+12", "Pacific/Funafuti" }, - { "UTC+12", "Pacific/Majuro Pacific/Kwajalein" }, - { "UTC+12", "Pacific/Nauru" }, - { "UTC+12", "Pacific/Tarawa" }, - { "UTC+12", "Pacific/Wake" }, - { "UTC+12", "Pacific/Wallis" }, - { "UTC+13", "Etc/GMT-13" }, - { "UTC+13", "Etc/GMT-13" }, - { "UTC+13", "Pacific/Enderbury" }, - { "UTC+13", "Pacific/Fakaofo" }, - { "UTC-02", "America/Noronha" }, - { "UTC-02", "Atlantic/South_Georgia" }, - { "UTC-02", "Etc/GMT+2" }, - { "UTC-02", "Etc/GMT+2" }, - { "UTC-08", "Etc/GMT+8" }, - { "UTC-08", "Etc/GMT+8" }, - { "UTC-08", "Pacific/Pitcairn" }, - { "UTC-09", "Etc/GMT+9" }, - { "UTC-09", "Etc/GMT+9" }, - { "UTC-09", "Pacific/Gambier" }, - { "UTC-11", "Etc/GMT+11" }, - { "UTC-11", "Etc/GMT+11" }, - { "UTC-11", "Pacific/Midway" }, - { "UTC-11", "Pacific/Niue" }, - { "UTC-11", "Pacific/Pago_Pago" }, - { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar Asia/Choibalsan" }, - { "Ulaanbaatar Standard Time", "Asia/Ulaanbaatar" }, - { "Venezuela Standard Time", "America/Caracas" }, - { "Venezuela Standard Time", "America/Caracas" }, - { "Vladivostok Standard Time", "Asia/Vladivostok Asia/Ust-Nera" }, - { "Vladivostok Standard Time", "Asia/Vladivostok" }, - { "Volgograd Standard Time", "Europe/Volgograd" }, - { "Volgograd Standard Time", "Europe/Volgograd" }, - { "W. Australia Standard Time", "Australia/Perth" }, - { "W. Australia Standard Time", "Australia/Perth" }, - { "W. Central Africa Standard Time", "Africa/Algiers" }, - { "W. Central Africa Standard Time", "Africa/Bangui" }, - { "W. Central Africa Standard Time", "Africa/Brazzaville" }, - { "W. Central Africa Standard Time", "Africa/Douala" }, - { "W. Central Africa Standard Time", "Africa/Kinshasa" }, - { "W. Central Africa Standard Time", "Africa/Lagos" }, - { "W. Central Africa Standard Time", "Africa/Lagos" }, - { "W. Central Africa Standard Time", "Africa/Libreville" }, - { "W. Central Africa Standard Time", "Africa/Luanda" }, - { "W. Central Africa Standard Time", "Africa/Malabo" }, - { "W. Central Africa Standard Time", "Africa/Ndjamena" }, - { "W. Central Africa Standard Time", "Africa/Niamey" }, - { "W. Central Africa Standard Time", "Africa/Porto-Novo" }, - { "W. Central Africa Standard Time", "Africa/Tunis" }, - { "W. Central Africa Standard Time", "Etc/GMT-1" }, - { "W. Europe Standard Time", "Arctic/Longyearbyen" }, - { "W. Europe Standard Time", "Europe/Amsterdam" }, - { "W. Europe Standard Time", "Europe/Andorra" }, - { "W. Europe Standard Time", "Europe/Berlin Europe/Busingen" }, - { "W. Europe Standard Time", "Europe/Berlin" }, - { "W. Europe Standard Time", "Europe/Gibraltar" }, - { "W. Europe Standard Time", "Europe/Luxembourg" }, - { "W. Europe Standard Time", "Europe/Malta" }, - { "W. Europe Standard Time", "Europe/Monaco" }, - { "W. Europe Standard Time", "Europe/Oslo" }, - { "W. Europe Standard Time", "Europe/Rome" }, - { "W. Europe Standard Time", "Europe/San_Marino" }, - { "W. Europe Standard Time", "Europe/Stockholm" }, - { "W. Europe Standard Time", "Europe/Vaduz" }, - { "W. Europe Standard Time", "Europe/Vatican" }, - { "W. Europe Standard Time", "Europe/Vienna" }, - { "W. Europe Standard Time", "Europe/Zurich" }, - { "W. Mongolia Standard Time", "Asia/Hovd" }, - { "W. Mongolia Standard Time", "Asia/Hovd" }, - { "West Asia Standard Time", "Antarctica/Mawson" }, - { "West Asia Standard Time", "Asia/Ashgabat" }, - { "West Asia Standard Time", "Asia/Dushanbe" }, - { "West Asia Standard Time", - "Asia/Oral Asia/Almaty Asia/Aqtau Asia/Aqtobe Asia/Atyrau Asia/Qostanay" }, - { "West Asia Standard Time", "Asia/Tashkent Asia/Samarkand" }, - { "West Asia Standard Time", "Asia/Tashkent" }, - { "West Asia Standard Time", "Etc/GMT-5" }, - { "West Asia Standard Time", "Indian/Kerguelen" }, - { "West Asia Standard Time", "Indian/Maldives" }, - { "West Bank Standard Time", "Asia/Hebron Asia/Gaza" }, - { "West Bank Standard Time", "Asia/Hebron" }, - { "West Pacific Standard Time", "Antarctica/DumontDUrville" }, - { "West Pacific Standard Time", "Etc/GMT-10" }, - { "West Pacific Standard Time", "Pacific/Guam" }, - { "West Pacific Standard Time", "Pacific/Port_Moresby" }, - { "West Pacific Standard Time", "Pacific/Port_Moresby" }, - { "West Pacific Standard Time", "Pacific/Saipan" }, - { "West Pacific Standard Time", "Pacific/Truk" }, - { "Yakutsk Standard Time", "Asia/Yakutsk Asia/Khandyga" }, - { "Yakutsk Standard Time", "Asia/Yakutsk" }, - { "Yukon Standard Time", "America/Whitehorse America/Dawson" }, - { "Yukon Standard Time", "America/Whitehorse" }, + "America/Jujuy America/Mendoza", + "Argentina Standard Time" }, // AR + { "America/Godthab", "Greenland Standard Time" }, // 001 + { "America/Godthab", "Greenland Standard Time" }, // GL + { "America/Montevideo", "Montevideo Standard Time" }, // 001 + { "America/Montevideo", "Montevideo Standard Time" }, // UY + { "America/Punta_Arenas", "Magallanes Standard Time" }, // 001 + { "America/Punta_Arenas", "Magallanes Standard Time" }, // CL + { "America/Miquelon", "Saint Pierre Standard Time" }, // 001 + { "America/Miquelon", "Saint Pierre Standard Time" }, // PM + { "America/Bahia", "Bahia Standard Time" }, // 001 + { "America/Bahia", "Bahia Standard Time" }, // BR + { "Etc/GMT+2", "UTC-02" }, // 001 + { "America/Noronha", "UTC-02" }, // BR + { "Atlantic/South_Georgia", "UTC-02" }, // GS + { "Etc/GMT+2", "UTC-02" }, // ZZ + { "Atlantic/Azores", "Azores Standard Time" }, // 001 + { "America/Scoresbysund", "Azores Standard Time" }, // GL + { "Atlantic/Azores", "Azores Standard Time" }, // PT + { "Atlantic/Cape_Verde", "Cape Verde Standard Time" }, // 001 + { "Atlantic/Cape_Verde", "Cape Verde Standard Time" }, // CV + { "Etc/GMT+1", "Cape Verde Standard Time" }, // ZZ + { "Etc/UTC", "UTC" }, // 001 + { "Etc/UTC Etc/GMT", "UTC" }, // ZZ + { "Europe/London", "GMT Standard Time" }, // 001 + { "Atlantic/Canary", "GMT Standard Time" }, // ES + { "Atlantic/Faeroe", "GMT Standard Time" }, // FO + { "Europe/London", "GMT Standard Time" }, // GB + { "Europe/Guernsey", "GMT Standard Time" }, // GG + { "Europe/Dublin", "GMT Standard Time" }, // IE + { "Europe/Isle_of_Man", "GMT Standard Time" }, // IM + { "Europe/Jersey", "GMT Standard Time" }, // JE + { "Europe/Lisbon Atlantic/Madeira", "GMT Standard Time" }, // PT + { "Atlantic/Reykjavik", "Greenwich Standard Time" }, // 001 + { "Africa/Ouagadougou", "Greenwich Standard Time" }, // BF + { "Africa/Abidjan", "Greenwich Standard Time" }, // CI + { "Africa/Accra", "Greenwich Standard Time" }, // GH + { "America/Danmarkshavn", "Greenwich Standard Time" }, // GL + { "Africa/Banjul", "Greenwich Standard Time" }, // GM + { "Africa/Conakry", "Greenwich Standard Time" }, // GN + { "Africa/Bissau", "Greenwich Standard Time" }, // GW + { "Atlantic/Reykjavik", "Greenwich Standard Time" }, // IS + { "Africa/Monrovia", "Greenwich Standard Time" }, // LR + { "Africa/Bamako", "Greenwich Standard Time" }, // ML + { "Africa/Nouakchott", "Greenwich Standard Time" }, // MR + { "Atlantic/St_Helena", "Greenwich Standard Time" }, // SH + { "Africa/Freetown", "Greenwich Standard Time" }, // SL + { "Africa/Dakar", "Greenwich Standard Time" }, // SN + { "Africa/Lome", "Greenwich Standard Time" }, // TG + { "Africa/Sao_Tome", "Sao Tome Standard Time" }, // 001 + { "Africa/Sao_Tome", "Sao Tome Standard Time" }, // ST + { "Africa/Casablanca", "Morocco Standard Time" }, // 001 + { "Africa/El_Aaiun", "Morocco Standard Time" }, // EH + { "Africa/Casablanca", "Morocco Standard Time" }, // MA + { "Europe/Berlin", "W. Europe Standard Time" }, // 001 + { "Europe/Andorra", "W. Europe Standard Time" }, // AD + { "Europe/Vienna", "W. Europe Standard Time" }, // AT + { "Europe/Zurich", "W. Europe Standard Time" }, // CH + { "Europe/Berlin Europe/Busingen", "W. Europe Standard Time" }, // DE + { "Europe/Gibraltar", "W. Europe Standard Time" }, // GI + { "Europe/Rome", "W. Europe Standard Time" }, // IT + { "Europe/Vaduz", "W. Europe Standard Time" }, // LI + { "Europe/Luxembourg", "W. Europe Standard Time" }, // LU + { "Europe/Monaco", "W. Europe Standard Time" }, // MC + { "Europe/Malta", "W. Europe Standard Time" }, // MT + { "Europe/Amsterdam", "W. Europe Standard Time" }, // NL + { "Europe/Oslo", "W. Europe Standard Time" }, // NO + { "Europe/Stockholm", "W. Europe Standard Time" }, // SE + { "Arctic/Longyearbyen", "W. Europe Standard Time" }, // SJ + { "Europe/San_Marino", "W. Europe Standard Time" }, // SM + { "Europe/Vatican", "W. Europe Standard Time" }, // VA + { "Europe/Budapest", "Central Europe Standard Time" }, // 001 + { "Europe/Tirane", "Central Europe Standard Time" }, // AL + { "Europe/Prague", "Central Europe Standard Time" }, // CZ + { "Europe/Budapest", "Central Europe Standard Time" }, // HU + { "Europe/Podgorica", "Central Europe Standard Time" }, // ME + { "Europe/Belgrade", "Central Europe Standard Time" }, // RS + { "Europe/Ljubljana", "Central Europe Standard Time" }, // SI + { "Europe/Bratislava", "Central Europe Standard Time" }, // SK + { "Europe/Paris", "Romance Standard Time" }, // 001 + { "Europe/Brussels", "Romance Standard Time" }, // BE + { "Europe/Copenhagen", "Romance Standard Time" }, // DK + { "Europe/Madrid Africa/Ceuta", "Romance Standard Time" }, // ES + { "Europe/Paris", "Romance Standard Time" }, // FR + { "Europe/Warsaw", "Central European Standard Time" }, // 001 + { "Europe/Sarajevo", "Central European Standard Time" }, // BA + { "Europe/Zagreb", "Central European Standard Time" }, // HR + { "Europe/Skopje", "Central European Standard Time" }, // MK + { "Europe/Warsaw", "Central European Standard Time" }, // PL + { "Africa/Lagos", "W. Central Africa Standard Time" }, // 001 + { "Africa/Luanda", "W. Central Africa Standard Time" }, // AO + { "Africa/Porto-Novo", "W. Central Africa Standard Time" }, // BJ + { "Africa/Kinshasa", "W. Central Africa Standard Time" }, // CD + { "Africa/Bangui", "W. Central Africa Standard Time" }, // CF + { "Africa/Brazzaville", "W. Central Africa Standard Time" }, // CG + { "Africa/Douala", "W. Central Africa Standard Time" }, // CM + { "Africa/Algiers", "W. Central Africa Standard Time" }, // DZ + { "Africa/Libreville", "W. Central Africa Standard Time" }, // GA + { "Africa/Malabo", "W. Central Africa Standard Time" }, // GQ + { "Africa/Niamey", "W. Central Africa Standard Time" }, // NE + { "Africa/Lagos", "W. Central Africa Standard Time" }, // NG + { "Africa/Ndjamena", "W. Central Africa Standard Time" }, // TD + { "Africa/Tunis", "W. Central Africa Standard Time" }, // TN + { "Etc/GMT-1", "W. Central Africa Standard Time" }, // ZZ + { "Asia/Amman", "Jordan Standard Time" }, // 001 + { "Asia/Amman", "Jordan Standard Time" }, // JO + { "Europe/Bucharest", "GTB Standard Time" }, // 001 + { "Asia/Nicosia Asia/Famagusta", "GTB Standard Time" }, // CY + { "Europe/Athens", "GTB Standard Time" }, // GR + { "Europe/Bucharest", "GTB Standard Time" }, // RO + { "Asia/Beirut", "Middle East Standard Time" }, // 001 + { "Asia/Beirut", "Middle East Standard Time" }, // LB + { "Africa/Cairo", "Egypt Standard Time" }, // 001 + { "Africa/Cairo", "Egypt Standard Time" }, // EG + { "Europe/Chisinau", "E. Europe Standard Time" }, // 001 + { "Europe/Chisinau", "E. Europe Standard Time" }, // MD + { "Asia/Damascus", "Syria Standard Time" }, // 001 + { "Asia/Damascus", "Syria Standard Time" }, // SY + { "Asia/Hebron", "West Bank Standard Time" }, // 001 + { "Asia/Hebron Asia/Gaza", "West Bank Standard Time" }, // PS + { "Africa/Johannesburg", "South Africa Standard Time" }, // 001 + { "Africa/Bujumbura", "South Africa Standard Time" }, // BI + { "Africa/Gaborone", "South Africa Standard Time" }, // BW + { "Africa/Lubumbashi", "South Africa Standard Time" }, // CD + { "Africa/Maseru", "South Africa Standard Time" }, // LS + { "Africa/Blantyre", "South Africa Standard Time" }, // MW + { "Africa/Maputo", "South Africa Standard Time" }, // MZ + { "Africa/Kigali", "South Africa Standard Time" }, // RW + { "Africa/Mbabane", "South Africa Standard Time" }, // SZ + { "Africa/Johannesburg", "South Africa Standard Time" }, // ZA + { "Africa/Lusaka", "South Africa Standard Time" }, // ZM + { "Africa/Harare", "South Africa Standard Time" }, // ZW + { "Etc/GMT-2", "South Africa Standard Time" }, // ZZ + { "Europe/Kiev", "FLE Standard Time" }, // 001 + { "Europe/Mariehamn", "FLE Standard Time" }, // AX + { "Europe/Sofia", "FLE Standard Time" }, // BG + { "Europe/Tallinn", "FLE Standard Time" }, // EE + { "Europe/Helsinki", "FLE Standard Time" }, // FI + { "Europe/Vilnius", "FLE Standard Time" }, // LT + { "Europe/Riga", "FLE Standard Time" }, // LV + { "Europe/Kiev", "FLE Standard Time" }, // UA + { "Asia/Jerusalem", "Israel Standard Time" }, // 001 + { "Asia/Jerusalem", "Israel Standard Time" }, // IL + { "Africa/Juba", "South Sudan Standard Time" }, // 001 + { "Africa/Juba", "South Sudan Standard Time" }, // SS + { "Europe/Kaliningrad", "Kaliningrad Standard Time" }, // 001 + { "Europe/Kaliningrad", "Kaliningrad Standard Time" }, // RU + { "Africa/Khartoum", "Sudan Standard Time" }, // 001 + { "Africa/Khartoum", "Sudan Standard Time" }, // SD + { "Africa/Tripoli", "Libya Standard Time" }, // 001 + { "Africa/Tripoli", "Libya Standard Time" }, // LY + { "Africa/Windhoek", "Namibia Standard Time" }, // 001 + { "Africa/Windhoek", "Namibia Standard Time" }, // NA + { "Asia/Baghdad", "Arabic Standard Time" }, // 001 + { "Asia/Baghdad", "Arabic Standard Time" }, // IQ + { "Europe/Istanbul", "Turkey Standard Time" }, // 001 + { "Europe/Istanbul", "Turkey Standard Time" }, // TR + { "Asia/Riyadh", "Arab Standard Time" }, // 001 + { "Asia/Bahrain", "Arab Standard Time" }, // BH + { "Asia/Kuwait", "Arab Standard Time" }, // KW + { "Asia/Qatar", "Arab Standard Time" }, // QA + { "Asia/Riyadh", "Arab Standard Time" }, // SA + { "Asia/Aden", "Arab Standard Time" }, // YE + { "Europe/Minsk", "Belarus Standard Time" }, // 001 + { "Europe/Minsk", "Belarus Standard Time" }, // BY + { "Europe/Moscow", "Russian Standard Time" }, // 001 + { "Europe/Moscow Europe/Kirov", "Russian Standard Time" }, // RU + { "Europe/Simferopol", "Russian Standard Time" }, // UA + { "Africa/Nairobi", "E. Africa Standard Time" }, // 001 + { "Antarctica/Syowa", "E. Africa Standard Time" }, // AQ + { "Africa/Djibouti", "E. Africa Standard Time" }, // DJ + { "Africa/Asmera", "E. Africa Standard Time" }, // ER + { "Africa/Addis_Ababa", "E. Africa Standard Time" }, // ET + { "Africa/Nairobi", "E. Africa Standard Time" }, // KE + { "Indian/Comoro", "E. Africa Standard Time" }, // KM + { "Indian/Antananarivo", "E. Africa Standard Time" }, // MG + { "Africa/Mogadishu", "E. Africa Standard Time" }, // SO + { "Africa/Dar_es_Salaam", "E. Africa Standard Time" }, // TZ + { "Africa/Kampala", "E. Africa Standard Time" }, // UG + { "Indian/Mayotte", "E. Africa Standard Time" }, // YT + { "Etc/GMT-3", "E. Africa Standard Time" }, // ZZ + { "Asia/Tehran", "Iran Standard Time" }, // 001 + { "Asia/Tehran", "Iran Standard Time" }, // IR + { "Asia/Dubai", "Arabian Standard Time" }, // 001 + { "Asia/Dubai", "Arabian Standard Time" }, // AE + { "Asia/Muscat", "Arabian Standard Time" }, // OM + { "Etc/GMT-4", "Arabian Standard Time" }, // ZZ + { "Europe/Astrakhan", "Astrakhan Standard Time" }, // 001 + { "Europe/Astrakhan Europe/Ulyanovsk", "Astrakhan Standard Time" }, // RU + { "Asia/Baku", "Azerbaijan Standard Time" }, // 001 + { "Asia/Baku", "Azerbaijan Standard Time" }, // AZ + { "Europe/Samara", "Russia Time Zone 3" }, // 001 + { "Europe/Samara", "Russia Time Zone 3" }, // RU + { "Indian/Mauritius", "Mauritius Standard Time" }, // 001 + { "Indian/Mauritius", "Mauritius Standard Time" }, // MU + { "Indian/Reunion", "Mauritius Standard Time" }, // RE + { "Indian/Mahe", "Mauritius Standard Time" }, // SC + { "Europe/Saratov", "Saratov Standard Time" }, // 001 + { "Europe/Saratov", "Saratov Standard Time" }, // RU + { "Asia/Tbilisi", "Georgian Standard Time" }, // 001 + { "Asia/Tbilisi", "Georgian Standard Time" }, // GE + { "Europe/Volgograd", "Volgograd Standard Time" }, // 001 + { "Europe/Volgograd", "Volgograd Standard Time" }, // RU + { "Asia/Yerevan", "Caucasus Standard Time" }, // 001 + { "Asia/Yerevan", "Caucasus Standard Time" }, // AM + { "Asia/Kabul", "Afghanistan Standard Time" }, // 001 + { "Asia/Kabul", "Afghanistan Standard Time" }, // AF + { "Asia/Tashkent", "West Asia Standard Time" }, // 001 + { "Antarctica/Mawson", "West Asia Standard Time" }, // AQ + { "Asia/Oral Asia/Almaty Asia/Aqtau Asia/Aqtobe Asia/Atyrau Asia/Qostanay", + "West Asia Standard Time" }, // KZ + { "Indian/Maldives", "West Asia Standard Time" }, // MV + { "Indian/Kerguelen", "West Asia Standard Time" }, // TF + { "Asia/Dushanbe", "West Asia Standard Time" }, // TJ + { "Asia/Ashgabat", "West Asia Standard Time" }, // TM + { "Asia/Tashkent Asia/Samarkand", "West Asia Standard Time" }, // UZ + { "Etc/GMT-5", "West Asia Standard Time" }, // ZZ + { "Asia/Yekaterinburg", "Ekaterinburg Standard Time" }, // 001 + { "Asia/Yekaterinburg", "Ekaterinburg Standard Time" }, // RU + { "Asia/Karachi", "Pakistan Standard Time" }, // 001 + { "Asia/Karachi", "Pakistan Standard Time" }, // PK + { "Asia/Qyzylorda", "Qyzylorda Standard Time" }, // 001 + { "Asia/Qyzylorda", "Qyzylorda Standard Time" }, // KZ + { "Asia/Calcutta", "India Standard Time" }, // 001 + { "Asia/Calcutta", "India Standard Time" }, // IN + { "Asia/Colombo", "Sri Lanka Standard Time" }, // 001 + { "Asia/Colombo", "Sri Lanka Standard Time" }, // LK + { "Asia/Katmandu", "Nepal Standard Time" }, // 001 + { "Asia/Katmandu", "Nepal Standard Time" }, // NP + { "Asia/Bishkek", "Central Asia Standard Time" }, // 001 + { "Antarctica/Vostok", "Central Asia Standard Time" }, // AQ + { "Asia/Urumqi", "Central Asia Standard Time" }, // CN + { "Indian/Chagos", "Central Asia Standard Time" }, // IO + { "Asia/Bishkek", "Central Asia Standard Time" }, // KG + { "Etc/GMT-6", "Central Asia Standard Time" }, // ZZ + { "Asia/Dhaka", "Bangladesh Standard Time" }, // 001 + { "Asia/Dhaka", "Bangladesh Standard Time" }, // BD + { "Asia/Thimphu", "Bangladesh Standard Time" }, // BT + { "Asia/Omsk", "Omsk Standard Time" }, // 001 + { "Asia/Omsk", "Omsk Standard Time" }, // RU + { "Asia/Rangoon", "Myanmar Standard Time" }, // 001 + { "Indian/Cocos", "Myanmar Standard Time" }, // CC + { "Asia/Rangoon", "Myanmar Standard Time" }, // MM + { "Asia/Bangkok", "SE Asia Standard Time" }, // 001 + { "Antarctica/Davis", "SE Asia Standard Time" }, // AQ + { "Indian/Christmas", "SE Asia Standard Time" }, // CX + { "Asia/Jakarta Asia/Pontianak", "SE Asia Standard Time" }, // ID + { "Asia/Phnom_Penh", "SE Asia Standard Time" }, // KH + { "Asia/Vientiane", "SE Asia Standard Time" }, // LA + { "Asia/Bangkok", "SE Asia Standard Time" }, // TH + { "Asia/Saigon", "SE Asia Standard Time" }, // VN + { "Etc/GMT-7", "SE Asia Standard Time" }, // ZZ + { "Asia/Barnaul", "Altai Standard Time" }, // 001 + { "Asia/Barnaul", "Altai Standard Time" }, // RU + { "Asia/Hovd", "W. Mongolia Standard Time" }, // 001 + { "Asia/Hovd", "W. Mongolia Standard Time" }, // MN + { "Asia/Krasnoyarsk", "North Asia Standard Time" }, // 001 + { "Asia/Krasnoyarsk Asia/Novokuznetsk", "North Asia Standard Time" }, // RU + { "Asia/Novosibirsk", "N. Central Asia Standard Time" }, // 001 + { "Asia/Novosibirsk", "N. Central Asia Standard Time" }, // RU + { "Asia/Tomsk", "Tomsk Standard Time" }, // 001 + { "Asia/Tomsk", "Tomsk Standard Time" }, // RU + { "Asia/Shanghai", "China Standard Time" }, // 001 + { "Asia/Shanghai", "China Standard Time" }, // CN + { "Asia/Hong_Kong", "China Standard Time" }, // HK + { "Asia/Macau", "China Standard Time" }, // MO + { "Asia/Irkutsk", "North Asia East Standard Time" }, // 001 + { "Asia/Irkutsk", "North Asia East Standard Time" }, // RU + { "Asia/Singapore", "Singapore Standard Time" }, // 001 + { "Asia/Brunei", "Singapore Standard Time" }, // BN + { "Asia/Makassar", "Singapore Standard Time" }, // ID + { "Asia/Kuala_Lumpur Asia/Kuching", "Singapore Standard Time" }, // MY + { "Asia/Manila", "Singapore Standard Time" }, // PH + { "Asia/Singapore", "Singapore Standard Time" }, // SG + { "Etc/GMT-8", "Singapore Standard Time" }, // ZZ + { "Australia/Perth", "W. Australia Standard Time" }, // 001 + { "Australia/Perth", "W. Australia Standard Time" }, // AU + { "Asia/Taipei", "Taipei Standard Time" }, // 001 + { "Asia/Taipei", "Taipei Standard Time" }, // TW + { "Asia/Ulaanbaatar", "Ulaanbaatar Standard Time" }, // 001 + { "Asia/Ulaanbaatar Asia/Choibalsan", "Ulaanbaatar Standard Time" }, // MN + { "Australia/Eucla", "Aus Central W. Standard Time" }, // 001 + { "Australia/Eucla", "Aus Central W. Standard Time" }, // AU + { "Asia/Chita", "Transbaikal Standard Time" }, // 001 + { "Asia/Chita", "Transbaikal Standard Time" }, // RU + { "Asia/Tokyo", "Tokyo Standard Time" }, // 001 + { "Asia/Jayapura", "Tokyo Standard Time" }, // ID + { "Asia/Tokyo", "Tokyo Standard Time" }, // JP + { "Pacific/Palau", "Tokyo Standard Time" }, // PW + { "Asia/Dili", "Tokyo Standard Time" }, // TL + { "Etc/GMT-9", "Tokyo Standard Time" }, // ZZ + { "Asia/Pyongyang", "North Korea Standard Time" }, // 001 + { "Asia/Pyongyang", "North Korea Standard Time" }, // KP + { "Asia/Seoul", "Korea Standard Time" }, // 001 + { "Asia/Seoul", "Korea Standard Time" }, // KR + { "Asia/Yakutsk", "Yakutsk Standard Time" }, // 001 + { "Asia/Yakutsk Asia/Khandyga", "Yakutsk Standard Time" }, // RU + { "Australia/Adelaide", "Cen. Australia Standard Time" }, // 001 + { "Australia/Adelaide Australia/Broken_Hill", "Cen. Australia Standard Time" }, // AU + { "Australia/Darwin", "AUS Central Standard Time" }, // 001 + { "Australia/Darwin", "AUS Central Standard Time" }, // AU + { "Australia/Brisbane", "E. Australia Standard Time" }, // 001 + { "Australia/Brisbane Australia/Lindeman", "E. Australia Standard Time" }, // AU + { "Australia/Sydney", "AUS Eastern Standard Time" }, // 001 + { "Australia/Sydney Australia/Melbourne", "AUS Eastern Standard Time" }, // AU + { "Pacific/Port_Moresby", "West Pacific Standard Time" }, // 001 + { "Antarctica/DumontDUrville", "West Pacific Standard Time" }, // AQ + { "Pacific/Truk", "West Pacific Standard Time" }, // FM + { "Pacific/Guam", "West Pacific Standard Time" }, // GU + { "Pacific/Saipan", "West Pacific Standard Time" }, // MP + { "Pacific/Port_Moresby", "West Pacific Standard Time" }, // PG + { "Etc/GMT-10", "West Pacific Standard Time" }, // ZZ + { "Australia/Hobart", "Tasmania Standard Time" }, // 001 + { "Australia/Hobart Antarctica/Macquarie", "Tasmania Standard Time" }, // AU + { "Asia/Vladivostok", "Vladivostok Standard Time" }, // 001 + { "Asia/Vladivostok Asia/Ust-Nera", "Vladivostok Standard Time" }, // RU + { "Australia/Lord_Howe", "Lord Howe Standard Time" }, // 001 + { "Australia/Lord_Howe", "Lord Howe Standard Time" }, // AU + { "Pacific/Bougainville", "Bougainville Standard Time" }, // 001 + { "Pacific/Bougainville", "Bougainville Standard Time" }, // PG + { "Asia/Srednekolymsk", "Russia Time Zone 10" }, // 001 + { "Asia/Srednekolymsk", "Russia Time Zone 10" }, // RU + { "Asia/Magadan", "Magadan Standard Time" }, // 001 + { "Asia/Magadan", "Magadan Standard Time" }, // RU + { "Pacific/Norfolk", "Norfolk Standard Time" }, // 001 + { "Pacific/Norfolk", "Norfolk Standard Time" }, // NF + { "Asia/Sakhalin", "Sakhalin Standard Time" }, // 001 + { "Asia/Sakhalin", "Sakhalin Standard Time" }, // RU + { "Pacific/Guadalcanal", "Central Pacific Standard Time" }, // 001 + { "Antarctica/Casey", "Central Pacific Standard Time" }, // AQ + { "Pacific/Ponape Pacific/Kosrae", "Central Pacific Standard Time" }, // FM + { "Pacific/Noumea", "Central Pacific Standard Time" }, // NC + { "Pacific/Guadalcanal", "Central Pacific Standard Time" }, // SB + { "Pacific/Efate", "Central Pacific Standard Time" }, // VU + { "Etc/GMT-11", "Central Pacific Standard Time" }, // ZZ + { "Asia/Kamchatka", "Russia Time Zone 11" }, // 001 + { "Asia/Kamchatka Asia/Anadyr", "Russia Time Zone 11" }, // RU + { "Pacific/Auckland", "New Zealand Standard Time" }, // 001 + { "Antarctica/McMurdo", "New Zealand Standard Time" }, // AQ + { "Pacific/Auckland", "New Zealand Standard Time" }, // NZ + { "Etc/GMT-12", "UTC+12" }, // 001 + { "Pacific/Tarawa", "UTC+12" }, // KI + { "Pacific/Majuro Pacific/Kwajalein", "UTC+12" }, // MH + { "Pacific/Nauru", "UTC+12" }, // NR + { "Pacific/Funafuti", "UTC+12" }, // TV + { "Pacific/Wake", "UTC+12" }, // UM + { "Pacific/Wallis", "UTC+12" }, // WF + { "Etc/GMT-12", "UTC+12" }, // ZZ + { "Pacific/Fiji", "Fiji Standard Time" }, // 001 + { "Pacific/Fiji", "Fiji Standard Time" }, // FJ + { "Pacific/Chatham", "Chatham Islands Standard Time" }, // 001 + { "Pacific/Chatham", "Chatham Islands Standard Time" }, // NZ + { "Etc/GMT-13", "UTC+13" }, // 001 + { "Pacific/Enderbury", "UTC+13" }, // KI + { "Pacific/Fakaofo", "UTC+13" }, // TK + { "Etc/GMT-13", "UTC+13" }, // ZZ + { "Pacific/Tongatapu", "Tonga Standard Time" }, // 001 + { "Pacific/Tongatapu", "Tonga Standard Time" }, // TO + { "Pacific/Apia", "Samoa Standard Time" }, // 001 + { "Pacific/Apia", "Samoa Standard Time" }, // WS + { "Pacific/Kiritimati", "Line Islands Standard Time" }, // 001 + { "Pacific/Kiritimati", "Line Islands Standard Time" }, // KI + { "Etc/GMT-14", "Line Islands Standard Time" }, // ZZ }; -const size_t WindowsTimeZoneIdTableNrElements = ARRAYSIZE(WindowsTimeZoneIdTable); +const size_t WindowsZonesNrElements = ARRAYSIZE(WindowsZones); diff --git a/winpr/libwinpr/timezone/WindowsZones.h b/winpr/libwinpr/timezone/WindowsZones.h index 231c0c66b..90258ab9e 100644 --- a/winpr/libwinpr/timezone/WindowsZones.h +++ b/winpr/libwinpr/timezone/WindowsZones.h @@ -12,7 +12,7 @@ typedef struct const char* tzid; } WINDOWS_TZID_ENTRY; -extern const WINDOWS_TZID_ENTRY WindowsTimeZoneIdTable[]; -extern const size_t WindowsTimeZoneIdTableNrElements; +extern const WINDOWS_TZID_ENTRY WindowsZones[]; +extern const size_t WindowsZonesNrElements; #endif /* WINPR_WINDOWS_ZONES_H_ */ diff --git a/winpr/libwinpr/timezone/utils/CMakeLists.txt b/winpr/libwinpr/timezone/utils/CMakeLists.txt new file mode 100644 index 000000000..fad24ef68 --- /dev/null +++ b/winpr/libwinpr/timezone/utils/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.13) + +if(POLICY CMP0091) + cmake_policy(SET CMP0091 NEW) +endif() + +project(tzextract VERSION 1.0.0 LANGUAGES CSharp) + +set(CMAKE_CSharp_FLAGS "/langversion:10") +set(CMAKE_DOTNET_TARGET_FRAMEWORK "net6.0") +set(CMAKE_DOTNET_SDK "Microsoft.NET.Sdk") + +add_executable(${PROJECT_NAME} + tzextract.cs +) + +set_property(TARGET ${PROJECT_NAME} PROPERTY WIN32_EXECUTABLE FALSE) + +set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCES + "System" + "System.Collections.Generic" + "System.IO" + "System.Net.Http" + "System.Linq" + "System.Threading" + "System.Threading.Tasks" + ) diff --git a/winpr/libwinpr/timezone/utils/tzextract.cs b/winpr/libwinpr/timezone/utils/tzextract.cs new file mode 100644 index 000000000..b87db7a68 --- /dev/null +++ b/winpr/libwinpr/timezone/utils/tzextract.cs @@ -0,0 +1,172 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Schema; + +internal class Program +{ + private static string app = AppDomain.CurrentDomain.FriendlyName; + private static TextWriter stderr = Console.Error; + private static TextWriter stdout = Console.Out; + + private static void usage() + { + stderr.WriteLine("Usage:"); + stderr.WriteLine(app + " "); + Environment.Exit(1); + } + + private static bool writeZoneMap(string path) + { + string fname = "TimeZoneNameMap"; + string fpath = Path.Combine(path, fname + ".c"); + + using (StreamWriter fs = new StreamWriter(fpath)) + { + fs.WriteLine("/* Automatically generated by " + app + " */"); + fs.WriteLine(""); + fs.WriteLine("#include \"" + fname + ".h\""); + fs.WriteLine(""); + fs.WriteLine("const " + fname + "Entry " + fname + "[] ={"); + + foreach (System.TimeZoneInfo tz in System.TimeZoneInfo.GetSystemTimeZones()) + { + string iana; + System.TimeZoneInfo.TryConvertWindowsIdToIanaId(tz.Id, out iana); + + StringBuilder sb = new StringBuilder(); + sb.Append("{ \""); + sb.Append(tz.Id); + sb.Append("\", \""); + sb.Append(tz.StandardName); + sb.Append("\", \""); + sb.Append(tz.DisplayName); + sb.Append("\", \""); + sb.Append(tz.DaylightName); + sb.Append("\", \""); + sb.Append(iana); + sb.Append("\" },"); + fs.WriteLine(sb.ToString()); + } + + fs.WriteLine("};"); + fs.WriteLine(""); + fs.WriteLine("const size_t " + fname + "Size = ARRAYSIZE(" + fname + ");"); + fs.WriteLine(""); + } + return true; + } + + private static void onValidation(object sender, ValidationEventArgs e) + { + switch (e.Severity) + { + case XmlSeverityType.Warning: + case XmlSeverityType.Error: + stderr.WriteLine(e.ToString()); + break; + default: + break; + } + } + private static bool updateWindowsIanaMap(string path) + { + string url = + "https://raw.githubusercontent.com/unicode-org/cldr/main/common/supplemental/windowsZones.xml"; + string fname = "WindowsZones"; + string fpath = Path.Combine(path, fname + ".c"); + + XmlDocument doc = new XmlDocument(); + doc.Load(url); + + stdout.WriteLine("Downloaded and parsed XML from '" + url + "'"); + + ValidationEventHandler handler = new ValidationEventHandler(onValidation); + // doc.Validate(handler); + + XmlNodeList versions = doc.SelectNodes("//supplementalData/version"); + XmlNodeList zones = doc.SelectNodes("//supplementalData/windowsZones/mapTimezones"); + XmlNodeList mzones = + doc.SelectNodes("//supplementalData/windowsZones/mapTimezones/mapZone"); + + using (StreamWriter fs = new StreamWriter(fpath)) + { + fs.WriteLine("/* Automatically generated by " + app); + fs.WriteLine(" *"); + fs.WriteLine(" * url " + url); + + foreach (XmlNode version in versions) + { + XmlNode nr = version.Attributes.GetNamedItem("number"); + fs.WriteLine(" * version: " + nr.InnerText); + } + + fs.WriteLine(""); + fs.WriteLine("#include \"" + fname + ".h\""); + fs.WriteLine(""); + fs.WriteLine("const \" + fname + \"Entry \" + fname + \"[] ={"); + + foreach (XmlNode node in zones) + { + XmlNode over = node.Attributes.GetNamedItem("otherVersion"); + XmlNode tver = node.Attributes.GetNamedItem("typeVersion"); + fs.WriteLine(" * mapTimezones: otherVersion: " + over.InnerText + + ", typeVersion: " + tver.InnerText); + } + + fs.WriteLine(" */"); + fs.WriteLine(""); + fs.WriteLine("#include \"" + fname + ".h\""); + fs.WriteLine(""); + fs.WriteLine("const WINDOWS_TZID_ENTRY " + fname + "IdTable[] = {"); + + foreach (XmlNode mzone in mzones) + { + XmlAttributeCollection attrs = mzone.Attributes; + XmlNode wzid = attrs.GetNamedItem("other"); + XmlNode territory = attrs.GetNamedItem("territory"); + XmlNode iana = attrs.GetNamedItem("type"); + fs.WriteLine("\t{ \"" + iana.InnerText + "\", \"" + wzid.InnerText + "\" }, // " + + territory.InnerText); + } + + fs.WriteLine("};"); + fs.WriteLine(""); + fs.WriteLine("const size_t " + fname + "NrElements = ARRAYSIZE(" + fname + ");"); + } + stdout.WriteLine("Finished update"); + return true; + } + + private static void Main(string[] args) + { + try + { + if (args.Length == 0) + { + stderr.WriteLine("Missing arguments!"); + usage(); + } + + DirectoryInfo info = new DirectoryInfo(args[0]); + if (!info.Exists) + { + stderr.WriteLine("Path '" + info.FullName + "' does not exist"); + usage(); + } + + if (!writeZoneMap(info.FullName)) + return; + + updateWindowsIanaMap(info.FullName); + } + catch (Exception e) + { + stderr.WriteLine(e.ToString()); + Environment.Exit(-23); + } + } +}