diff --git a/Directory.Build.props b/Directory.Build.props index 5b98c96..6e20627 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - 10 + latest true enable @@ -12,7 +12,6 @@ - diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d490252..48528f9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -17,4 +17,8 @@ latest-Recommended + + + + diff --git a/src/TimeZoneConverter.DataBuilder/Program.cs b/src/TimeZoneConverter.DataBuilder/Program.cs index e19983a..b56f4c1 100644 --- a/src/TimeZoneConverter.DataBuilder/Program.cs +++ b/src/TimeZoneConverter.DataBuilder/Program.cs @@ -50,10 +50,6 @@ public static void Main(string[] args) // Remove the alias for "Etc/Unknown Factory" as it's not a valid zone. aliases.Remove("Etc/Unknown,Factory"); - // Add missing Rails mappings where they make sense - railsMapping.Remove("Arizona,America/Phoenix"); - railsMapping.Add("Arizona,America/Phoenix America/Whitehorse"); - // Add mappings for ISO country codes that aren't used in CLDR mapping.Add("Romance Standard Time,EA,Africa/Ceuta"); mapping.Add("GMT Standard Time,IC,Atlantic/Canary"); diff --git a/src/TimeZoneConverter/Data/RailsMapping.csv.gz b/src/TimeZoneConverter/Data/RailsMapping.csv.gz index 8e6d013..4829cf7 100644 Binary files a/src/TimeZoneConverter/Data/RailsMapping.csv.gz and b/src/TimeZoneConverter/Data/RailsMapping.csv.gz differ diff --git a/src/TimeZoneConverter/TZConvert.cs b/src/TimeZoneConverter/TZConvert.cs index b28fa9f..8391e51 100644 --- a/src/TimeZoneConverter/TZConvert.cs +++ b/src/TimeZoneConverter/TZConvert.cs @@ -16,7 +16,7 @@ public static class TZConvert private static readonly Dictionary> InverseRailsMap = new(StringComparer.OrdinalIgnoreCase); private static readonly Dictionary Links = new(StringComparer.OrdinalIgnoreCase); private static readonly Dictionary SystemTimeZones; - + private static readonly IDictionary> IanaTerritoryZones = new Dictionary>(StringComparer.OrdinalIgnoreCase); @@ -78,7 +78,7 @@ public static IReadOnlyDictionary> GetIanaTi return new ReadOnlyDictionary>( IanaTerritoryZones.ToDictionary( x => x.Key, - x => (IReadOnlyCollection) x.Value + x => (IReadOnlyCollection)x.Value .OrderBy(zone => zone) .ToList().AsReadOnly())); } @@ -87,7 +87,7 @@ public static IReadOnlyDictionary> GetIanaTi return new ReadOnlyDictionary>( IanaTerritoryZones.ToDictionary( x => x.Key, - x => (IReadOnlyCollection) x.Value + x => (IReadOnlyCollection)x.Value .Select(zone => TryIanaToWindows(zone, out var winId) ? WindowsToIana(winId, x.Key) : zone) @@ -184,7 +184,7 @@ public static string WindowsToIana(string windowsTimeZoneId, string territoryCod throw new InvalidTimeZoneException( $"\"{windowsTimeZoneId}\" was not recognized as a valid Windows time zone ID."); } - + /// /// Attempts to convert a Windows time zone ID to an equivalent IANA time zone name. /// Uses the "golden zone" - the one that is the most prevalent. @@ -395,6 +395,23 @@ public static IList IanaToRails(string ianaTimeZoneName) /// true if successful, false otherwise. public static bool TryIanaToRails(string ianaTimeZoneName, out IList railsTimeZoneNames) { + + // in the case of an Etc/GMT+/-n zone, use the Rails fixed-offset zone. For example, `Etc/GMT-6` -> `+06:00` or `Etc/GMT+3` -> `-03:00` + if (ianaTimeZoneName.StartsWith("Etc/GMT", StringComparison.OrdinalIgnoreCase)) + { + var offsetPart = ianaTimeZoneName[7..]; + if (offsetPart.Length > 2) + { + var sign = offsetPart[0]; + if ((sign == '+' || sign == '-') && int.TryParse(offsetPart[1..], out var hours) && hours is >= 0 and <= 14) + { + var offsetString = $"{(sign == '+' ? '-' : '+')}{hours:00}:00"; // note the inverted sign + railsTimeZoneNames = [offsetString]; + return true; + } + } + } + // try directly first if (InverseRailsMap.TryGetValue(ianaTimeZoneName, out railsTimeZoneNames!)) { @@ -409,6 +426,14 @@ public static bool TryIanaToRails(string ianaTimeZoneName, out IList rai return true; } + // If it's a valid IANA zone, then just return it since Rails will accept it as-is. + if (KnownIanaTimeZoneNames.Contains(ianaTimeZoneName)) + { + railsTimeZoneNames = [ianaTimeZoneName]; + return true; + } + + // not found railsTimeZoneNames = Array.Empty(); return false; } @@ -531,6 +556,13 @@ public static bool TryWindowsToRails(string windowsTimeZoneId, out IList public static bool TryWindowsToRails(string windowsTimeZoneId, string territoryCode, out IList railsTimeZoneNames) { + // edge case "Dateline Standard Time" -> "International Date Line West" + if (string.Equals(windowsTimeZoneId, "Dateline Standard Time", StringComparison.OrdinalIgnoreCase)) + { + railsTimeZoneNames = ["International Date Line West"]; + return true; + } + if (TryWindowsToIana(windowsTimeZoneId, territoryCode, out var ianaTimeZoneName) && TryIanaToRails(ianaTimeZoneName, out railsTimeZoneNames)) { diff --git a/src/TimeZoneConverter/TimeZoneConverter.csproj b/src/TimeZoneConverter/TimeZoneConverter.csproj index 40cebd9..a13369f 100644 --- a/src/TimeZoneConverter/TimeZoneConverter.csproj +++ b/src/TimeZoneConverter/TimeZoneConverter.csproj @@ -19,6 +19,7 @@ + diff --git a/test/TimeZoneConverter.Tests/DataVerificationTests.Iana_To_Rails.verified.txt b/test/TimeZoneConverter.Tests/DataVerificationTests.Iana_To_Rails.verified.txt index 6b9b620..d6baa29 100644 --- a/test/TimeZoneConverter.Tests/DataVerificationTests.Iana_To_Rails.verified.txt +++ b/test/TimeZoneConverter.Tests/DataVerificationTests.Iana_To_Rails.verified.txt @@ -1,6 +1,10 @@ { - Africa/Abidjan: null, - Africa/Accra: null, + Africa/Abidjan: [ + Africa/Abidjan + ], + Africa/Accra: [ + Africa/Accra + ], Africa/Addis_Ababa: [ Nairobi ], @@ -13,14 +17,24 @@ Africa/Asmera: [ Nairobi ], - Africa/Bamako: null, - Africa/Bangui: null, - Africa/Banjul: null, - Africa/Bissau: null, + Africa/Bamako: [ + Africa/Bamako + ], + Africa/Bangui: [ + Africa/Bangui + ], + Africa/Banjul: [ + Africa/Banjul + ], + Africa/Bissau: [ + Africa/Bissau + ], Africa/Blantyre: [ Pretoria ], - Africa/Brazzaville: null, + Africa/Brazzaville: [ + Africa/Brazzaville + ], Africa/Bujumbura: [ Pretoria ], @@ -33,19 +47,27 @@ Africa/Ceuta: [ Madrid ], - Africa/Conakry: null, - Africa/Dakar: null, + Africa/Conakry: [ + Africa/Conakry + ], + Africa/Dakar: [ + Africa/Dakar + ], Africa/Dar_es_Salaam: [ Nairobi ], Africa/Djibouti: [ Nairobi ], - Africa/Douala: null, + Africa/Douala: [ + Africa/Douala + ], Africa/El_Aaiun: [ Casablanca ], - Africa/Freetown: null, + Africa/Freetown: [ + Africa/Freetown + ], Africa/Gaborone: [ Pretoria ], @@ -55,26 +77,42 @@ Africa/Johannesburg: [ Pretoria ], - Africa/Juba: null, + Africa/Juba: [ + Africa/Juba + ], Africa/Kampala: [ Nairobi ], - Africa/Khartoum: null, + Africa/Khartoum: [ + Africa/Khartoum + ], Africa/Kigali: [ Harare ], - Africa/Kinshasa: null, - Africa/Lagos: null, - Africa/Libreville: null, - Africa/Lome: null, - Africa/Luanda: null, + Africa/Kinshasa: [ + Africa/Kinshasa + ], + Africa/Lagos: [ + Africa/Lagos + ], + Africa/Libreville: [ + Africa/Libreville + ], + Africa/Lome: [ + Africa/Lome + ], + Africa/Luanda: [ + Africa/Luanda + ], Africa/Lubumbashi: [ Harare ], Africa/Lusaka: [ Harare ], - Africa/Malabo: null, + Africa/Malabo: [ + Africa/Malabo + ], Africa/Maputo: [ Harare ], @@ -93,17 +131,39 @@ Africa/Nairobi: [ Nairobi ], - Africa/Ndjamena: null, - Africa/Niamey: null, - Africa/Nouakchott: null, - Africa/Ouagadougou: null, - Africa/Porto-Novo: null, - Africa/Sao_Tome: null, - Africa/Timbuktu: null, - Africa/Tripoli: null, - Africa/Tunis: null, - Africa/Windhoek: null, - America/Adak: null, + Africa/Ndjamena: [ + Africa/Ndjamena + ], + Africa/Niamey: [ + Africa/Niamey + ], + Africa/Nouakchott: [ + Africa/Nouakchott + ], + Africa/Ouagadougou: [ + Africa/Ouagadougou + ], + Africa/Porto-Novo: [ + Africa/Porto-Novo + ], + Africa/Sao_Tome: [ + Africa/Sao_Tome + ], + Africa/Timbuktu: [ + Africa/Timbuktu + ], + Africa/Tripoli: [ + Africa/Tripoli + ], + Africa/Tunis: [ + Africa/Tunis + ], + Africa/Windhoek: [ + Africa/Windhoek + ], + America/Adak: [ + America/Adak + ], America/Anchorage: [ Alaska ], @@ -113,7 +173,9 @@ America/Antigua: [ Puerto Rico ], - America/Araguaina: null, + America/Araguaina: [ + America/Araguaina + ], America/Argentina/Buenos_Aires: [ Buenos Aires ], @@ -162,8 +224,12 @@ America/Atikokan: [ Bogota ], - America/Atka: null, - America/Bahia: null, + America/Atka: [ + America/Atka + ], + America/Bahia: [ + America/Bahia + ], America/Bahia_Banderas: [ Guadalajara, Mexico City @@ -171,7 +237,9 @@ America/Barbados: [ La Paz ], - America/Belem: null, + America/Belem: [ + America/Belem + ], America/Belize: [ Central America ], @@ -193,15 +261,21 @@ America/Cambridge_Bay: [ Mountain Time (US & Canada) ], - America/Campo_Grande: null, - America/Cancun: null, + America/Campo_Grande: [ + America/Campo_Grande + ], + America/Cancun: [ + America/Cancun + ], America/Caracas: [ Caracas ], America/Catamarca: [ Buenos Aires ], - America/Cayenne: null, + America/Cayenne: [ + America/Cayenne + ], America/Cayman: [ Bogota ], @@ -223,17 +297,23 @@ America/Costa_Rica: [ Central America ], - America/Coyhaique: null, + America/Coyhaique: [ + America/Coyhaique + ], America/Creston: [ Arizona ], - America/Cuiaba: null, + America/Cuiaba: [ + America/Cuiaba + ], America/Curacao: [ Puerto Rico ], - America/Danmarkshavn: null, + America/Danmarkshavn: [ + America/Danmarkshavn + ], America/Dawson: [ - Arizona + America/Dawson ], America/Dawson_Creek: [ Arizona @@ -265,7 +345,9 @@ America/Fort_Wayne: [ Indiana (East) ], - America/Fortaleza: null, + America/Fortaleza: [ + America/Fortaleza + ], America/Glace_Bay: [ Atlantic Time (Canada) ], @@ -275,7 +357,9 @@ America/Goose_Bay: [ Atlantic Time (Canada) ], - America/Grand_Turk: null, + America/Grand_Turk: [ + America/Grand_Turk + ], America/Grenada: [ Puerto Rico ], @@ -294,7 +378,9 @@ America/Halifax: [ Atlantic Time (Canada) ], - America/Havana: null, + America/Havana: [ + America/Havana + ], America/Hermosillo: [ Arizona ], @@ -368,7 +454,9 @@ America/Lower_Princes: [ Puerto Rico ], - America/Maceio: null, + America/Maceio: [ + America/Maceio + ], America/Managua: [ Central America ], @@ -404,7 +492,9 @@ Guadalajara, Mexico City ], - America/Miquelon: null, + America/Miquelon: [ + America/Miquelon + ], America/Moncton: [ Atlantic Time (Canada) ], @@ -432,7 +522,9 @@ America/Nome: [ Alaska ], - America/Noronha: null, + America/Noronha: [ + America/Noronha + ], America/North_Dakota/Beulah: [ Central Time (US & Canada) ], @@ -454,11 +546,15 @@ America/Pangnirtung: [ Eastern Time (US & Canada) ], - America/Paramaribo: null, + America/Paramaribo: [ + America/Paramaribo + ], America/Phoenix: [ Arizona ], - America/Port-au-Prince: null, + America/Port-au-Prince: [ + America/Port-au-Prince + ], America/Port_of_Spain: [ Puerto Rico ], @@ -471,14 +567,18 @@ America/Puerto_Rico: [ Puerto Rico ], - America/Punta_Arenas: null, + America/Punta_Arenas: [ + America/Punta_Arenas + ], America/Rainy_River: [ Central Time (US & Canada) ], America/Rankin_Inlet: [ Central Time (US & Canada) ], - America/Recife: null, + America/Recife: [ + America/Recife + ], America/Regina: [ Saskatchewan ], @@ -494,7 +594,9 @@ America/Santa_Isabel: [ Tijuana ], - America/Santarem: null, + America/Santarem: [ + America/Santarem + ], America/Santiago: [ Santiago ], @@ -559,7 +661,7 @@ Puerto Rico ], America/Whitehorse: [ - Arizona + America/Whitehorse ], America/Winnipeg: [ Central Time (US & Canada) @@ -590,8 +692,12 @@ Auckland, Wellington ], - Antarctica/Palmer: null, - Antarctica/Rothera: null, + Antarctica/Palmer: [ + Antarctica/Palmer + ], + Antarctica/Rothera: [ + Antarctica/Rothera + ], Antarctica/South_Pole: [ Auckland, Wellington @@ -599,8 +705,12 @@ Antarctica/Syowa: [ Riyadh ], - Antarctica/Troll: null, - Antarctica/Vostok: null, + Antarctica/Troll: [ + Antarctica/Troll + ], + Antarctica/Vostok: [ + Antarctica/Vostok + ], Arctic/Longyearbyen: [ Berlin ], @@ -611,7 +721,9 @@ Almaty, Astana ], - Asia/Amman: null, + Asia/Amman: [ + Asia/Amman + ], Asia/Anadyr: [ Kamchatka ], @@ -646,9 +758,15 @@ Bangkok, Hanoi ], - Asia/Barnaul: null, - Asia/Beirut: null, - Asia/Bishkek: null, + Asia/Barnaul: [ + Asia/Barnaul + ], + Asia/Beirut: [ + Asia/Beirut + ], + Asia/Bishkek: [ + Asia/Bishkek + ], Asia/Brunei: [ Kuala Lumpur ], @@ -658,7 +776,9 @@ Mumbai, New Delhi ], - Asia/Chita: null, + Asia/Chita: [ + Asia/Chita + ], Asia/Choibalsan: [ Ulaanbaatar ], @@ -674,7 +794,9 @@ Asia/Dacca: [ Dhaka ], - Asia/Damascus: null, + Asia/Damascus: [ + Asia/Damascus + ], Asia/Dhaka: [ Dhaka ], @@ -693,11 +815,15 @@ Asia/Famagusta: [ Bucharest ], - Asia/Gaza: null, + Asia/Gaza: [ + Asia/Gaza + ], Asia/Harbin: [ Beijing ], - Asia/Hebron: null, + Asia/Hebron: [ + Asia/Hebron + ], Asia/Ho_Chi_Minh: [ Bangkok, Hanoi @@ -705,7 +831,9 @@ Asia/Hong_Kong: [ Hong Kong ], - Asia/Hovd: null, + Asia/Hovd: [ + Asia/Hovd + ], Asia/Irkutsk: [ Irkutsk ], @@ -791,7 +919,9 @@ Asia/Novosibirsk: [ Novosibirsk ], - Asia/Omsk: null, + Asia/Omsk: [ + Asia/Omsk + ], Asia/Oral: [ Almaty, Astana @@ -803,7 +933,9 @@ Asia/Pontianak: [ Jakarta ], - Asia/Pyongyang: null, + Asia/Pyongyang: [ + Asia/Pyongyang + ], Asia/Qatar: [ Riyadh ], @@ -811,7 +943,9 @@ Almaty, Astana ], - Asia/Qyzylorda: null, + Asia/Qyzylorda: [ + Asia/Qyzylorda + ], Asia/Rangoon: [ Rangoon ], @@ -822,7 +956,9 @@ Bangkok, Hanoi ], - Asia/Sakhalin: null, + Asia/Sakhalin: [ + Asia/Sakhalin + ], Asia/Samarkand: [ Tashkent ], @@ -864,7 +1000,9 @@ Sapporo, Tokyo ], - Asia/Tomsk: null, + Asia/Tomsk: [ + Asia/Tomsk + ], Asia/Ujung_Pandang: [ Singapore ], @@ -926,12 +1064,18 @@ Atlantic/Madeira: [ Lisbon ], - Atlantic/Reykjavik: null, + Atlantic/Reykjavik: [ + Atlantic/Reykjavik + ], Atlantic/South_Georgia: [ Mid-Atlantic ], - Atlantic/St_Helena: null, - Atlantic/Stanley: null, + Atlantic/St_Helena: [ + Atlantic/St_Helena + ], + Atlantic/Stanley: [ + Atlantic/Stanley + ], Australia/ACT: [ Sydney ], @@ -953,15 +1097,21 @@ Australia/Darwin: [ Darwin ], - Australia/Eucla: null, + Australia/Eucla: [ + Australia/Eucla + ], Australia/Hobart: [ Hobart ], - Australia/LHI: null, + Australia/LHI: [ + Australia/LHI + ], Australia/Lindeman: [ Brisbane ], - Australia/Lord_Howe: null, + Australia/Lord_Howe: [ + Australia/Lord_Howe + ], Australia/Melbourne: [ Melbourne ], @@ -998,7 +1148,9 @@ Brazil/Acre: [ Bogota ], - Brazil/DeNoronha: null, + Brazil/DeNoronha: [ + Brazil/DeNoronha + ], Brazil/East: [ Brasilia ], @@ -1033,13 +1185,17 @@ Saskatchewan ], Canada/Yukon: [ - Arizona + Canada/Yukon ], Chile/Continental: [ Santiago ], - Chile/EasterIsland: null, - Cuba: null, + Chile/EasterIsland: [ + Chile/EasterIsland + ], + Cuba: [ + Cuba + ], EET: [ Athens ], @@ -1065,14 +1221,20 @@ Cape Verde Is. ], Etc/GMT+10: [ - Hawaii + -10:00 + ], + Etc/GMT+11: [ + -11:00 ], - Etc/GMT+11: null, Etc/GMT+12: [ - International Date Line West + -12:00 + ], + Etc/GMT+2: [ + Etc/GMT+2 + ], + Etc/GMT+3: [ + Etc/GMT+3 ], - Etc/GMT+2: null, - Etc/GMT+3: null, Etc/GMT+4: [ La Paz ], @@ -1085,21 +1247,33 @@ Etc/GMT+7: [ Arizona ], - Etc/GMT+8: null, - Etc/GMT+9: null, + Etc/GMT+8: [ + Etc/GMT+8 + ], + Etc/GMT+9: [ + Etc/GMT+9 + ], Etc/GMT-0: [ UTC ], - Etc/GMT-1: null, + Etc/GMT-1: [ + Etc/GMT-1 + ], Etc/GMT-10: [ - Port Moresby + +10:00 ], Etc/GMT-11: [ - Solomon Is. + +11:00 + ], + Etc/GMT-12: [ + +12:00 + ], + Etc/GMT-13: [ + +13:00 + ], + Etc/GMT-14: [ + +14:00 ], - Etc/GMT-12: null, - Etc/GMT-13: null, - Etc/GMT-14: null, Etc/GMT-2: [ Pretoria ], @@ -1113,7 +1287,9 @@ Etc/GMT-5: [ Tashkent ], - Etc/GMT-6: null, + Etc/GMT-6: [ + Etc/GMT-6 + ], Etc/GMT-7: [ Bangkok, Hanoi @@ -1150,7 +1326,9 @@ Europe/Andorra: [ Berlin ], - Europe/Astrakhan: null, + Europe/Astrakhan: [ + Europe/Astrakhan + ], Europe/Athens: [ Athens ], @@ -1180,7 +1358,9 @@ Bern, Zurich ], - Europe/Chisinau: null, + Europe/Chisinau: [ + Europe/Chisinau + ], Europe/Copenhagen: [ Copenhagen ], @@ -1283,7 +1463,9 @@ Europe/Sarajevo: [ Sarajevo ], - Europe/Saratov: null, + Europe/Saratov: [ + Europe/Saratov + ], Europe/Simferopol: [ Moscow, St. Petersburg @@ -1303,8 +1485,12 @@ Europe/Tirane: [ Budapest ], - Europe/Tiraspol: null, - Europe/Ulyanovsk: null, + Europe/Tiraspol: [ + Europe/Tiraspol + ], + Europe/Ulyanovsk: [ + Europe/Ulyanovsk + ], Europe/Uzhgorod: [ Kyiv ], @@ -1366,11 +1552,15 @@ Hongkong: [ Hong Kong ], - Iceland: null, + Iceland: [ + Iceland + ], Indian/Antananarivo: [ Nairobi ], - Indian/Chagos: null, + Indian/Chagos: [ + Indian/Chagos + ], Indian/Christmas: [ Bangkok, Hanoi @@ -1391,7 +1581,9 @@ Indian/Maldives: [ Tashkent ], - Indian/Mauritius: null, + Indian/Mauritius: [ + Indian/Mauritius + ], Indian/Mayotte: [ Nairobi ], @@ -1416,7 +1608,9 @@ Kwajalein: [ Marshall Is. ], - Libya: null, + Libya: [ + Libya + ], MET: [ Brussels ], @@ -1459,29 +1653,39 @@ Auckland, Wellington ], - Pacific/Bougainville: null, + Pacific/Bougainville: [ + Pacific/Bougainville + ], Pacific/Chatham: [ Chatham Is. ], Pacific/Chuuk: [ Port Moresby ], - Pacific/Easter: null, + Pacific/Easter: [ + Pacific/Easter + ], Pacific/Efate: [ Solomon Is. ], - Pacific/Enderbury: null, + Pacific/Enderbury: [ + Pacific/Enderbury + ], Pacific/Fakaofo: [ Tokelau Is. ], Pacific/Fiji: [ Fiji ], - Pacific/Funafuti: null, + Pacific/Funafuti: [ + Pacific/Funafuti + ], Pacific/Galapagos: [ Central America ], - Pacific/Gambier: null, + Pacific/Gambier: [ + Pacific/Gambier + ], Pacific/Guadalcanal: [ Solomon Is. ], @@ -1494,8 +1698,12 @@ Pacific/Johnston: [ Hawaii ], - Pacific/Kanton: null, - Pacific/Kiritimati: null, + Pacific/Kanton: [ + Pacific/Kanton + ], + Pacific/Kiritimati: [ + Pacific/Kiritimati + ], Pacific/Kosrae: [ Solomon Is. ], @@ -1505,13 +1713,21 @@ Pacific/Majuro: [ Marshall Is. ], - Pacific/Marquesas: null, + Pacific/Marquesas: [ + Pacific/Marquesas + ], Pacific/Midway: [ Midway Island ], - Pacific/Nauru: null, - Pacific/Niue: null, - Pacific/Norfolk: null, + Pacific/Nauru: [ + Pacific/Nauru + ], + Pacific/Niue: [ + Pacific/Niue + ], + Pacific/Norfolk: [ + Pacific/Norfolk + ], Pacific/Noumea: [ New Caledonia ], @@ -1523,7 +1739,9 @@ Sapporo, Tokyo ], - Pacific/Pitcairn: null, + Pacific/Pitcairn: [ + Pacific/Pitcairn + ], Pacific/Pohnpei: [ Solomon Is. ], @@ -1587,7 +1805,9 @@ US/Alaska: [ Alaska ], - US/Aleutian: null, + US/Aleutian: [ + US/Aleutian + ], US/Arizona: [ Arizona ], diff --git a/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails.verified.txt b/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails.verified.txt index d0d95fc..4972e63 100644 --- a/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails.verified.txt +++ b/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails.verified.txt @@ -11,8 +11,12 @@ Alaskan Standard Time: [ Alaska ], - Aleutian Standard Time: null, - Altai Standard Time: null, + Aleutian Standard Time: [ + America/Adak + ], + Altai Standard Time: [ + Asia/Barnaul + ], Arab Standard Time: [ Riyadh ], @@ -26,25 +30,33 @@ Argentina Standard Time: [ Buenos Aires ], - Astrakhan Standard Time: null, + Astrakhan Standard Time: [ + Europe/Astrakhan + ], Atlantic Standard Time: [ Atlantic Time (Canada) ], - Aus Central W. Standard Time: null, + Aus Central W. Standard Time: [ + Australia/Eucla + ], Azerbaijan Standard Time: [ Baku ], Azores Standard Time: [ Azores ], - Bahia Standard Time: null, + Bahia Standard Time: [ + America/Bahia + ], Bangladesh Standard Time: [ Dhaka ], Belarus Standard Time: [ Minsk ], - Bougainville Standard Time: null, + Bougainville Standard Time: [ + Pacific/Bougainville + ], Canada Central Standard Time: [ Saskatchewan ], @@ -60,8 +72,12 @@ Central America Standard Time: [ Central America ], - Central Asia Standard Time: null, - Central Brazilian Standard Time: null, + Central Asia Standard Time: [ + Asia/Bishkek + ], + Central Brazilian Standard Time: [ + America/Cuiaba + ], Central Europe Standard Time: [ Budapest ], @@ -84,7 +100,9 @@ China Standard Time: [ Beijing ], - Cuba Standard Time: null, + Cuba Standard Time: [ + America/Havana + ], Dateline Standard Time: [ International Date Line West ], @@ -94,15 +112,21 @@ E. Australia Standard Time: [ Brisbane ], - E. Europe Standard Time: null, + E. Europe Standard Time: [ + Europe/Chisinau + ], E. South America Standard Time: [ Brasilia ], - Easter Island Standard Time: null, + Easter Island Standard Time: [ + Pacific/Easter + ], Eastern Standard Time: [ Eastern Time (US & Canada) ], - Eastern Standard Time (Mexico): null, + Eastern Standard Time (Mexico): [ + America/Cancun + ], Egypt Standard Time: [ Cairo ], @@ -128,8 +152,12 @@ Greenland Standard Time: [ Greenland ], - Greenwich Standard Time: null, - Haiti Standard Time: null, + Greenwich Standard Time: [ + Africa/Abidjan + ], + Haiti Standard Time: [ + America/Port-au-Prince + ], Hawaiian Standard Time: [ Hawaii ], @@ -145,23 +173,39 @@ Israel Standard Time: [ Jerusalem ], - Jordan Standard Time: null, + Jordan Standard Time: [ + Asia/Amman + ], Kaliningrad Standard Time: [ Kaliningrad ], Korea Standard Time: [ Seoul ], - Libya Standard Time: null, - Line Islands Standard Time: null, - Lord Howe Standard Time: null, + Libya Standard Time: [ + Africa/Tripoli + ], + Line Islands Standard Time: [ + Pacific/Kiritimati + ], + Lord Howe Standard Time: [ + Australia/Lord_Howe + ], Magadan Standard Time: [ Magadan ], - Magallanes Standard Time: null, - Marquesas Standard Time: null, - Mauritius Standard Time: null, - Middle East Standard Time: null, + Magallanes Standard Time: [ + America/Punta_Arenas + ], + Marquesas Standard Time: [ + Pacific/Marquesas + ], + Mauritius Standard Time: [ + Indian/Mauritius + ], + Middle East Standard Time: [ + Asia/Beirut + ], Montevideo Standard Time: [ Montevideo ], @@ -180,7 +224,9 @@ N. Central Asia Standard Time: [ Novosibirsk ], - Namibia Standard Time: null, + Namibia Standard Time: [ + Africa/Windhoek + ], Nepal Standard Time: [ Kathmandu ], @@ -191,15 +237,21 @@ Newfoundland Standard Time: [ Newfoundland ], - Norfolk Standard Time: null, + Norfolk Standard Time: [ + Pacific/Norfolk + ], North Asia East Standard Time: [ Irkutsk ], North Asia Standard Time: [ Krasnoyarsk ], - North Korea Standard Time: null, - Omsk Standard Time: null, + North Korea Standard Time: [ + Asia/Pyongyang + ], + Omsk Standard Time: [ + Asia/Omsk + ], Pacific SA Standard Time: [ Santiago ], @@ -216,7 +268,9 @@ Paraguay Standard Time: [ Asuncion ], - Qyzylorda Standard Time: null, + Qyzylorda Standard Time: [ + Asia/Qyzylorda + ], Romance Standard Time: [ Paris ], @@ -233,7 +287,9 @@ Moscow, St. Petersburg ], - SA Eastern Standard Time: null, + SA Eastern Standard Time: [ + America/Cayenne + ], SA Pacific Standard Time: [ Bogota ], @@ -244,46 +300,68 @@ Bangkok, Hanoi ], - Saint Pierre Standard Time: null, - Sakhalin Standard Time: null, + Saint Pierre Standard Time: [ + America/Miquelon + ], + Sakhalin Standard Time: [ + Asia/Sakhalin + ], Samoa Standard Time: [ Samoa ], - Sao Tome Standard Time: null, - Saratov Standard Time: null, + Sao Tome Standard Time: [ + Africa/Sao_Tome + ], + Saratov Standard Time: [ + Europe/Saratov + ], Singapore Standard Time: [ Singapore ], South Africa Standard Time: [ Pretoria ], - South Sudan Standard Time: null, + South Sudan Standard Time: [ + Africa/Juba + ], Sri Lanka Standard Time: [ Sri Jayawardenepura ], - Sudan Standard Time: null, - Syria Standard Time: null, + Sudan Standard Time: [ + Africa/Khartoum + ], + Syria Standard Time: [ + Asia/Damascus + ], Taipei Standard Time: [ Taipei ], Tasmania Standard Time: [ Hobart ], - Tocantins Standard Time: null, + Tocantins Standard Time: [ + America/Araguaina + ], Tokyo Standard Time: [ Osaka, Sapporo, Tokyo ], - Tomsk Standard Time: null, + Tomsk Standard Time: [ + Asia/Tomsk + ], Tonga Standard Time: [ Nuku'alofa ], - Transbaikal Standard Time: null, + Transbaikal Standard Time: [ + Asia/Chita + ], Turkey Standard Time: [ Istanbul ], - Turks And Caicos Standard Time: null, + Turks And Caicos Standard Time: [ + America/Grand_Turk + ], US Eastern Standard Time: [ Indiana (East) ], @@ -293,12 +371,24 @@ UTC: [ UTC ], - UTC+12: null, - UTC+13: null, - UTC-02: null, - UTC-08: null, - UTC-09: null, - UTC-11: null, + UTC+12: [ + +12:00 + ], + UTC+13: [ + +13:00 + ], + UTC-02: [ + Etc/GMT+2 + ], + UTC-08: [ + Etc/GMT+8 + ], + UTC-09: [ + Etc/GMT+9 + ], + UTC-11: [ + -11:00 + ], Ulaanbaatar Standard Time: [ Ulaanbaatar ], @@ -314,15 +404,21 @@ W. Australia Standard Time: [ Perth ], - W. Central Africa Standard Time: null, + W. Central Africa Standard Time: [ + Africa/Lagos + ], W. Europe Standard Time: [ Berlin ], - W. Mongolia Standard Time: null, + W. Mongolia Standard Time: [ + Asia/Hovd + ], West Asia Standard Time: [ Tashkent ], - West Bank Standard Time: null, + West Bank Standard Time: [ + Asia/Hebron + ], West Pacific Standard Time: [ Port Moresby ], @@ -330,6 +426,6 @@ Yakutsk ], Yukon Standard Time: [ - Arizona + America/Whitehorse ] } \ No newline at end of file diff --git a/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails_Regional.verified.txt b/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails_Regional.verified.txt index ff40352..309c4a2 100644 --- a/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails_Regional.verified.txt +++ b/test/TimeZoneConverter.Tests/DataVerificationTests.Windows_To_Rails_Regional.verified.txt @@ -11,8 +11,12 @@ (Alaskan Standard Time, 001): [ Alaska ], - (Aleutian Standard Time, 001): null, - (Altai Standard Time, 001): null, + (Aleutian Standard Time, 001): [ + America/Adak + ], + (Altai Standard Time, 001): [ + Asia/Barnaul + ], (Arab Standard Time, 001): [ Riyadh ], @@ -29,25 +33,33 @@ (Argentina Standard Time, 001): [ Buenos Aires ], - (Astrakhan Standard Time, 001): null, + (Astrakhan Standard Time, 001): [ + Europe/Astrakhan + ], (Atlantic Standard Time, 001): [ Atlantic Time (Canada) ], - (Aus Central W. Standard Time, 001): null, + (Aus Central W. Standard Time, 001): [ + Australia/Eucla + ], (Azerbaijan Standard Time, 001): [ Baku ], (Azores Standard Time, 001): [ Azores ], - (Bahia Standard Time, 001): null, + (Bahia Standard Time, 001): [ + America/Bahia + ], (Bangladesh Standard Time, 001): [ Dhaka ], (Belarus Standard Time, 001): [ Minsk ], - (Bougainville Standard Time, 001): null, + (Bougainville Standard Time, 001): [ + Pacific/Bougainville + ], (Canada Central Standard Time, 001): [ Saskatchewan ], @@ -63,8 +75,21 @@ (Central America Standard Time, 001): [ Central America ], - (Central Asia Standard Time, 001): null, - (Central Brazilian Standard Time, 001): null, + (Central Asia Standard Time, 001): [ + Asia/Bishkek + ], + (Central Asia Standard Time, CN): [ + Urumqi + ], + (Central Asia Standard Time, DG): [ + Indian/Chagos + ], + (Central Asia Standard Time, IO): [ + Indian/Chagos + ], + (Central Brazilian Standard Time, 001): [ + America/Cuiaba + ], (Central Europe Standard Time, 001): [ Budapest ], @@ -120,7 +145,9 @@ (China Standard Time, HK): [ Hong Kong ], - (Cuba Standard Time, 001): null, + (Cuba Standard Time, 001): [ + America/Havana + ], (Dateline Standard Time, 001): [ International Date Line West ], @@ -130,12 +157,18 @@ (E. Australia Standard Time, 001): [ Brisbane ], - (E. Europe Standard Time, 001): null, + (E. Europe Standard Time, 001): [ + Europe/Chisinau + ], (E. South America Standard Time, 001): [ Brasilia ], - (Easter Island Standard Time, 001): null, - (Eastern Standard Time (Mexico), 001): null, + (Easter Island Standard Time, 001): [ + Pacific/Easter + ], + (Eastern Standard Time (Mexico), 001): [ + America/Cancun + ], (Eastern Standard Time, 001): [ Eastern Time (US & Canada) ], @@ -191,8 +224,51 @@ (Greenland Standard Time, 001): [ Greenland ], - (Greenwich Standard Time, 001): null, - (Haiti Standard Time, 001): null, + (Greenwich Standard Time, 001): [ + Africa/Abidjan + ], + (Greenwich Standard Time, BF): [ + Africa/Ouagadougou + ], + (Greenwich Standard Time, GH): [ + Africa/Accra + ], + (Greenwich Standard Time, GL): [ + America/Danmarkshavn + ], + (Greenwich Standard Time, GM): [ + Africa/Banjul + ], + (Greenwich Standard Time, GN): [ + Africa/Conakry + ], + (Greenwich Standard Time, GW): [ + Africa/Bissau + ], + (Greenwich Standard Time, LR): [ + Monrovia + ], + (Greenwich Standard Time, ML): [ + Africa/Bamako + ], + (Greenwich Standard Time, MR): [ + Africa/Nouakchott + ], + (Greenwich Standard Time, SH): [ + Atlantic/St_Helena + ], + (Greenwich Standard Time, SL): [ + Africa/Freetown + ], + (Greenwich Standard Time, SN): [ + Africa/Dakar + ], + (Greenwich Standard Time, TG): [ + Africa/Lome + ], + (Haiti Standard Time, 001): [ + America/Port-au-Prince + ], (Hawaiian Standard Time, 001): [ Hawaii ], @@ -208,23 +284,47 @@ (Israel Standard Time, 001): [ Jerusalem ], - (Jordan Standard Time, 001): null, + (Jordan Standard Time, 001): [ + Asia/Amman + ], (Kaliningrad Standard Time, 001): [ Kaliningrad ], (Korea Standard Time, 001): [ Seoul ], - (Libya Standard Time, 001): null, - (Line Islands Standard Time, 001): null, - (Lord Howe Standard Time, 001): null, + (Libya Standard Time, 001): [ + Africa/Tripoli + ], + (Line Islands Standard Time, 001): [ + Pacific/Kiritimati + ], + (Lord Howe Standard Time, 001): [ + Australia/Lord_Howe + ], (Magadan Standard Time, 001): [ Magadan ], - (Magallanes Standard Time, 001): null, - (Marquesas Standard Time, 001): null, - (Mauritius Standard Time, 001): null, - (Middle East Standard Time, 001): null, + (Magallanes Standard Time, 001): [ + America/Punta_Arenas + ], + (Marquesas Standard Time, 001): [ + Pacific/Marquesas + ], + (Mauritius Standard Time, 001): [ + Indian/Mauritius + ], + (Mauritius Standard Time, RE): [ + Abu Dhabi, + Muscat + ], + (Mauritius Standard Time, SC): [ + Abu Dhabi, + Muscat + ], + (Middle East Standard Time, 001): [ + Asia/Beirut + ], (Montevideo Standard Time, 001): [ Montevideo ], @@ -243,7 +343,9 @@ (N. Central Asia Standard Time, 001): [ Novosibirsk ], - (Namibia Standard Time, 001): null, + (Namibia Standard Time, 001): [ + Africa/Windhoek + ], (Nepal Standard Time, 001): [ Kathmandu ], @@ -254,15 +356,21 @@ (Newfoundland Standard Time, 001): [ Newfoundland ], - (Norfolk Standard Time, 001): null, + (Norfolk Standard Time, 001): [ + Pacific/Norfolk + ], (North Asia East Standard Time, 001): [ Irkutsk ], (North Asia Standard Time, 001): [ Krasnoyarsk ], - (North Korea Standard Time, 001): null, - (Omsk Standard Time, 001): null, + (North Korea Standard Time, 001): [ + Asia/Pyongyang + ], + (Omsk Standard Time, 001): [ + Asia/Omsk + ], (Pacific SA Standard Time, 001): [ Santiago ], @@ -279,7 +387,9 @@ (Paraguay Standard Time, 001): [ Asuncion ], - (Qyzylorda Standard Time, 001): null, + (Qyzylorda Standard Time, 001): [ + Asia/Qyzylorda + ], (Romance Standard Time, 001): [ Paris ], @@ -308,7 +418,18 @@ Moscow, St. Petersburg ], - (SA Eastern Standard Time, 001): null, + (SA Eastern Standard Time, 001): [ + America/Cayenne + ], + (SA Eastern Standard Time, BR): [ + America/Fortaleza + ], + (SA Eastern Standard Time, FK): [ + Atlantic/Stanley + ], + (SA Eastern Standard Time, SR): [ + America/Paramaribo + ], (SA Pacific Standard Time, 001): [ Bogota ], @@ -389,13 +510,21 @@ (SE Asia Standard Time, ID): [ Jakarta ], - (Saint Pierre Standard Time, 001): null, - (Sakhalin Standard Time, 001): null, + (Saint Pierre Standard Time, 001): [ + America/Miquelon + ], + (Sakhalin Standard Time, 001): [ + Asia/Sakhalin + ], (Samoa Standard Time, 001): [ Samoa ], - (Sao Tome Standard Time, 001): null, - (Saratov Standard Time, 001): null, + (Sao Tome Standard Time, 001): [ + Africa/Sao_Tome + ], + (Saratov Standard Time, 001): [ + Europe/Saratov + ], (Singapore Standard Time, 001): [ Singapore ], @@ -423,48 +552,116 @@ (South Africa Standard Time, ZW): [ Harare ], - (South Sudan Standard Time, 001): null, + (South Sudan Standard Time, 001): [ + Africa/Juba + ], (Sri Lanka Standard Time, 001): [ Sri Jayawardenepura ], - (Sudan Standard Time, 001): null, - (Syria Standard Time, 001): null, + (Sudan Standard Time, 001): [ + Africa/Khartoum + ], + (Syria Standard Time, 001): [ + Asia/Damascus + ], (Taipei Standard Time, 001): [ Taipei ], (Tasmania Standard Time, 001): [ Hobart ], - (Tocantins Standard Time, 001): null, + (Tocantins Standard Time, 001): [ + America/Araguaina + ], (Tokyo Standard Time, 001): [ Osaka, Sapporo, Tokyo ], - (Tomsk Standard Time, 001): null, + (Tomsk Standard Time, 001): [ + Asia/Tomsk + ], (Tonga Standard Time, 001): [ Nuku'alofa ], - (Transbaikal Standard Time, 001): null, + (Transbaikal Standard Time, 001): [ + Asia/Chita + ], (Turkey Standard Time, 001): [ Istanbul ], - (Turks And Caicos Standard Time, 001): null, + (Turks And Caicos Standard Time, 001): [ + America/Grand_Turk + ], (US Eastern Standard Time, 001): [ Indiana (East) ], (US Mountain Standard Time, 001): [ Arizona ], - (UTC+12, 001): null, - (UTC+13, 001): null, + (UTC+12, 001): [ + +12:00 + ], + (UTC+12, KI): [ + Marshall Is. + ], + (UTC+12, MH): [ + Marshall Is. + ], + (UTC+12, NR): [ + Pacific/Nauru + ], + (UTC+12, TV): [ + Pacific/Funafuti + ], + (UTC+12, UM): [ + Marshall Is. + ], + (UTC+12, WF): [ + Marshall Is. + ], + (UTC+13, 001): [ + +13:00 + ], + (UTC+13, KI): [ + Pacific/Kanton + ], + (UTC+13, TK): [ + Tokelau Is. + ], (UTC, 001): [ UTC ], - (UTC-02, 001): null, - (UTC-08, 001): null, - (UTC-09, 001): null, - (UTC-11, 001): null, + (UTC-02, 001): [ + Etc/GMT+2 + ], + (UTC-02, BR): [ + America/Noronha + ], + (UTC-08, 001): [ + Etc/GMT+8 + ], + (UTC-08, PN): [ + Pacific/Pitcairn + ], + (UTC-09, 001): [ + Etc/GMT+9 + ], + (UTC-09, PF): [ + Pacific/Gambier + ], + (UTC-11, 001): [ + -11:00 + ], + (UTC-11, AS): [ + American Samoa + ], + (UTC-11, NU): [ + Pacific/Niue + ], + (UTC-11, UM): [ + Midway Island + ], (Ulaanbaatar Standard Time, 001): [ Ulaanbaatar ], @@ -480,7 +677,45 @@ (W. Australia Standard Time, 001): [ Perth ], - (W. Central Africa Standard Time, 001): null, + (W. Central Africa Standard Time, 001): [ + Africa/Lagos + ], + (W. Central Africa Standard Time, AO): [ + Africa/Luanda + ], + (W. Central Africa Standard Time, BJ): [ + Africa/Porto-Novo + ], + (W. Central Africa Standard Time, CD): [ + Africa/Kinshasa + ], + (W. Central Africa Standard Time, CF): [ + Africa/Bangui + ], + (W. Central Africa Standard Time, CG): [ + Africa/Brazzaville + ], + (W. Central Africa Standard Time, CM): [ + Africa/Douala + ], + (W. Central Africa Standard Time, DZ): [ + West Central Africa + ], + (W. Central Africa Standard Time, GA): [ + Africa/Libreville + ], + (W. Central Africa Standard Time, GQ): [ + Africa/Malabo + ], + (W. Central Africa Standard Time, NE): [ + Africa/Niamey + ], + (W. Central Africa Standard Time, TD): [ + Africa/Ndjamena + ], + (W. Central Africa Standard Time, TN): [ + Africa/Tunis + ], (W. Europe Standard Time, 001): [ Berlin ], @@ -516,7 +751,9 @@ (W. Europe Standard Time, VA): [ Rome ], - (W. Mongolia Standard Time, 001): null, + (W. Mongolia Standard Time, 001): [ + Asia/Hovd + ], (West Asia Standard Time, 001): [ Tashkent ], @@ -524,7 +761,9 @@ Almaty, Astana ], - (West Bank Standard Time, 001): null, + (West Bank Standard Time, 001): [ + Asia/Hebron + ], (West Pacific Standard Time, 001): [ Port Moresby ], @@ -538,6 +777,6 @@ Yakutsk ], (Yukon Standard Time, 001): [ - Arizona + America/Whitehorse ] } \ No newline at end of file diff --git a/test/TimeZoneConverter.Tests/IanaToRailsTests.cs b/test/TimeZoneConverter.Tests/IanaToRailsTests.cs index be10631..f210510 100644 --- a/test/TimeZoneConverter.Tests/IanaToRailsTests.cs +++ b/test/TimeZoneConverter.Tests/IanaToRailsTests.cs @@ -53,6 +53,7 @@ public IanaToRailsTests(ITestOutputHelper output) "America/Coyhaique", "America/Cuiaba", "America/Danmarkshavn", + "America/Dawson", "America/Fortaleza", "America/Grand_Turk", "America/Havana", @@ -64,6 +65,7 @@ public IanaToRailsTests(ITestOutputHelper output) "America/Punta_Arenas", "America/Recife", "America/Santarem", + "America/Whitehorse", "Antarctica/Palmer", "Antarctica/Rothera", "Antarctica/Troll", @@ -89,6 +91,7 @@ public IanaToRailsTests(ITestOutputHelper output) "Australia/LHI", "Australia/Lord_Howe", "Brazil/DeNoronha", + "Canada/Yukon", "Chile/EasterIsland", "Cuba", "Etc/GMT-1",