From 5ffb67d864281a0bbbb47f3cbea48a7b2bc68f33 Mon Sep 17 00:00:00 2001 From: mysqto Date: Fri, 30 May 2025 11:48:06 +0800 Subject: [PATCH] Add `site` timezone --- iso/site/currency.go | 304 ++++++++++++++ iso/site/{sites_test.go => currency_test.go} | 37 +- iso/site/go.mod | 7 + iso/site/go.sum | 16 + iso/site/sites.go | 301 -------------- iso/site/timezone.go | 305 ++++++++++++++ iso/site/timezone_test.go | 395 +++++++++++++++++++ 7 files changed, 1047 insertions(+), 318 deletions(-) create mode 100644 iso/site/currency.go rename iso/site/{sites_test.go => currency_test.go} (80%) create mode 100644 iso/site/go.sum create mode 100644 iso/site/timezone.go create mode 100644 iso/site/timezone_test.go diff --git a/iso/site/currency.go b/iso/site/currency.go new file mode 100644 index 0000000..f99d712 --- /dev/null +++ b/iso/site/currency.go @@ -0,0 +1,304 @@ +package site + +import "github.com/wego/pkg/currency" + +// currencySite maps ISO 3166-1 alpha-2 site codes to ISO 4217 currency codes +var currencySite = map[string]string{ + // A + AE: currency.AED, // United Arab Emirates Dirham + AF: currency.AFN, // Afghan Afghani + AL: currency.ALL, // Albanian Lek + AM: currency.AMD, // Armenian Dram + AO: currency.AOA, // Angolan Kwanza + AR: currency.ARS, // Argentine Peso + AU: currency.AUD, // Australian Dollar + AW: currency.AWG, // Aruban Florin + AZ: currency.AZN, // Azerbaijani Manat + + // B + BA: currency.BAM, // Bosnia and Herzegovina Convertible Mark + BB: currency.BBD, // Barbadian Dollar + BD: currency.BDT, // Bangladeshi Taka + BE: currency.EUR, // Belgian Euro + BF: currency.XOF, // West African CFA Franc + BG: currency.BGN, // Bulgarian Lev + BH: currency.BHD, // Bahraini Dinar + BI: currency.BIF, // Burundian Franc + BJ: currency.XOF, // West African CFA Franc + BM: currency.BMD, // Bermudian Dollar + BN: currency.BND, // Brunei Dollar + BO: currency.BOB, // Bolivian Boliviano + BQ: currency.USD, // US Dollar (Bonaire, Sint Eustatius and Saba) + BR: currency.BRL, // Brazilian Real + BS: currency.BSD, // Bahamian Dollar + BT: currency.BTN, // Bhutanese Ngultrum + BV: currency.NOK, // Norwegian Krone + BW: currency.BWP, // Botswana Pula + BY: currency.BYN, // Belarusian Ruble + BZ: currency.BZD, // Belize Dollar + + // C + CA: currency.CAD, // Canadian Dollar + CC: currency.AUD, // Australian Dollar + CD: currency.CDF, // Congolese Franc + CF: currency.XAF, // Central African CFA Franc + CG: currency.XAF, // Central African CFA Franc + CH: currency.CHF, // Swiss Franc + CI: currency.XOF, // West African CFA Franc + CK: currency.NZD, // New Zealand Dollar + CL: currency.CLP, // Chilean Peso + CM: currency.XAF, // Central African CFA Franc + CN: currency.CNY, // Chinese Yuan + CO: currency.COP, // Colombian Peso + CR: currency.CRC, // Costa Rican Colón + CU: currency.CUP, // Cuban Peso + CV: currency.CVE, // Cape Verdean Escudo + CW: currency.ANG, // Netherlands Antillean Guilder + CX: currency.AUD, // Australian Dollar + CY: currency.EUR, // Cypriot Euro + CZ: currency.CZK, // Czech Republic Koruna + + // D + DE: currency.EUR, // German Euro + DJ: currency.DJF, // Djiboutian Franc + DK: currency.DKK, // Danish Krone + DM: currency.XCD, // East Caribbean Dollar + DO: currency.DOP, // Dominican Peso + DZ: currency.DZD, // Algerian Dinar + + // E + EC: currency.USD, // US Dollar + EE: currency.EUR, // Estonian Euro + EG: currency.EGP, // Egyptian Pound + EH: currency.MAD, // Moroccan Dirham + ER: currency.ERN, // Eritrean Nakfa + ES: currency.EUR, // Spanish Euro + ET: currency.ETB, // Ethiopian Birr + + // F + FI: currency.EUR, // Finnish Euro + FJ: currency.FJD, // Fijian Dollar + FK: currency.FKP, // Falkland Islands Pound + FM: currency.USD, // US Dollar + FO: currency.DKK, // Danish Krone + FR: currency.EUR, // French Euro + + // G + GA: currency.XAF, // Central African CFA Franc + GB: currency.GBP, // British Pound Sterling + GD: currency.XCD, // East Caribbean Dollar + GE: currency.GEL, // Georgian Lari + GF: currency.EUR, // Euro + GG: currency.GBP, // British Pound Sterling + GH: currency.GHS, // Ghanaian Cedi + GI: currency.GIP, // Gibraltar Pound + GL: currency.DKK, // Danish Krone + GM: currency.GMD, // Gambian Dalasi + GN: currency.GNF, // Guinean Franc + GP: currency.EUR, // Euro + GQ: currency.XAF, // Central African CFA Franc + GR: currency.EUR, // Greek Euro + GS: currency.GBP, // British Pound Sterling + GT: currency.GTQ, // Guatemalan Quetzal + GU: currency.USD, // US Dollar + GW: currency.XOF, // West African CFA Franc + GY: currency.GYD, // Guyanese Dollar + + // H + HK: currency.HKD, // Hong Kong Dollar + HM: currency.AUD, // Australian Dollar + HN: currency.HNL, // Honduran Lempira + HR: currency.EUR, // Croatian Euro + HT: currency.HTG, // Haitian Gourde + HU: currency.HUF, // Hungarian Forint + + // I + ID: currency.IDR, // Indonesian Rupiah + IE: currency.EUR, // Irish Euro + IL: currency.ILS, // Israeli New Shekel + IM: currency.GBP, // British Pound Sterling + IN: currency.INR, // Indian Rupee + IO: currency.USD, // US Dollar + IQ: currency.IQD, // Iraqi Dinar + IR: currency.IRR, // Iranian Rial + IS: currency.ISK, // Icelandic Krona + IT: currency.EUR, // Italian Euro + + // J + JE: currency.GBP, // British Pound Sterling + JM: currency.JMD, // Jamaican Dollar + JO: currency.JOD, // Jordanian Dinar + JP: currency.JPY, // Japanese Yen + + // K + KE: currency.KES, // Kenyan Shilling + KG: currency.KGS, // Kyrgyzstani Som + KH: currency.KHR, // Cambodian Riel + KI: currency.AUD, // Australian Dollar + KM: currency.KMF, // Comoran Franc + KN: currency.XCD, // East Caribbean Dollar + KP: currency.KPW, // North Korean Won + KR: currency.KRW, // South Korean Won + KW: currency.KWD, // Kuwaiti Dinar + KY: currency.KYD, // Cayman Islands Dollar + KZ: currency.KZT, // Kazakhstani Tenge + + // L + LA: currency.LAK, // Lao Kip + LB: currency.LBP, // Lebanese Pound + LC: currency.XCD, // East Caribbean Dollar + LI: currency.CHF, // Swiss Franc + LK: currency.LKR, // Sri Lankan Rupee + LR: currency.LRD, // Liberian Dollar + LS: currency.LSL, // Lesotho Loti + LT: currency.EUR, // Lithuanian Euro + LU: currency.EUR, // Luxembourg Euro + LV: currency.EUR, // Latvian Euro + LY: currency.LYD, // Libyan Dinar + + // M + MA: currency.MAD, // Moroccan Dirham + MC: currency.EUR, // Euro + MD: currency.MDL, // Moldovan Leu + ME: currency.EUR, // Montenegrin Euro + MF: currency.EUR, // Euro + MG: currency.MGA, // Malagasy Ariary + MH: currency.USD, // US Dollar + MK: currency.MKD, // Macedonian Denar + ML: currency.XOF, // West African CFA Franc + MM: currency.MMK, // Myanmar Kyat + MN: currency.MNT, // Mongolian Tögrög + MO: currency.MOP, // Macanese Pataca + MP: currency.USD, // US Dollar + MQ: currency.EUR, // Euro + MR: currency.MRU, // Mauritanian Ouguiya + MS: currency.XCD, // East Caribbean Dollar + MT: currency.EUR, // Maltese Euro + MU: currency.MUR, // Mauritian Rupee + MV: currency.MVR, // Maldivian Rufiyaa + MW: currency.MWK, // Malawian Kwacha + MX: currency.MXN, // Mexican Peso + MY: currency.MYR, // Malaysian Ringgit + MZ: currency.MZN, // Mozambican Metical + + // N + NA: currency.NAD, // Namibian Dollar + NC: currency.XPF, // CFP Franc + NE: currency.XOF, // West African CFA Franc + NF: currency.AUD, // Australian Dollar + NG: currency.NGN, // Nigerian Naira + NI: currency.NIO, // Nicaraguan Córdoba + NL: currency.EUR, // Dutch Euro + NO: currency.NOK, // Norwegian Krone + NP: currency.NPR, // Nepalese Rupee + NR: currency.AUD, // Australian Dollar + NU: currency.NZD, // New Zealand Dollar + NZ: currency.NZD, // New Zealand Dollar + + // O + OM: currency.OMR, // Omani Rial + + // P + PA: currency.PAB, // Panamanian Balboa + PE: currency.PEN, // Peruvian Sol + PF: currency.XPF, // CFP Franc + PG: currency.PGK, // Papua New Guinean Kina + PH: currency.PHP, // Philippine Peso + PK: currency.PKR, // Pakistani Rupee + PL: currency.PLN, // Polish Zloty + PM: currency.EUR, // Euro + PN: currency.NZD, // New Zealand Dollar + PR: currency.USD, // US Dollar + PS: currency.ILS, // Israeli New Shekel + PT: currency.EUR, // Portuguese Euro + PW: currency.USD, // US Dollar + PY: currency.PYG, // Paraguayan Guarani + + // Q + QA: currency.QAR, // Qatari Riyal + + // R + RE: currency.EUR, // Euro + RO: currency.RON, // Romanian Leu + RS: currency.RSD, // Serbian Dinar + RU: currency.RUB, // Russian Ruble + RW: currency.RWF, // Rwandan Franc + + // S + SA: currency.SAR, // Saudi Riyal + SB: currency.SBD, // Solomon Islands Dollar + SC: currency.SCR, // Seychellois Rupee + SD: currency.SDG, // Sudanese Pound + SE: currency.SEK, // Swedish Krona + SG: currency.SGD, // Singapore Dollar + SH: currency.SHP, // Saint Helena Pound + SI: currency.EUR, // Slovenian Euro + SJ: currency.NOK, // Norwegian Krone + SK: currency.EUR, // Slovak Euro + SL: currency.SLL, // Sierra Leonean Leone + SM: currency.EUR, // Euro + SN: currency.XOF, // West African CFA Franc + SO: currency.SOS, // Somali Shilling + SR: currency.SRD, // Surinamese Dollar + SS: currency.SSP, // South Sudanese Pound + ST: currency.STN, // São Tomé and Príncipe Dobra + SV: currency.SVC, // Salvadoran Colón + SX: currency.ANG, // Netherlands Antillean Guilder + SY: currency.SYP, // Syrian Pound + SZ: currency.SZL, // Swazi Lilangeni + + // T + TC: currency.USD, // US Dollar + TD: currency.XAF, // Central African CFA Franc + TF: currency.EUR, // Euro + TG: currency.XOF, // West African CFA Franc + TH: currency.THB, // Thai Baht + TJ: currency.TJS, // Tajikistani Somoni + TK: currency.NZD, // New Zealand Dollar + TL: currency.USD, // US Dollar + TM: currency.TMT, // Turkmenistani Manat + TN: currency.TND, // Tunisian Dinar + TO: currency.TOP, // Tongan Paʻanga + TR: currency.TRY, // Turkish Lira + TT: currency.TTD, // Trinidad and Tobago Dollar + TV: currency.AUD, // Australian Dollar + TW: currency.TWD, // New Taiwan Dollar + TZ: currency.TZS, // Tanzanian Shilling + + // U + UA: currency.UAH, // Ukrainian Hryvnia + UG: currency.UGX, // Ugandan Shilling + UM: currency.USD, // US Dollar + US: currency.USD, // US Dollar + UY: currency.UYU, // Uruguayan Peso + UZ: currency.UZS, // Uzbekistani Som + + // V + VA: currency.EUR, // Euro + VC: currency.XCD, // East Caribbean Dollar + VE: currency.VES, // Venezuelan Bolívar Soberano + VG: currency.USD, // US Dollar + VI: currency.USD, // US Dollar + VN: currency.VND, // Vietnamese Dong + VU: currency.VUV, // Vanuatu Vatu + + // W + WF: currency.XPF, // CFP Franc + WS: currency.WST, // Samoan Tala + + // Y + YE: currency.YER, // Yemeni Rial + YT: currency.EUR, // Euro + + // Z + ZA: currency.ZAR, // South African Rand + ZM: currency.ZMW, // Zambian Kwacha + ZW: currency.ZWL, // Zimbabwean Dollar +} + +// Currency returns the ISO 4217 currency code for a given ISO 3166-1 alpha-2 site code +// and a boolean indicating whether the currency was found +func Currency(siteCode string) (currency string, found bool) { + currency, found = currencySite[siteCode] + return +} diff --git a/iso/site/sites_test.go b/iso/site/currency_test.go similarity index 80% rename from iso/site/sites_test.go rename to iso/site/currency_test.go index 5158733..a198863 100644 --- a/iso/site/sites_test.go +++ b/iso/site/currency_test.go @@ -1,6 +1,9 @@ package site -import "testing" +import ( + "github.com/wego/pkg/currency" + "testing" +) func TestCurrency(t *testing.T) { tests := []struct { @@ -13,25 +16,25 @@ func TestCurrency(t *testing.T) { { name: "United States", siteCode: US, - want: "USD", + want: currency.USD, wantOk: true, }, { name: "United Kingdom", siteCode: GB, - want: "GBP", + want: currency.GBP, wantOk: true, }, { name: "Japan", siteCode: JP, - want: "JPY", + want: currency.JPY, wantOk: true, }, { name: "China", siteCode: CN, - want: "CNY", + want: currency.CNY, wantOk: true, }, @@ -39,19 +42,19 @@ func TestCurrency(t *testing.T) { { name: "Germany", siteCode: DE, - want: "EUR", + want: currency.EUR, wantOk: true, }, { name: "France", siteCode: FR, - want: "EUR", + want: currency.EUR, wantOk: true, }, { name: "Italy", siteCode: IT, - want: "EUR", + want: currency.EUR, wantOk: true, }, @@ -59,19 +62,19 @@ func TestCurrency(t *testing.T) { { name: "Puerto Rico", siteCode: PR, - want: "USD", + want: currency.USD, wantOk: true, }, { name: "Guam", siteCode: GU, - want: "USD", + want: currency.USD, wantOk: true, }, { name: "British Virgin Islands", siteCode: VG, - want: "USD", + want: currency.USD, wantOk: true, }, @@ -79,19 +82,19 @@ func TestCurrency(t *testing.T) { { name: "Aruba", siteCode: AW, - want: "AWG", + want: currency.AWG, wantOk: true, }, { name: "Curaçao", siteCode: CW, - want: "ANG", + want: currency.ANG, wantOk: true, }, { name: "Sint Maarten", siteCode: SX, - want: "ANG", + want: currency.ANG, wantOk: true, }, @@ -99,19 +102,19 @@ func TestCurrency(t *testing.T) { { name: "Bonaire, Sint Eustatius and Saba", siteCode: BQ, - want: "USD", + want: currency.USD, wantOk: true, }, { name: "Hong Kong", siteCode: HK, - want: "HKD", + want: currency.HKD, wantOk: true, }, { name: "Macao", siteCode: MO, - want: "MOP", + want: currency.MOP, wantOk: true, }, diff --git a/iso/site/go.mod b/iso/site/go.mod index f2bbc19..098e928 100644 --- a/iso/site/go.mod +++ b/iso/site/go.mod @@ -1,3 +1,10 @@ module github.com/wego/pkg/iso/site go 1.22 + +require github.com/wego/pkg/currency v0.4.4 + +require ( + github.com/bojanz/currency v1.3.0 // indirect + github.com/cockroachdb/apd/v3 v3.2.1 // indirect +) diff --git a/iso/site/go.sum b/iso/site/go.sum new file mode 100644 index 0000000..533b770 --- /dev/null +++ b/iso/site/go.sum @@ -0,0 +1,16 @@ +github.com/bojanz/currency v1.3.0 h1:HlgIxAaD7xMCk1RtjR5b7UKG3d5BBTPZORSPAWefhro= +github.com/bojanz/currency v1.3.0/go.mod h1:jNoZiJyRTqoU5DFoa+n+9lputxPUDa8Fz8BdDrW06Go= +github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= +github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= +github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/wego/pkg/currency v0.4.4 h1:chcer5wumfaRmdrNvz4uP6Vr2aPcjScMhT503xQcGhw= +github.com/wego/pkg/currency v0.4.4/go.mod h1:JtkbrhYTq5fqza2KBosiDSDkZJP9P7COzGugMcIDtyk= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/iso/site/sites.go b/iso/site/sites.go index b845b2f..1cc67b1 100644 --- a/iso/site/sites.go +++ b/iso/site/sites.go @@ -252,304 +252,3 @@ const ( ZM = "ZM" // Zambia ZW = "ZW" // Zimbabwe ) - -// currencySite maps ISO 3166-1 alpha-2 site codes to ISO 4217 currency codes -var currencySite = map[string]string{ - // A - AE: "AED", // United Arab Emirates Dirham - AF: "AFN", // Afghan Afghani - AL: "ALL", // Albanian Lek - AM: "AMD", // Armenian Dram - AO: "AOA", // Angolan Kwanza - AR: "ARS", // Argentine Peso - AU: "AUD", // Australian Dollar - AW: "AWG", // Aruban Florin - AZ: "AZN", // Azerbaijani Manat - - // B - BA: "BAM", // Bosnia and Herzegovina Convertible Mark - BB: "BBD", // Barbadian Dollar - BD: "BDT", // Bangladeshi Taka - BE: "EUR", // Belgian Euro - BF: "XOF", // West African CFA Franc - BG: "BGN", // Bulgarian Lev - BH: "BHD", // Bahraini Dinar - BI: "BIF", // Burundian Franc - BJ: "XOF", // West African CFA Franc - BM: "BMD", // Bermudian Dollar - BN: "BND", // Brunei Dollar - BO: "BOB", // Bolivian Boliviano - BQ: "USD", // US Dollar (Bonaire, Sint Eustatius and Saba) - BR: "BRL", // Brazilian Real - BS: "BSD", // Bahamian Dollar - BT: "BTN", // Bhutanese Ngultrum - BV: "NOK", // Norwegian Krone - BW: "BWP", // Botswana Pula - BY: "BYN", // Belarusian Ruble - BZ: "BZD", // Belize Dollar - - // C - CA: "CAD", // Canadian Dollar - CC: "AUD", // Australian Dollar - CD: "CDF", // Congolese Franc - CF: "XAF", // Central African CFA Franc - CG: "XAF", // Central African CFA Franc - CH: "CHF", // Swiss Franc - CI: "XOF", // West African CFA Franc - CK: "NZD", // New Zealand Dollar - CL: "CLP", // Chilean Peso - CM: "XAF", // Central African CFA Franc - CN: "CNY", // Chinese Yuan - CO: "COP", // Colombian Peso - CR: "CRC", // Costa Rican Colón - CU: "CUP", // Cuban Peso - CV: "CVE", // Cape Verdean Escudo - CW: "ANG", // Netherlands Antillean Guilder - CX: "AUD", // Australian Dollar - CY: "EUR", // Cypriot Euro - CZ: "CZK", // Czech Republic Koruna - - // D - DE: "EUR", // German Euro - DJ: "DJF", // Djiboutian Franc - DK: "DKK", // Danish Krone - DM: "XCD", // East Caribbean Dollar - DO: "DOP", // Dominican Peso - DZ: "DZD", // Algerian Dinar - - // E - EC: "USD", // US Dollar - EE: "EUR", // Estonian Euro - EG: "EGP", // Egyptian Pound - EH: "MAD", // Moroccan Dirham - ER: "ERN", // Eritrean Nakfa - ES: "EUR", // Spanish Euro - ET: "ETB", // Ethiopian Birr - - // F - FI: "EUR", // Finnish Euro - FJ: "FJD", // Fijian Dollar - FK: "FKP", // Falkland Islands Pound - FM: "USD", // US Dollar - FO: "DKK", // Danish Krone - FR: "EUR", // French Euro - - // G - GA: "XAF", // Central African CFA Franc - GB: "GBP", // British Pound Sterling - GD: "XCD", // East Caribbean Dollar - GE: "GEL", // Georgian Lari - GF: "EUR", // Euro - GG: "GBP", // British Pound Sterling - GH: "GHS", // Ghanaian Cedi - GI: "GIP", // Gibraltar Pound - GL: "DKK", // Danish Krone - GM: "GMD", // Gambian Dalasi - GN: "GNF", // Guinean Franc - GP: "EUR", // Euro - GQ: "XAF", // Central African CFA Franc - GR: "EUR", // Greek Euro - GS: "GBP", // British Pound Sterling - GT: "GTQ", // Guatemalan Quetzal - GU: "USD", // US Dollar - GW: "XOF", // West African CFA Franc - GY: "GYD", // Guyanese Dollar - - // H - HK: "HKD", // Hong Kong Dollar - HM: "AUD", // Australian Dollar - HN: "HNL", // Honduran Lempira - HR: "EUR", // Croatian Euro - HT: "HTG", // Haitian Gourde - HU: "HUF", // Hungarian Forint - - // I - ID: "IDR", // Indonesian Rupiah - IE: "EUR", // Irish Euro - IL: "ILS", // Israeli New Shekel - IM: "GBP", // British Pound Sterling - IN: "INR", // Indian Rupee - IO: "USD", // US Dollar - IQ: "IQD", // Iraqi Dinar - IR: "IRR", // Iranian Rial - IS: "ISK", // Icelandic Krona - IT: "EUR", // Italian Euro - - // J - JE: "GBP", // British Pound Sterling - JM: "JMD", // Jamaican Dollar - JO: "JOD", // Jordanian Dinar - JP: "JPY", // Japanese Yen - - // K - KE: "KES", // Kenyan Shilling - KG: "KGS", // Kyrgyzstani Som - KH: "KHR", // Cambodian Riel - KI: "AUD", // Australian Dollar - KM: "KMF", // Comoran Franc - KN: "XCD", // East Caribbean Dollar - KP: "KPW", // North Korean Won - KR: "KRW", // South Korean Won - KW: "KWD", // Kuwaiti Dinar - KY: "KYD", // Cayman Islands Dollar - KZ: "KZT", // Kazakhstani Tenge - - // L - LA: "LAK", // Lao Kip - LB: "LBP", // Lebanese Pound - LC: "XCD", // East Caribbean Dollar - LI: "CHF", // Swiss Franc - LK: "LKR", // Sri Lankan Rupee - LR: "LRD", // Liberian Dollar - LS: "LSL", // Lesotho Loti - LT: "EUR", // Lithuanian Euro - LU: "EUR", // Luxembourg Euro - LV: "EUR", // Latvian Euro - LY: "LYD", // Libyan Dinar - - // M - MA: "MAD", // Moroccan Dirham - MC: "EUR", // Euro - MD: "MDL", // Moldovan Leu - ME: "EUR", // Montenegrin Euro - MF: "EUR", // Euro - MG: "MGA", // Malagasy Ariary - MH: "USD", // US Dollar - MK: "MKD", // Macedonian Denar - ML: "XOF", // West African CFA Franc - MM: "MMK", // Myanmar Kyat - MN: "MNT", // Mongolian Tögrög - MO: "MOP", // Macanese Pataca - MP: "USD", // US Dollar - MQ: "EUR", // Euro - MR: "MRU", // Mauritanian Ouguiya - MS: "XCD", // East Caribbean Dollar - MT: "EUR", // Maltese Euro - MU: "MUR", // Mauritian Rupee - MV: "MVR", // Maldivian Rufiyaa - MW: "MWK", // Malawian Kwacha - MX: "MXN", // Mexican Peso - MY: "MYR", // Malaysian Ringgit - MZ: "MZN", // Mozambican Metical - - // N - NA: "NAD", // Namibian Dollar - NC: "XPF", // CFP Franc - NE: "XOF", // West African CFA Franc - NF: "AUD", // Australian Dollar - NG: "NGN", // Nigerian Naira - NI: "NIO", // Nicaraguan Córdoba - NL: "EUR", // Dutch Euro - NO: "NOK", // Norwegian Krone - NP: "NPR", // Nepalese Rupee - NR: "AUD", // Australian Dollar - NU: "NZD", // New Zealand Dollar - NZ: "NZD", // New Zealand Dollar - - // O - OM: "OMR", // Omani Rial - - // P - PA: "PAB", // Panamanian Balboa - PE: "PEN", // Peruvian Sol - PF: "XPF", // CFP Franc - PG: "PGK", // Papua New Guinean Kina - PH: "PHP", // Philippine Peso - PK: "PKR", // Pakistani Rupee - PL: "PLN", // Polish Zloty - PM: "EUR", // Euro - PN: "NZD", // New Zealand Dollar - PR: "USD", // US Dollar - PS: "ILS", // Israeli New Shekel - PT: "EUR", // Portuguese Euro - PW: "USD", // US Dollar - PY: "PYG", // Paraguayan Guarani - - // Q - QA: "QAR", // Qatari Riyal - - // R - RE: "EUR", // Euro - RO: "RON", // Romanian Leu - RS: "RSD", // Serbian Dinar - RU: "RUB", // Russian Ruble - RW: "RWF", // Rwandan Franc - - // S - SA: "SAR", // Saudi Riyal - SB: "SBD", // Solomon Islands Dollar - SC: "SCR", // Seychellois Rupee - SD: "SDG", // Sudanese Pound - SE: "SEK", // Swedish Krona - SG: "SGD", // Singapore Dollar - SH: "SHP", // Saint Helena Pound - SI: "EUR", // Slovenian Euro - SJ: "NOK", // Norwegian Krone - SK: "EUR", // Slovak Euro - SL: "SLL", // Sierra Leonean Leone - SM: "EUR", // Euro - SN: "XOF", // West African CFA Franc - SO: "SOS", // Somali Shilling - SR: "SRD", // Surinamese Dollar - SS: "SSP", // South Sudanese Pound - ST: "STN", // São Tomé and Príncipe Dobra - SV: "SVC", // Salvadoran Colón - SX: "ANG", // Netherlands Antillean Guilder - SY: "SYP", // Syrian Pound - SZ: "SZL", // Swazi Lilangeni - - // T - TC: "USD", // US Dollar - TD: "XAF", // Central African CFA Franc - TF: "EUR", // Euro - TG: "XOF", // West African CFA Franc - TH: "THB", // Thai Baht - TJ: "TJS", // Tajikistani Somoni - TK: "NZD", // New Zealand Dollar - TL: "USD", // US Dollar - TM: "TMT", // Turkmenistani Manat - TN: "TND", // Tunisian Dinar - TO: "TOP", // Tongan Paʻanga - TR: "TRY", // Turkish Lira - TT: "TTD", // Trinidad and Tobago Dollar - TV: "AUD", // Australian Dollar - TW: "TWD", // New Taiwan Dollar - TZ: "TZS", // Tanzanian Shilling - - // U - UA: "UAH", // Ukrainian Hryvnia - UG: "UGX", // Ugandan Shilling - UM: "USD", // US Dollar - US: "USD", // US Dollar - UY: "UYU", // Uruguayan Peso - UZ: "UZS", // Uzbekistani Som - - // V - VA: "EUR", // Euro - VC: "XCD", // East Caribbean Dollar - VE: "VES", // Venezuelan Bolívar Soberano - VG: "USD", // US Dollar - VI: "USD", // US Dollar - VN: "VND", // Vietnamese Dong - VU: "VUV", // Vanuatu Vatu - - // W - WF: "XPF", // CFP Franc - WS: "WST", // Samoan Tala - - // Y - YE: "YER", // Yemeni Rial - YT: "EUR", // Euro - - // Z - ZA: "ZAR", // South African Rand - ZM: "ZMW", // Zambian Kwacha - ZW: "ZWL", // Zimbabwean Dollar -} - -// Currency returns the ISO 4217 currency code for a given ISO 3166-1 alpha-2 site code -// and a boolean indicating whether the currency was found -func Currency(siteCode string) (currency string, found bool) { - currency, found = currencySite[siteCode] - return -} diff --git a/iso/site/timezone.go b/iso/site/timezone.go new file mode 100644 index 0000000..1fb302e --- /dev/null +++ b/iso/site/timezone.go @@ -0,0 +1,305 @@ +package site + +import "strings" + +// siteZones maps ISO 3166-1 alpha-2 site codes to time zones. +var siteZones = map[string]string{ + // A + AE: "Asia/Dubai", // United Arab Emirates + AF: "Asia/Kabul", // Afghanistan + AL: "Europe/Tirane", // Albania + AM: "Asia/Yerevan", // Armenia + AO: "Africa/Luanda", // Angola + AR: "America/Argentina/Buenos_Aires", // Argentina + AU: "Australia/Sydney", // Australia + AW: "America/Aruba", // Aruba + AZ: "Asia/Baku", // Azerbaijan + + // B + BA: "Europe/Sarajevo", // Bosnia and Herzegovina + BB: "America/Barbados", // Barbados + BD: "Asia/Dhaka", // Bangladesh + BE: "Europe/Brussels", // Belgium + BF: "Africa/Ouagadougou", // Burkina Faso + BG: "Europe/Sofia", // Bulgaria + BH: "Asia/Bahrain", // Bahrain + BI: "Africa/Bujumbura", // Burundi + BJ: "Africa/Porto-Novo", // Benin + BM: "Atlantic/Bermuda", // Bermuda + BN: "Asia/Brunei", // Brunei Darussalam + BO: "America/La_Paz", // Bolivia, Plurinational State of + BQ: "America/Kralendijk", // Bonaire, Sint Eustatius and Saba + BR: "America/Sao_Paulo", // Brazil + BS: "America/Nassau", // Bahamas + BT: "Asia/Thimphu", // Bhutan + BV: "Antarctica/South_Pole", // Bouvet Island + BW: "Africa/Gaborone", // Botswana + BY: "Europe/Minsk", // Belarus + BZ: "America/Belize", // Belize + + // C + CA: "America/Toronto", // Canada + CC: "Australia/Perth", // Cocos (Keeling) Islands + CD: "Africa/Kinshasa", // Congo, the Democratic Republic of the + CF: "Africa/Bangui", // Central African Republic + CG: "Africa/Brazzaville", // Congo + CH: "Europe/Zurich", // Switzerland + CI: "Africa/Abidjan", // Côte d'Ivoire + CK: "Pacific/Rarotonga", // Cook Islands + CL: "America/Santiago", // Chile + CM: "Africa/Douala", // Cameroon + CN: "Asia/Shanghai", // China + CO: "America/Bogota", // Colombia + CR: "America/Costa_Rica", // Costa Rica + CU: "America/Havana", // Cuba + CV: "Atlantic/Cape_Verde", // Cape Verde + CW: "America/Curacao", // Curaçao + CX: "Indian/Christmas", // Christmas Island + CY: "Asia/Nicosia", // Cyprus + CZ: "Europe/Prague", // Czech Republic + + // D + DE: "Europe/Berlin", // Germany + DJ: "Africa/Djibouti", // Djibouti + DK: "Europe/Copenhagen", // Denmark + DM: "America/Dominica", // Dominica + DO: "America/Santo_Domingo", // Dominican Republic + DZ: "Africa/Algiers", // Algeria + + // E + EC: "America/Guayaquil", // Ecuador + EE: "Europe/Tallinn", // Estonia + EG: "Africa/Cairo", // Egypt + EH: "Africa/El_Aaiun", // Western Sahara + ER: "Africa/Asmara", // Eritrea + ES: "Europe/Madrid", // Spain + ET: "Africa/Addis_Ababa", // Ethiopia + + // F + FI: "Europe/Helsinki", // Finland + FJ: "Pacific/Fiji", // Fiji + FK: "Atlantic/Stanley", // Falkland Islands (Malvinas) + FM: "Pacific/Guam", // Federated States of Micronesia + FO: "Atlantic/Faroe", // Faroe Islands + FR: "Europe/Paris", // France + + // G + GA: "Africa/Libreville", // Gabon + GB: "Europe/London", // United Kingdom + GD: "America/Grenada", // Grenada + GE: "Asia/Tbilisi", // Georgia + GF: "America/Cayenne", // French Guiana + GG: "Europe/Guernsey", // Guernsey + GH: "Africa/Accra", // Ghana + GI: "Europe/Gibraltar", // Gibraltar + GL: "America/Godthab", // Greenland + GM: "Africa/Banjul", // Gambia + GN: "Africa/Conakry", // Guinea + GP: "America/Guadeloupe", // Guadeloupe + GQ: "Africa/Malabo", // Equatorial Guinea + GR: "Europe/Athens", // Greece + GS: "Atlantic/South_Georgia", // South Georgia and the South Sandwich Islands + GT: "America/Guatemala", // Guatemala + GU: "Pacific/Guam", // Guam + GW: "Africa/Bissau", // Guinea-Bissau + GY: "America/Guyana", // Guyana + + // H + HK: "Asia/Hong_Kong", // Hong Kong + HM: "Antarctica/Macquarie", // Heard Island and McDonald Islands + HN: "America/Tegucigalpa", // Honduras + HR: "Europe/Zagreb", // Croatia + HT: "America/Port-au-Prince", // Haiti + HU: "Europe/Budapest", // Hungary + + // I + ID: "Asia/Jakarta", // Indonesia + IE: "Europe/Dublin", // Ireland + IL: "Asia/Jerusalem", // Israel + IM: "Europe/London", // Isle of Man + IN: "Asia/Kolkata", // India + IO: "Indian/Chagos", // British Indian Ocean Territory + IQ: "Asia/Baghdad", // Iraq + IR: "Asia/Tehran", // Iran, Islamic Republic of + IS: "Atlantic/Reykjavik", // Iceland + IT: "Europe/Rome", // Italy + + // J + JE: "Europe/Jersey", // Jersey + JM: "America/Jamaica", // Jamaica + JO: "Asia/Amman", // Jordan + JP: "Asia/Tokyo", // Japan + + // K + KE: "Africa/Nairobi", // Kenya + KG: "Asia/Bishkek", // Kyrgyzstan + KH: "Asia/Phnom_Penh", // Cambodia + KI: "Pacific/Tarawa", // Kiribati + KM: "Indian/Comoro", // Comoros + KN: "America/St_Kitts", // Saint Kitts and Nevis + KP: "Asia/Pyongyang", // Korea, Democratic People's Republic of + KR: "Asia/Seoul", // Korea, Republic of + KW: "Asia/Kuwait", // Kuwait + KY: "America/Cayman", // Cayman Islands + KZ: "Asia/Almaty", // Kazakhstan + + // L + LA: "Asia/Vientiane", // Lao People's Democratic Republic + LB: "Asia/Beirut", // Lebanon + LC: "America/St_Lucia", // Saint Lucia + LI: "Europe/Vaduz", // Liechtenstein + LK: "Asia/Colombo", // Sri Lanka + LR: "Africa/Monrovia", // Liberia + LS: "Africa/Maseru", // Lesotho + LT: "Europe/Vilnius", // Lithuania + LU: "Europe/Luxembourg", // Luxembourg + LV: "Europe/Riga", // Latvia + LY: "Africa/Tripoli", // Libya + + // M + MA: "Africa/Casablanca", // Morocco + MC: "Europe/Monaco", // Monaco + MD: "Europe/Chisinau", // Moldova, Republic of + ME: "Europe/Podgorica", // Montenegro + MF: "America/Marigot", // Saint Martin (French part) + MG: "Indian/Antananarivo", // Madagascar + MH: "Pacific/Majuro", // Marshall Islands + MK: "Europe/Skopje", // Macedonia, the former Yugoslav Republic of + ML: "Africa/Bamako", // Mali + MM: "Asia/Yangon", // Myanmar + MN: "Asia/Ulaanbaatar", // Mongolia + MO: "Asia/Macau", // Macao + MP: "Pacific/Saipan", // Northern Mariana Islands + MQ: "America/Martinique", // Martinique + MR: "Africa/Nouakchott", // Mauritania + MS: "America/Montserrat", // Montserrat + MT: "Europe/Malta", // Malta + MU: "Indian/Mauritius", // Mauritius + MV: "Indian/Maldives", // Maldives + MW: "Africa/Blantyre", // Malawi + MX: "America/Mexico_City", // Mexico + MY: "Asia/Kuala_Lumpur", // Malaysia + MZ: "Africa/Maputo", // Mozambique + + // N + NA: "Africa/Windhoek", // Namibia + NC: "Pacific/Noumea", // New Caledonia + NE: "Africa/Niamey", // Niger + NF: "Pacific/Norfolk", // Norfolk Island + NG: "Africa/Lagos", // Nigeria + NI: "America/Managua", // Nicaragua + NL: "Europe/Amsterdam", // Netherlands + NO: "Europe/Oslo", // Norway + NP: "Asia/Kathmandu", // Nepal + NR: "Pacific/Nauru", // Nauru + NU: "Pacific/Niue", // Niue + NZ: "Pacific/Auckland", // New Zealand + + // O + OM: "Asia/Muscat", // Oman + + // P + PA: "America/Panama", // Panama + PE: "America/Lima", // Peru + PF: "Pacific/Tahiti", // French Polynesia + PG: "Pacific/Port_Moresby", // Papua New Guinea + PH: "Asia/Manila", // Philippines + PK: "Asia/Karachi", // Pakistan + PL: "Europe/Warsaw", // Poland + PM: "America/Miquelon", // Saint Pierre and Miquelon + PN: "Pacific/Pitcairn", // Pitcairn + PR: "America/Puerto_Rico", // Puerto Rico + PS: "Asia/Hebron", // Palestinian Territory, Occupied + PT: "Europe/Lisbon", // Portugal + PW: "Pacific/Palau", // Palau + PY: "America/Asuncion", // Paraguay + + // Q + QA: "Asia/Qatar", // Qatar + + // R + RE: "Indian/Reunion", // Réunion + RO: "Europe/Bucharest", // Romania + RS: "Europe/Belgrade", // Serbia + RU: "Europe/Moscow", // Russian Federation + RW: "Africa/Kigali", // Rwanda + + // S + SA: "Asia/Riyadh", // Saudi Arabia + SB: "Pacific/Guadalcanal", // Solomon Islands + SC: "Indian/Mahe", // Seychelles + SD: "Africa/Khartoum", // Sudan + SE: "Europe/Stockholm", // Sweden + SG: "Asia/Singapore", // Singapore + SH: "Atlantic/St_Helena", // Saint Helena, Ascension and Tristan da Cunha + SI: "Europe/Ljubljana", // Slovenia + SJ: "Arctic/Longyearbyen", // Svalbard and Jan Mayen + SK: "Europe/Bratislava", // Slovakia + SL: "Africa/Freetown", // Sierra Leone + SM: "Europe/San_Marino", // San Marino + SN: "Africa/Dakar", // Senegal + SO: "Africa/Mogadishu", // Somalia + SR: "America/Paramaribo", // Suriname + SS: "Africa/Juba", // South Sudan + ST: "Africa/Sao_Tome", // Sao Tome and Principe + SV: "America/El_Salvador", // El Salvador + SX: "America/Curacao", // Sint Maarten (Dutch part) + SY: "Asia/Damascus", // Syrian Arab Republic + SZ: "Africa/Mbabane", // Eswatini (fmr. "Swaziland") + + // T + TC: "America/Grand_Turk", // Turks and Caicos Islands + TD: "Africa/Ndjamena", // Chad + TF: "Indian/Kerguelen", // French Southern Territories + TG: "Africa/Lome", // Togo + TH: "Asia/Bangkok", // Thailand + TJ: "Asia/Dushanbe", // Tajikistan + TK: "Pacific/Fakaofo", // Tokelau + TL: "Asia/Dili", // Timor-Leste + TM: "Asia/Ashgabat", // Turkmenistan + TN: "Africa/Tunis", // Tunisia + TO: "Pacific/Tongatapu", // Tonga + TR: "Europe/Istanbul", // Turkey + TT: "America/Port_of_Spain", // Trinidad and Tobago + TV: "Pacific/Funafuti", // Tuvalu + TW: "Asia/Taipei", // Taiwan, Province of China + TZ: "Africa/Dar_es_Salaam", // Tanzania, United Republic of + + // U + UA: "Europe/Kiev", // Ukraine + UG: "Africa/Kampala", // Uganda + UM: "Pacific/Wake", // United States Minor Outlying Islands + US: "America/New_York", // United States of America + UY: "America/Montevideo", // Uruguay + UZ: "Asia/Tashkent", // Uzbekistan + + // V + VA: "Europe/Vatican", // Holy See (Vatican City State) + VC: "America/St_Vincent", // Saint Vincent and the Grenadines + VE: "America/Caracas", // Venezuela, Bolivarian Republic of + VG: "America/Tortola", // Virgin Islands, British + VI: "America/St_Thomas", // Virgin Islands, U.S. + VN: "Asia/Ho_Chi_Minh", // Vietnam + VU: "Pacific/Efate", // Vanuatu + + // W + WF: "Pacific/Wallis", // Wallis and Futuna + WS: "Pacific/Apia", // Samoa + + // Y + YE: "Asia/Aden", // Yemen + YT: "Indian/Mayotte", // Mayotte + + // Z + ZA: "Africa/Johannesburg", // South Africa + ZM: "Africa/Lusaka", // Zambia + ZW: "Africa/Harare", // Zimbabwe +} + +// TimeZone returns the IANA timezone identifier for a given ISO 3166-1 alpha-2 site code +// and a boolean indicating whether the timezone was found +func TimeZone(siteCode string) (timezone string, found bool) { + siteCode = strings.ToUpper(siteCode) + timezone, found = siteZones[siteCode] + return +} diff --git a/iso/site/timezone_test.go b/iso/site/timezone_test.go new file mode 100644 index 0000000..7b36604 --- /dev/null +++ b/iso/site/timezone_test.go @@ -0,0 +1,395 @@ +package site + +import ( + "fmt" + "testing" + "time" +) + +func TestTimeZone(t *testing.T) { + tests := []struct { + name string + siteCode string + want string + wantOk bool + wantOffset string // Expected UTC offset (e.g., "UTC+0", "UTC-5", "UTC+5.5") + }{ + // A + {name: "United Arab Emirates", siteCode: AE, want: "Asia/Dubai", wantOk: true, wantOffset: "UTC+4"}, + {name: "Afghanistan", siteCode: AF, want: "Asia/Kabul", wantOk: true, wantOffset: "UTC+4.5"}, + {name: "Albania", siteCode: AL, want: "Europe/Tirane", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Armenia", siteCode: AM, want: "Asia/Yerevan", wantOk: true, wantOffset: "UTC+4"}, + {name: "Angola", siteCode: AO, want: "Africa/Luanda", wantOk: true, wantOffset: "UTC+1"}, + {name: "Argentina", siteCode: AR, want: "America/Argentina/Buenos_Aires", wantOk: true, wantOffset: "UTC-3"}, + {name: "Australia", siteCode: AU, want: "Australia/Sydney", wantOk: true, wantOffset: "UTC+10/+11"}, + {name: "Aruba", siteCode: AW, want: "America/Aruba", wantOk: true, wantOffset: "UTC-4"}, + {name: "Azerbaijan", siteCode: AZ, want: "Asia/Baku", wantOk: true, wantOffset: "UTC+4"}, + + // B + {name: "Bosnia and Herzegovina", siteCode: BA, want: "Europe/Sarajevo", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Barbados", siteCode: BB, want: "America/Barbados", wantOk: true, wantOffset: "UTC-4"}, + {name: "Bangladesh", siteCode: BD, want: "Asia/Dhaka", wantOk: true, wantOffset: "UTC+6"}, + {name: "Belgium", siteCode: BE, want: "Europe/Brussels", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Burkina Faso", siteCode: BF, want: "Africa/Ouagadougou", wantOk: true, wantOffset: "UTC+0"}, + {name: "Bulgaria", siteCode: BG, want: "Europe/Sofia", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Bahrain", siteCode: BH, want: "Asia/Bahrain", wantOk: true, wantOffset: "UTC+3"}, + {name: "Burundi", siteCode: BI, want: "Africa/Bujumbura", wantOk: true, wantOffset: "UTC+2"}, + {name: "Benin", siteCode: BJ, want: "Africa/Porto-Novo", wantOk: true, wantOffset: "UTC+1"}, + {name: "Bermuda", siteCode: BM, want: "Atlantic/Bermuda", wantOk: true, wantOffset: "UTC-4/-3"}, + {name: "Brunei Darussalam", siteCode: BN, want: "Asia/Brunei", wantOk: true, wantOffset: "UTC+8"}, + {name: "Bolivia", siteCode: BO, want: "America/La_Paz", wantOk: true, wantOffset: "UTC-4"}, + {name: "Bonaire, Sint Eustatius and Saba", siteCode: BQ, want: "America/Kralendijk", wantOk: true, wantOffset: "UTC-4"}, + {name: "Brazil", siteCode: BR, want: "America/Sao_Paulo", wantOk: true, wantOffset: "UTC-3"}, + {name: "Bahamas", siteCode: BS, want: "America/Nassau", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Bhutan", siteCode: BT, want: "Asia/Thimphu", wantOk: true, wantOffset: "UTC+6"}, + {name: "Bouvet Island", siteCode: BV, want: "Antarctica/South_Pole", wantOk: true, wantOffset: "UTC+12/+13"}, + {name: "Botswana", siteCode: BW, want: "Africa/Gaborone", wantOk: true, wantOffset: "UTC+2"}, + {name: "Belarus", siteCode: BY, want: "Europe/Minsk", wantOk: true, wantOffset: "UTC+3"}, + {name: "Belize", siteCode: BZ, want: "America/Belize", wantOk: true, wantOffset: "UTC-6"}, + + // C + {name: "Canada", siteCode: CA, want: "America/Toronto", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Cocos (Keeling) Islands", siteCode: CC, want: "Australia/Perth", wantOk: true, wantOffset: "UTC+8"}, + {name: "Congo, the Democratic Republic of the", siteCode: CD, want: "Africa/Kinshasa", wantOk: true, wantOffset: "UTC+1"}, + {name: "Central African Republic", siteCode: CF, want: "Africa/Bangui", wantOk: true, wantOffset: "UTC+1"}, + {name: "Congo", siteCode: CG, want: "Africa/Brazzaville", wantOk: true, wantOffset: "UTC+1"}, + {name: "Switzerland", siteCode: CH, want: "Europe/Zurich", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Côte d'Ivoire", siteCode: CI, want: "Africa/Abidjan", wantOk: true, wantOffset: "UTC+0"}, + {name: "Cook Islands", siteCode: CK, want: "Pacific/Rarotonga", wantOk: true, wantOffset: "UTC-10"}, + {name: "Chile", siteCode: CL, want: "America/Santiago", wantOk: true, wantOffset: "UTC-4/-3"}, + {name: "Cameroon", siteCode: CM, want: "Africa/Douala", wantOk: true, wantOffset: "UTC+1"}, + {name: "China", siteCode: CN, want: "Asia/Shanghai", wantOk: true, wantOffset: "UTC+8"}, + {name: "Colombia", siteCode: CO, want: "America/Bogota", wantOk: true, wantOffset: "UTC-5"}, + {name: "Costa Rica", siteCode: CR, want: "America/Costa_Rica", wantOk: true, wantOffset: "UTC-6"}, + {name: "Cuba", siteCode: CU, want: "America/Havana", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Cape Verde", siteCode: CV, want: "Atlantic/Cape_Verde", wantOk: true, wantOffset: "UTC-1"}, + {name: "Curaçao", siteCode: CW, want: "America/Curacao", wantOk: true, wantOffset: "UTC-4"}, + {name: "Christmas Island", siteCode: CX, want: "Indian/Christmas", wantOk: true, wantOffset: "UTC+7"}, + {name: "Cyprus", siteCode: CY, want: "Asia/Nicosia", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Czech Republic", siteCode: CZ, want: "Europe/Prague", wantOk: true, wantOffset: "UTC+1/+2"}, + + // D + {name: "Germany", siteCode: DE, want: "Europe/Berlin", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Djibouti", siteCode: DJ, want: "Africa/Djibouti", wantOk: true, wantOffset: "UTC+3"}, + {name: "Denmark", siteCode: DK, want: "Europe/Copenhagen", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Dominica", siteCode: DM, want: "America/Dominica", wantOk: true, wantOffset: "UTC-4"}, + {name: "Dominican Republic", siteCode: DO, want: "America/Santo_Domingo", wantOk: true, wantOffset: "UTC-4"}, + {name: "Algeria", siteCode: DZ, want: "Africa/Algiers", wantOk: true, wantOffset: "UTC+1"}, + + // E + {name: "Ecuador", siteCode: EC, want: "America/Guayaquil", wantOk: true, wantOffset: "UTC-5"}, + {name: "Estonia", siteCode: EE, want: "Europe/Tallinn", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Egypt", siteCode: EG, want: "Africa/Cairo", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Western Sahara", siteCode: EH, want: "Africa/El_Aaiun", wantOk: true, wantOffset: "UTC+1"}, + {name: "Eritrea", siteCode: ER, want: "Africa/Asmara", wantOk: true, wantOffset: "UTC+3"}, + {name: "Spain", siteCode: ES, want: "Europe/Madrid", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Ethiopia", siteCode: ET, want: "Africa/Addis_Ababa", wantOk: true, wantOffset: "UTC+3"}, + + // F + {name: "Finland", siteCode: FI, want: "Europe/Helsinki", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Fiji", siteCode: FJ, want: "Pacific/Fiji", wantOk: true, wantOffset: "UTC+12"}, + {name: "Falkland Islands", siteCode: FK, want: "Atlantic/Stanley", wantOk: true, wantOffset: "UTC-3"}, + {name: "Federated States of Micronesia", siteCode: FM, want: "Pacific/Guam", wantOk: true, wantOffset: "UTC+10"}, + {name: "Faroe Islands", siteCode: FO, want: "Atlantic/Faroe", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "France", siteCode: FR, want: "Europe/Paris", wantOk: true, wantOffset: "UTC+1/+2"}, + + // G + {name: "Gabon", siteCode: GA, want: "Africa/Libreville", wantOk: true, wantOffset: "UTC+1"}, + {name: "United Kingdom", siteCode: GB, want: "Europe/London", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "Grenada", siteCode: GD, want: "America/Grenada", wantOk: true, wantOffset: "UTC-4"}, + {name: "Georgia", siteCode: GE, want: "Asia/Tbilisi", wantOk: true, wantOffset: "UTC+4"}, + {name: "French Guiana", siteCode: GF, want: "America/Cayenne", wantOk: true, wantOffset: "UTC-3"}, + {name: "Guernsey", siteCode: GG, want: "Europe/Guernsey", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "Ghana", siteCode: GH, want: "Africa/Accra", wantOk: true, wantOffset: "UTC+0"}, + {name: "Gibraltar", siteCode: GI, want: "Europe/Gibraltar", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Greenland", siteCode: GL, want: "America/Godthab", wantOk: true, wantOffset: "UTC-2/-1"}, + {name: "Gambia", siteCode: GM, want: "Africa/Banjul", wantOk: true, wantOffset: "UTC+0"}, + {name: "Guinea", siteCode: GN, want: "Africa/Conakry", wantOk: true, wantOffset: "UTC+0"}, + {name: "Guadeloupe", siteCode: GP, want: "America/Guadeloupe", wantOk: true, wantOffset: "UTC-4"}, + {name: "Equatorial Guinea", siteCode: GQ, want: "Africa/Malabo", wantOk: true, wantOffset: "UTC+1"}, + {name: "Greece", siteCode: GR, want: "Europe/Athens", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "South Georgia and the South Sandwich Islands", siteCode: GS, want: "Atlantic/South_Georgia", wantOk: true, wantOffset: "UTC-2"}, + {name: "Guatemala", siteCode: GT, want: "America/Guatemala", wantOk: true, wantOffset: "UTC-6"}, + {name: "Guam", siteCode: GU, want: "Pacific/Guam", wantOk: true, wantOffset: "UTC+10"}, + {name: "Guinea-Bissau", siteCode: GW, want: "Africa/Bissau", wantOk: true, wantOffset: "UTC+0"}, + {name: "Guyana", siteCode: GY, want: "America/Guyana", wantOk: true, wantOffset: "UTC-4"}, + + // H + {name: "Hong Kong", siteCode: HK, want: "Asia/Hong_Kong", wantOk: true, wantOffset: "UTC+8"}, + {name: "Heard Island and McDonald Islands", siteCode: HM, want: "Antarctica/Macquarie", wantOk: true, wantOffset: "UTC+10/+11"}, + {name: "Honduras", siteCode: HN, want: "America/Tegucigalpa", wantOk: true, wantOffset: "UTC-6"}, + {name: "Croatia", siteCode: HR, want: "Europe/Zagreb", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Haiti", siteCode: HT, want: "America/Port-au-Prince", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Hungary", siteCode: HU, want: "Europe/Budapest", wantOk: true, wantOffset: "UTC+1/+2"}, + + // I + {name: "Indonesia", siteCode: ID, want: "Asia/Jakarta", wantOk: true, wantOffset: "UTC+7"}, + {name: "Ireland", siteCode: IE, want: "Europe/Dublin", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "Israel", siteCode: IL, want: "Asia/Jerusalem", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Isle of Man", siteCode: IM, want: "Europe/London", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "India", siteCode: IN, want: "Asia/Kolkata", wantOk: true, wantOffset: "UTC+5.5"}, + {name: "British Indian Ocean Territory", siteCode: IO, want: "Indian/Chagos", wantOk: true, wantOffset: "UTC+6"}, + {name: "Iraq", siteCode: IQ, want: "Asia/Baghdad", wantOk: true, wantOffset: "UTC+3"}, + {name: "Iran", siteCode: IR, want: "Asia/Tehran", wantOk: true, wantOffset: "UTC+3.5"}, + {name: "Iceland", siteCode: IS, want: "Atlantic/Reykjavik", wantOk: true, wantOffset: "UTC+0"}, + {name: "Italy", siteCode: IT, want: "Europe/Rome", wantOk: true, wantOffset: "UTC+1/+2"}, + + // J + {name: "Jersey", siteCode: JE, want: "Europe/Jersey", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "Jamaica", siteCode: JM, want: "America/Jamaica", wantOk: true, wantOffset: "UTC-5"}, + {name: "Jordan", siteCode: JO, want: "Asia/Amman", wantOk: true, wantOffset: "UTC+3"}, + {name: "Japan", siteCode: JP, want: "Asia/Tokyo", wantOk: true, wantOffset: "UTC+9"}, + + // K + {name: "Kenya", siteCode: KE, want: "Africa/Nairobi", wantOk: true, wantOffset: "UTC+3"}, + {name: "Kyrgyzstan", siteCode: KG, want: "Asia/Bishkek", wantOk: true, wantOffset: "UTC+6"}, + {name: "Cambodia", siteCode: KH, want: "Asia/Phnom_Penh", wantOk: true, wantOffset: "UTC+7"}, + {name: "Kiribati", siteCode: KI, want: "Pacific/Tarawa", wantOk: true, wantOffset: "UTC+12"}, + {name: "Comoros", siteCode: KM, want: "Indian/Comoro", wantOk: true, wantOffset: "UTC+3"}, + {name: "Saint Kitts and Nevis", siteCode: KN, want: "America/St_Kitts", wantOk: true, wantOffset: "UTC-4"}, + {name: "North Korea", siteCode: KP, want: "Asia/Pyongyang", wantOk: true, wantOffset: "UTC+9"}, + {name: "South Korea", siteCode: KR, want: "Asia/Seoul", wantOk: true, wantOffset: "UTC+9"}, + {name: "Kuwait", siteCode: KW, want: "Asia/Kuwait", wantOk: true, wantOffset: "UTC+3"}, + {name: "Cayman Islands", siteCode: KY, want: "America/Cayman", wantOk: true, wantOffset: "UTC-5"}, + {name: "Kazakhstan", siteCode: KZ, want: "Asia/Almaty", wantOk: true, wantOffset: "UTC+5/+6"}, + + // L + {name: "Laos", siteCode: LA, want: "Asia/Vientiane", wantOk: true, wantOffset: "UTC+7"}, + {name: "Lebanon", siteCode: LB, want: "Asia/Beirut", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Saint Lucia", siteCode: LC, want: "America/St_Lucia", wantOk: true, wantOffset: "UTC-4"}, + {name: "Liechtenstein", siteCode: LI, want: "Europe/Vaduz", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Sri Lanka", siteCode: LK, want: "Asia/Colombo", wantOk: true, wantOffset: "UTC+5.5"}, + {name: "Liberia", siteCode: LR, want: "Africa/Monrovia", wantOk: true, wantOffset: "UTC+0"}, + {name: "Lesotho", siteCode: LS, want: "Africa/Maseru", wantOk: true, wantOffset: "UTC+2"}, + {name: "Lithuania", siteCode: LT, want: "Europe/Vilnius", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Luxembourg", siteCode: LU, want: "Europe/Luxembourg", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Latvia", siteCode: LV, want: "Europe/Riga", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Libya", siteCode: LY, want: "Africa/Tripoli", wantOk: true, wantOffset: "UTC+2"}, + + // M + {name: "Morocco", siteCode: MA, want: "Africa/Casablanca", wantOk: true, wantOffset: "UTC+1"}, + {name: "Monaco", siteCode: MC, want: "Europe/Monaco", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Moldova", siteCode: MD, want: "Europe/Chisinau", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Montenegro", siteCode: ME, want: "Europe/Podgorica", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Saint Martin", siteCode: MF, want: "America/Marigot", wantOk: true, wantOffset: "UTC-4"}, + {name: "Madagascar", siteCode: MG, want: "Indian/Antananarivo", wantOk: true, wantOffset: "UTC+3"}, + {name: "Marshall Islands", siteCode: MH, want: "Pacific/Majuro", wantOk: true, wantOffset: "UTC+12"}, + {name: "Macedonia", siteCode: MK, want: "Europe/Skopje", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Mali", siteCode: ML, want: "Africa/Bamako", wantOk: true, wantOffset: "UTC+0"}, + {name: "Myanmar", siteCode: MM, want: "Asia/Yangon", wantOk: true, wantOffset: "UTC+6.5"}, + {name: "Mongolia", siteCode: MN, want: "Asia/Ulaanbaatar", wantOk: true, wantOffset: "UTC+8"}, + {name: "Macao", siteCode: MO, want: "Asia/Macau", wantOk: true, wantOffset: "UTC+8"}, + {name: "Northern Mariana Islands", siteCode: MP, want: "Pacific/Saipan", wantOk: true, wantOffset: "UTC+10"}, + {name: "Martinique", siteCode: MQ, want: "America/Martinique", wantOk: true, wantOffset: "UTC-4"}, + {name: "Mauritania", siteCode: MR, want: "Africa/Nouakchott", wantOk: true, wantOffset: "UTC+0"}, + {name: "Montserrat", siteCode: MS, want: "America/Montserrat", wantOk: true, wantOffset: "UTC-4"}, + {name: "Malta", siteCode: MT, want: "Europe/Malta", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Mauritius", siteCode: MU, want: "Indian/Mauritius", wantOk: true, wantOffset: "UTC+4"}, + {name: "Maldives", siteCode: MV, want: "Indian/Maldives", wantOk: true, wantOffset: "UTC+5"}, + {name: "Malawi", siteCode: MW, want: "Africa/Blantyre", wantOk: true, wantOffset: "UTC+2"}, + {name: "Mexico", siteCode: MX, want: "America/Mexico_City", wantOk: true, wantOffset: "UTC-6"}, + {name: "Malaysia", siteCode: MY, want: "Asia/Kuala_Lumpur", wantOk: true, wantOffset: "UTC+8"}, + {name: "Mozambique", siteCode: MZ, want: "Africa/Maputo", wantOk: true, wantOffset: "UTC+2"}, + + // N + {name: "Namibia", siteCode: NA, want: "Africa/Windhoek", wantOk: true, wantOffset: "UTC+2"}, + {name: "New Caledonia", siteCode: NC, want: "Pacific/Noumea", wantOk: true, wantOffset: "UTC+11"}, + {name: "Niger", siteCode: NE, want: "Africa/Niamey", wantOk: true, wantOffset: "UTC+1"}, + {name: "Norfolk Island", siteCode: NF, want: "Pacific/Norfolk", wantOk: true, wantOffset: "UTC+11/+12"}, + {name: "Nigeria", siteCode: NG, want: "Africa/Lagos", wantOk: true, wantOffset: "UTC+1"}, + {name: "Nicaragua", siteCode: NI, want: "America/Managua", wantOk: true, wantOffset: "UTC-6"}, + {name: "Netherlands", siteCode: NL, want: "Europe/Amsterdam", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Norway", siteCode: NO, want: "Europe/Oslo", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Nepal", siteCode: NP, want: "Asia/Kathmandu", wantOk: true, wantOffset: "UTC+5.75"}, + {name: "Nauru", siteCode: NR, want: "Pacific/Nauru", wantOk: true, wantOffset: "UTC+12"}, + {name: "Niue", siteCode: NU, want: "Pacific/Niue", wantOk: true, wantOffset: "UTC-11"}, + {name: "New Zealand", siteCode: NZ, want: "Pacific/Auckland", wantOk: true, wantOffset: "UTC+12/+13"}, + + // O + {name: "Oman", siteCode: OM, want: "Asia/Muscat", wantOk: true, wantOffset: "UTC+4"}, + + // P + {name: "Panama", siteCode: PA, want: "America/Panama", wantOk: true, wantOffset: "UTC-5"}, + {name: "Peru", siteCode: PE, want: "America/Lima", wantOk: true, wantOffset: "UTC-5"}, + {name: "French Polynesia", siteCode: PF, want: "Pacific/Tahiti", wantOk: true, wantOffset: "UTC-10"}, + {name: "Papua New Guinea", siteCode: PG, want: "Pacific/Port_Moresby", wantOk: true, wantOffset: "UTC+10"}, + {name: "Philippines", siteCode: PH, want: "Asia/Manila", wantOk: true, wantOffset: "UTC+8"}, + {name: "Pakistan", siteCode: PK, want: "Asia/Karachi", wantOk: true, wantOffset: "UTC+5"}, + {name: "Poland", siteCode: PL, want: "Europe/Warsaw", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Saint Pierre and Miquelon", siteCode: PM, want: "America/Miquelon", wantOk: true, wantOffset: "UTC-3/-2"}, + {name: "Pitcairn", siteCode: PN, want: "Pacific/Pitcairn", wantOk: true, wantOffset: "UTC-8"}, + {name: "Puerto Rico", siteCode: PR, want: "America/Puerto_Rico", wantOk: true, wantOffset: "UTC-4"}, + {name: "Palestinian Territory", siteCode: PS, want: "Asia/Hebron", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Portugal", siteCode: PT, want: "Europe/Lisbon", wantOk: true, wantOffset: "UTC+0/+1"}, + {name: "Palau", siteCode: PW, want: "Pacific/Palau", wantOk: true, wantOffset: "UTC+9"}, + {name: "Paraguay", siteCode: PY, want: "America/Asuncion", wantOk: true, wantOffset: "UTC-4/-3"}, + + // Q + {name: "Qatar", siteCode: QA, want: "Asia/Qatar", wantOk: true, wantOffset: "UTC+3"}, + + // R + {name: "Réunion", siteCode: RE, want: "Indian/Reunion", wantOk: true, wantOffset: "UTC+4"}, + {name: "Romania", siteCode: RO, want: "Europe/Bucharest", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Serbia", siteCode: RS, want: "Europe/Belgrade", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Russian Federation", siteCode: RU, want: "Europe/Moscow", wantOk: true, wantOffset: "UTC+3"}, + {name: "Rwanda", siteCode: RW, want: "Africa/Kigali", wantOk: true, wantOffset: "UTC+2"}, + + // S + {name: "Saudi Arabia", siteCode: SA, want: "Asia/Riyadh", wantOk: true, wantOffset: "UTC+3"}, + {name: "Solomon Islands", siteCode: SB, want: "Pacific/Guadalcanal", wantOk: true, wantOffset: "UTC+11"}, + {name: "Seychelles", siteCode: SC, want: "Indian/Mahe", wantOk: true, wantOffset: "UTC+4"}, + {name: "Sudan", siteCode: SD, want: "Africa/Khartoum", wantOk: true, wantOffset: "UTC+2"}, + {name: "Sweden", siteCode: SE, want: "Europe/Stockholm", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Singapore", siteCode: SG, want: "Asia/Singapore", wantOk: true, wantOffset: "UTC+8"}, + {name: "Saint Helena", siteCode: SH, want: "Atlantic/St_Helena", wantOk: true, wantOffset: "UTC+0"}, + {name: "Slovenia", siteCode: SI, want: "Europe/Ljubljana", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Svalbard and Jan Mayen", siteCode: SJ, want: "Arctic/Longyearbyen", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Slovakia", siteCode: SK, want: "Europe/Bratislava", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Sierra Leone", siteCode: SL, want: "Africa/Freetown", wantOk: true, wantOffset: "UTC+0"}, + {name: "San Marino", siteCode: SM, want: "Europe/San_Marino", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Senegal", siteCode: SN, want: "Africa/Dakar", wantOk: true, wantOffset: "UTC+0"}, + {name: "Somalia", siteCode: SO, want: "Africa/Mogadishu", wantOk: true, wantOffset: "UTC+3"}, + {name: "Suriname", siteCode: SR, want: "America/Paramaribo", wantOk: true, wantOffset: "UTC-3"}, + {name: "South Sudan", siteCode: SS, want: "Africa/Juba", wantOk: true, wantOffset: "UTC+2"}, + {name: "Sao Tome and Principe", siteCode: ST, want: "Africa/Sao_Tome", wantOk: true, wantOffset: "UTC+0"}, + {name: "El Salvador", siteCode: SV, want: "America/El_Salvador", wantOk: true, wantOffset: "UTC-6"}, + {name: "Sint Maarten", siteCode: SX, want: "America/Curacao", wantOk: true, wantOffset: "UTC-4"}, + {name: "Syrian Arab Republic", siteCode: SY, want: "Asia/Damascus", wantOk: true, wantOffset: "UTC+3"}, + {name: "Eswatini", siteCode: SZ, want: "Africa/Mbabane", wantOk: true, wantOffset: "UTC+2"}, + + // T + {name: "Turks and Caicos Islands", siteCode: TC, want: "America/Grand_Turk", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Chad", siteCode: TD, want: "Africa/Ndjamena", wantOk: true, wantOffset: "UTC+1"}, + {name: "French Southern Territories", siteCode: TF, want: "Indian/Kerguelen", wantOk: true, wantOffset: "UTC+5"}, + {name: "Togo", siteCode: TG, want: "Africa/Lome", wantOk: true, wantOffset: "UTC+0"}, + {name: "Thailand", siteCode: TH, want: "Asia/Bangkok", wantOk: true, wantOffset: "UTC+7"}, + {name: "Tajikistan", siteCode: TJ, want: "Asia/Dushanbe", wantOk: true, wantOffset: "UTC+5"}, + {name: "Tokelau", siteCode: TK, want: "Pacific/Fakaofo", wantOk: true, wantOffset: "UTC+13"}, + {name: "Timor-Leste", siteCode: TL, want: "Asia/Dili", wantOk: true, wantOffset: "UTC+9"}, + {name: "Turkmenistan", siteCode: TM, want: "Asia/Ashgabat", wantOk: true, wantOffset: "UTC+5"}, + {name: "Tunisia", siteCode: TN, want: "Africa/Tunis", wantOk: true, wantOffset: "UTC+1"}, + {name: "Tonga", siteCode: TO, want: "Pacific/Tongatapu", wantOk: true, wantOffset: "UTC+13"}, + {name: "Turkey", siteCode: TR, want: "Europe/Istanbul", wantOk: true, wantOffset: "UTC+3"}, + {name: "Trinidad and Tobago", siteCode: TT, want: "America/Port_of_Spain", wantOk: true, wantOffset: "UTC-4"}, + {name: "Tuvalu", siteCode: TV, want: "Pacific/Funafuti", wantOk: true, wantOffset: "UTC+12"}, + {name: "Taiwan", siteCode: TW, want: "Asia/Taipei", wantOk: true, wantOffset: "UTC+8"}, + {name: "Tanzania", siteCode: TZ, want: "Africa/Dar_es_Salaam", wantOk: true, wantOffset: "UTC+3"}, + + // U + {name: "Ukraine", siteCode: UA, want: "Europe/Kiev", wantOk: true, wantOffset: "UTC+2/+3"}, + {name: "Uganda", siteCode: UG, want: "Africa/Kampala", wantOk: true, wantOffset: "UTC+3"}, + {name: "United States Minor Outlying Islands", siteCode: UM, want: "Pacific/Wake", wantOk: true, wantOffset: "UTC+12"}, + {name: "United States", siteCode: US, want: "America/New_York", wantOk: true, wantOffset: "UTC-5/-4"}, + {name: "Uruguay", siteCode: UY, want: "America/Montevideo", wantOk: true, wantOffset: "UTC-3"}, + {name: "Uzbekistan", siteCode: UZ, want: "Asia/Tashkent", wantOk: true, wantOffset: "UTC+5"}, + + // V + {name: "Vatican City", siteCode: VA, want: "Europe/Vatican", wantOk: true, wantOffset: "UTC+1/+2"}, + {name: "Saint Vincent and the Grenadines", siteCode: VC, want: "America/St_Vincent", wantOk: true, wantOffset: "UTC-4"}, + {name: "Venezuela", siteCode: VE, want: "America/Caracas", wantOk: true, wantOffset: "UTC-4"}, + {name: "Virgin Islands, British", siteCode: VG, want: "America/Tortola", wantOk: true, wantOffset: "UTC-4"}, + {name: "Virgin Islands, U.S.", siteCode: VI, want: "America/St_Thomas", wantOk: true, wantOffset: "UTC-4"}, + {name: "Vietnam", siteCode: VN, want: "Asia/Ho_Chi_Minh", wantOk: true, wantOffset: "UTC+7"}, + {name: "Vanuatu", siteCode: VU, want: "Pacific/Efate", wantOk: true, wantOffset: "UTC+11"}, + + // W + {name: "Wallis and Futuna", siteCode: WF, want: "Pacific/Wallis", wantOk: true, wantOffset: "UTC+12"}, + {name: "Samoa", siteCode: WS, want: "Pacific/Apia", wantOk: true, wantOffset: "UTC+13"}, + + // Y + {name: "Yemen", siteCode: YE, want: "Asia/Aden", wantOk: true, wantOffset: "UTC+3"}, + {name: "Mayotte", siteCode: YT, want: "Indian/Mayotte", wantOk: true, wantOffset: "UTC+3"}, + + // Z + {name: "South Africa", siteCode: ZA, want: "Africa/Johannesburg", wantOk: true, wantOffset: "UTC+2"}, + {name: "Zambia", siteCode: ZM, want: "Africa/Lusaka", wantOk: true, wantOffset: "UTC+2"}, + {name: "Zimbabwe", siteCode: ZW, want: "Africa/Harare", wantOk: true, wantOffset: "UTC+2"}, + + // Test cases for invalid site codes + {name: "Invalid site code", siteCode: "XX", want: "", wantOk: false, wantOffset: ""}, + {name: "Empty site code", siteCode: "", want: "", wantOk: false, wantOffset: ""}, + {name: "Lowercase site code", siteCode: "us", want: "America/New_York", wantOk: true, wantOffset: "UTC-5/-4"}, // Should work due to ToUpper + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, ok := TimeZone(tt.siteCode) + if got != tt.want || ok != tt.wantOk { + t.Errorf("TimeZone(%s) = %s, %v; want %s, %v", tt.siteCode, got, ok, tt.want, tt.wantOk) + } + // verify that the returned timezone is valid and check offset + if ok { + loc, err := time.LoadLocation(got) + if err != nil { + t.Errorf("TimeZone(%s) returned invalid timezone: %s", tt.siteCode, err) + return + } + + // Check both January and July to account for DST + jan := time.Date(2024, 1, 15, 12, 0, 0, 0, loc) + jul := time.Date(2024, 7, 15, 12, 0, 0, 0, loc) + + _, janOffset := jan.Zone() + _, julOffset := jul.Zone() + + janHours := float64(janOffset) / 3600 + julHours := float64(julOffset) / 3600 + + // Format the actual offset string + var actualOffset string + if janOffset == julOffset { + // No DST + if janHours == float64(int(janHours)) { + actualOffset = fmt.Sprintf("UTC%+d", int(janHours)) + } else { + actualOffset = fmt.Sprintf("UTC%+g", janHours) + } + } else { + // Has DST + minHours := janHours + maxHours := julHours + if julHours < janHours { + minHours = julHours + maxHours = janHours + } + + minStr := fmt.Sprintf("%+g", minHours) + maxStr := fmt.Sprintf("%+g", maxHours) + if minHours == float64(int(minHours)) { + minStr = fmt.Sprintf("%+d", int(minHours)) + } + if maxHours == float64(int(maxHours)) { + maxStr = fmt.Sprintf("%+d", int(maxHours)) + } + actualOffset = fmt.Sprintf("UTC%s/%s", minStr, maxStr) + } + + if actualOffset != tt.wantOffset { + t.Errorf("TimeZone(%s) offset = %s; want %s", tt.siteCode, actualOffset, tt.wantOffset) + } + } + }) + } +} + +func TestTimeZone_CaseSensitivity(t *testing.T) { + testCases := []string{"US", "us", "Us", "uS"} + expectedTZ := "America/New_York" + + for _, tc := range testCases { + got, ok := TimeZone(tc) + if !ok || got != expectedTZ { + t.Errorf("TimeZone(%s) = %s, %v; want %s, true", tc, got, ok, expectedTZ) + } + } +} + +func TestTimeZone_AllValidTimezones(t *testing.T) { + // This test ensures all timezones in siteZones are valid IANA timezone identifiers + for code, tz := range siteZones { + _, err := time.LoadLocation(tz) + if err != nil { + t.Errorf("Invalid timezone for site code %s: %s - %v", code, tz, err) + } + } +}