// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/i18n/timezone.h" #include #include #include "base/memory/singleton.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "third_party/icu/source/i18n/unicode/timezone.h" namespace base { namespace { class TimezoneMap { public: static TimezoneMap* GetInstance() { return Singleton::get(); } std::string CountryCodeForTimezone(const std::string& olson_code) { std::map::iterator iter = map_.find(olson_code.c_str()); if (iter != map_.end()) return iter->second; return std::string(); } private: TimezoneMap() { // These mappings are adapted from zone.tab, which is available at // and is a part of public // domain. struct OlsonCodeData { const char* country_code; const char* olson_code; }; static const OlsonCodeData olson_code_data[] = { { "AD", "Europe/Andorra" }, { "AE", "Asia/Dubai" }, { "AF", "Asia/Kabul" }, { "AG", "America/Antigua" }, { "AI", "America/Anguilla" }, { "AL", "Europe/Tirane" }, { "AM", "Asia/Yerevan" }, { "AO", "Africa/Luanda" }, { "AQ", "Antarctica/McMurdo" }, { "AQ", "Antarctica/Rothera" }, { "AQ", "Antarctica/Palmer" }, { "AQ", "Antarctica/Mawson" }, { "AQ", "Antarctica/Davis" }, { "AQ", "Antarctica/Casey" }, { "AQ", "Antarctica/Vostok" }, { "AQ", "Antarctica/DumontDUrville" }, { "AQ", "Antarctica/Syowa" }, { "AR", "America/Argentina/Buenos_Aires" }, { "AR", "America/Argentina/Cordoba" }, { "AR", "America/Argentina/Salta" }, { "AR", "America/Argentina/Jujuy" }, { "AR", "America/Argentina/Tucuman" }, { "AR", "America/Argentina/Catamarca" }, { "AR", "America/Argentina/La_Rioja" }, { "AR", "America/Argentina/San_Juan" }, { "AR", "America/Argentina/Mendoza" }, { "AR", "America/Argentina/San_Luis" }, { "AR", "America/Argentina/Rio_Gallegos" }, { "AR", "America/Argentina/Ushuaia" }, { "AS", "Pacific/Pago_Pago" }, { "AT", "Europe/Vienna" }, { "AU", "Australia/Lord_Howe" }, { "AU", "Antarctica/Macquarie" }, { "AU", "Australia/Hobart" }, { "AU", "Australia/Currie" }, { "AU", "Australia/Melbourne" }, { "AU", "Australia/Sydney" }, { "AU", "Australia/Broken_Hill" }, { "AU", "Australia/Brisbane" }, { "AU", "Australia/Lindeman" }, { "AU", "Australia/Adelaide" }, { "AU", "Australia/Darwin" }, { "AU", "Australia/Perth" }, { "AU", "Australia/Eucla" }, { "AW", "America/Aruba" }, { "AX", "Europe/Mariehamn" }, { "AZ", "Asia/Baku" }, { "BA", "Europe/Sarajevo" }, { "BB", "America/Barbados" }, { "BD", "Asia/Dhaka" }, { "BE", "Europe/Brussels" }, { "BF", "Africa/Ouagadougou" }, { "BG", "Europe/Sofia" }, { "BH", "Asia/Bahrain" }, { "BI", "Africa/Bujumbura" }, { "BJ", "Africa/Porto-Novo" }, { "BL", "America/St_Barthelemy" }, { "BM", "Atlantic/Bermuda" }, { "BN", "Asia/Brunei" }, { "BO", "America/La_Paz" }, { "BQ", "America/Kralendijk" }, { "BR", "America/Noronha" }, { "BR", "America/Belem" }, { "BR", "America/Fortaleza" }, { "BR", "America/Recife" }, { "BR", "America/Araguaina" }, { "BR", "America/Maceio" }, { "BR", "America/Bahia" }, { "BR", "America/Sao_Paulo" }, { "BR", "America/Campo_Grande" }, { "BR", "America/Cuiaba" }, { "BR", "America/Santarem" }, { "BR", "America/Porto_Velho" }, { "BR", "America/Boa_Vista" }, { "BR", "America/Manaus" }, { "BR", "America/Eirunepe" }, { "BR", "America/Rio_Branco" }, { "BS", "America/Nassau" }, { "BT", "Asia/Thimphu" }, { "BW", "Africa/Gaborone" }, { "BY", "Europe/Minsk" }, { "BZ", "America/Belize" }, { "CA", "America/St_Johns" }, { "CA", "America/Halifax" }, { "CA", "America/Glace_Bay" }, { "CA", "America/Moncton" }, { "CA", "America/Goose_Bay" }, { "CA", "America/Blanc-Sablon" }, { "CA", "America/Toronto" }, { "CA", "America/Nipigon" }, { "CA", "America/Thunder_Bay" }, { "CA", "America/Iqaluit" }, { "CA", "America/Pangnirtung" }, { "CA", "America/Resolute" }, { "CA", "America/Atikokan" }, { "CA", "America/Rankin_Inlet" }, { "CA", "America/Winnipeg" }, { "CA", "America/Rainy_River" }, { "CA", "America/Regina" }, { "CA", "America/Swift_Current" }, { "CA", "America/Edmonton" }, { "CA", "America/Cambridge_Bay" }, { "CA", "America/Yellowknife" }, { "CA", "America/Inuvik" }, { "CA", "America/Creston" }, { "CA", "America/Dawson_Creek" }, { "CA", "America/Vancouver" }, { "CA", "America/Whitehorse" }, { "CA", "America/Dawson" }, { "CC", "Indian/Cocos" }, { "CD", "Africa/Kinshasa" }, { "CD", "Africa/Lubumbashi" }, { "CF", "Africa/Bangui" }, { "CG", "Africa/Brazzaville" }, { "CH", "Europe/Zurich" }, { "CI", "Africa/Abidjan" }, { "CK", "Pacific/Rarotonga" }, { "CL", "America/Santiago" }, { "CL", "Pacific/Easter" }, { "CM", "Africa/Douala" }, { "CN", "Asia/Shanghai" }, { "CN", "Asia/Harbin" }, { "CN", "Asia/Chongqing" }, { "CN", "Asia/Urumqi" }, { "CN", "Asia/Kashgar" }, { "CO", "America/Bogota" }, { "CR", "America/Costa_Rica" }, { "CU", "America/Havana" }, { "CV", "Atlantic/Cape_Verde" }, { "CW", "America/Curacao" }, { "CX", "Indian/Christmas" }, { "CY", "Asia/Nicosia" }, { "CZ", "Europe/Prague" }, { "DE", "Europe/Berlin" }, { "DE", "Europe/Busingen" }, { "DJ", "Africa/Djibouti" }, { "DK", "Europe/Copenhagen" }, { "DM", "America/Dominica" }, { "DO", "America/Santo_Domingo" }, { "DZ", "Africa/Algiers" }, { "EC", "America/Guayaquil" }, { "EC", "Pacific/Galapagos" }, { "EE", "Europe/Tallinn" }, { "EG", "Africa/Cairo" }, { "EH", "Africa/El_Aaiun" }, { "ER", "Africa/Asmara" }, { "ES", "Europe/Madrid" }, { "ES", "Africa/Ceuta" }, { "ES", "Atlantic/Canary" }, { "ET", "Africa/Addis_Ababa" }, { "FI", "Europe/Helsinki" }, { "FJ", "Pacific/Fiji" }, { "FK", "Atlantic/Stanley" }, { "FM", "Pacific/Chuuk" }, { "FM", "Pacific/Pohnpei" }, { "FM", "Pacific/Kosrae" }, { "FO", "Atlantic/Faroe" }, { "FR", "Europe/Paris" }, { "GA", "Africa/Libreville" }, { "GB", "Europe/London" }, { "GD", "America/Grenada" }, { "GE", "Asia/Tbilisi" }, { "GF", "America/Cayenne" }, { "GG", "Europe/Guernsey" }, { "GH", "Africa/Accra" }, { "GI", "Europe/Gibraltar" }, { "GL", "America/Godthab" }, { "GL", "America/Danmarkshavn" }, { "GL", "America/Scoresbysund" }, { "GL", "America/Thule" }, { "GM", "Africa/Banjul" }, { "GN", "Africa/Conakry" }, { "GP", "America/Guadeloupe" }, { "GQ", "Africa/Malabo" }, { "GR", "Europe/Athens" }, { "GS", "Atlantic/South_Georgia" }, { "GT", "America/Guatemala" }, { "GU", "Pacific/Guam" }, { "GW", "Africa/Bissau" }, { "GY", "America/Guyana" }, { "HK", "Asia/Hong_Kong" }, { "HN", "America/Tegucigalpa" }, { "HR", "Europe/Zagreb" }, { "HT", "America/Port-au-Prince" }, { "HU", "Europe/Budapest" }, { "ID", "Asia/Jakarta" }, { "ID", "Asia/Pontianak" }, { "ID", "Asia/Makassar" }, { "ID", "Asia/Jayapura" }, { "IE", "Europe/Dublin" }, { "IL", "Asia/Jerusalem" }, { "IM", "Europe/Isle_of_Man" }, { "IN", "Asia/Kolkata" }, { "IO", "Indian/Chagos" }, { "IQ", "Asia/Baghdad" }, { "IR", "Asia/Tehran" }, { "IS", "Atlantic/Reykjavik" }, { "IT", "Europe/Rome" }, { "JE", "Europe/Jersey" }, { "JM", "America/Jamaica" }, { "JO", "Asia/Amman" }, { "JP", "Asia/Tokyo" }, { "KE", "Africa/Nairobi" }, { "KG", "Asia/Bishkek" }, { "KH", "Asia/Phnom_Penh" }, { "KI", "Pacific/Tarawa" }, { "KI", "Pacific/Enderbury" }, { "KI", "Pacific/Kiritimati" }, { "KM", "Indian/Comoro" }, { "KN", "America/St_Kitts" }, { "KP", "Asia/Pyongyang" }, { "KR", "Asia/Seoul" }, { "KW", "Asia/Kuwait" }, { "KY", "America/Cayman" }, { "KZ", "Asia/Almaty" }, { "KZ", "Asia/Qyzylorda" }, { "KZ", "Asia/Aqtobe" }, { "KZ", "Asia/Aqtau" }, { "KZ", "Asia/Oral" }, { "LA", "Asia/Vientiane" }, { "LB", "Asia/Beirut" }, { "LC", "America/St_Lucia" }, { "LI", "Europe/Vaduz" }, { "LK", "Asia/Colombo" }, { "LR", "Africa/Monrovia" }, { "LS", "Africa/Maseru" }, { "LT", "Europe/Vilnius" }, { "LU", "Europe/Luxembourg" }, { "LV", "Europe/Riga" }, { "LY", "Africa/Tripoli" }, { "MA", "Africa/Casablanca" }, { "MC", "Europe/Monaco" }, { "MD", "Europe/Chisinau" }, { "ME", "Europe/Podgorica" }, { "MF", "America/Marigot" }, { "MG", "Indian/Antananarivo" }, { "MH", "Pacific/Majuro" }, { "MH", "Pacific/Kwajalein" }, { "MK", "Europe/Skopje" }, { "ML", "Africa/Bamako" }, { "MM", "Asia/Rangoon" }, { "MN", "Asia/Ulaanbaatar" }, { "MN", "Asia/Hovd" }, { "MN", "Asia/Choibalsan" }, { "MO", "Asia/Macau" }, { "MP", "Pacific/Saipan" }, { "MQ", "America/Martinique" }, { "MR", "Africa/Nouakchott" }, { "MS", "America/Montserrat" }, { "MT", "Europe/Malta" }, { "MU", "Indian/Mauritius" }, { "MV", "Indian/Maldives" }, { "MW", "Africa/Blantyre" }, { "MX", "America/Mexico_City" }, { "MX", "America/Cancun" }, { "MX", "America/Merida" }, { "MX", "America/Monterrey" }, { "MX", "America/Matamoros" }, { "MX", "America/Mazatlan" }, { "MX", "America/Chihuahua" }, { "MX", "America/Ojinaga" }, { "MX", "America/Hermosillo" }, { "MX", "America/Tijuana" }, { "MX", "America/Santa_Isabel" }, { "MX", "America/Bahia_Banderas" }, { "MY", "Asia/Kuala_Lumpur" }, { "MY", "Asia/Kuching" }, { "MZ", "Africa/Maputo" }, { "NA", "Africa/Windhoek" }, { "NC", "Pacific/Noumea" }, { "NE", "Africa/Niamey" }, { "NF", "Pacific/Norfolk" }, { "NG", "Africa/Lagos" }, { "NI", "America/Managua" }, { "NL", "Europe/Amsterdam" }, { "NO", "Europe/Oslo" }, { "NP", "Asia/Kathmandu" }, { "NR", "Pacific/Nauru" }, { "NU", "Pacific/Niue" }, { "NZ", "Pacific/Auckland" }, { "NZ", "Pacific/Chatham" }, { "OM", "Asia/Muscat" }, { "PA", "America/Panama" }, { "PE", "America/Lima" }, { "PF", "Pacific/Tahiti" }, { "PF", "Pacific/Marquesas" }, { "PF", "Pacific/Gambier" }, { "PG", "Pacific/Port_Moresby" }, { "PH", "Asia/Manila" }, { "PK", "Asia/Karachi" }, { "PL", "Europe/Warsaw" }, { "PM", "America/Miquelon" }, { "PN", "Pacific/Pitcairn" }, { "PR", "America/Puerto_Rico" }, { "PS", "Asia/Gaza" }, { "PS", "Asia/Hebron" }, { "PT", "Europe/Lisbon" }, { "PT", "Atlantic/Madeira" }, { "PT", "Atlantic/Azores" }, { "PW", "Pacific/Palau" }, { "PY", "America/Asuncion" }, { "QA", "Asia/Qatar" }, { "RE", "Indian/Reunion" }, { "RO", "Europe/Bucharest" }, { "RS", "Europe/Belgrade" }, { "RU", "Europe/Kaliningrad" }, { "RU", "Europe/Moscow" }, { "RU", "Europe/Volgograd" }, { "RU", "Europe/Samara" }, { "RU", "Asia/Yekaterinburg" }, { "RU", "Asia/Omsk" }, { "RU", "Asia/Novosibirsk" }, { "RU", "Asia/Novokuznetsk" }, { "RU", "Asia/Krasnoyarsk" }, { "RU", "Asia/Irkutsk" }, { "RU", "Asia/Yakutsk" }, { "RU", "Asia/Khandyga" }, { "RU", "Asia/Vladivostok" }, { "RU", "Asia/Sakhalin" }, { "RU", "Asia/Ust-Nera" }, { "RU", "Asia/Magadan" }, { "RU", "Asia/Kamchatka" }, { "RU", "Asia/Anadyr" }, { "RW", "Africa/Kigali" }, { "SA", "Asia/Riyadh" }, { "SB", "Pacific/Guadalcanal" }, { "SC", "Indian/Mahe" }, { "SD", "Africa/Khartoum" }, { "SE", "Europe/Stockholm" }, { "SG", "Asia/Singapore" }, { "SH", "Atlantic/St_Helena" }, { "SI", "Europe/Ljubljana" }, { "SJ", "Arctic/Longyearbyen" }, { "SK", "Europe/Bratislava" }, { "SL", "Africa/Freetown" }, { "SM", "Europe/San_Marino" }, { "SN", "Africa/Dakar" }, { "SO", "Africa/Mogadishu" }, { "SR", "America/Paramaribo" }, { "SS", "Africa/Juba" }, { "ST", "Africa/Sao_Tome" }, { "SV", "America/El_Salvador" }, { "SX", "America/Lower_Princes" }, { "SY", "Asia/Damascus" }, { "SZ", "Africa/Mbabane" }, { "TC", "America/Grand_Turk" }, { "TD", "Africa/Ndjamena" }, { "TF", "Indian/Kerguelen" }, { "TG", "Africa/Lome" }, { "TH", "Asia/Bangkok" }, { "TJ", "Asia/Dushanbe" }, { "TK", "Pacific/Fakaofo" }, { "TL", "Asia/Dili" }, { "TM", "Asia/Ashgabat" }, { "TN", "Africa/Tunis" }, { "TO", "Pacific/Tongatapu" }, { "TR", "Europe/Istanbul" }, { "TT", "America/Port_of_Spain" }, { "TV", "Pacific/Funafuti" }, { "TW", "Asia/Taipei" }, { "TZ", "Africa/Dar_es_Salaam" }, { "UA", "Europe/Kiev" }, { "UA", "Europe/Uzhgorod" }, { "UA", "Europe/Zaporozhye" }, { "UA", "Europe/Simferopol" }, { "UG", "Africa/Kampala" }, { "UM", "Pacific/Johnston" }, { "UM", "Pacific/Midway" }, { "UM", "Pacific/Wake" }, { "US", "America/New_York" }, { "US", "America/Detroit" }, { "US", "America/Kentucky/Louisville" }, { "US", "America/Kentucky/Monticello" }, { "US", "America/Indiana/Indianapolis" }, { "US", "America/Indiana/Vincennes" }, { "US", "America/Indiana/Winamac" }, { "US", "America/Indiana/Marengo" }, { "US", "America/Indiana/Petersburg" }, { "US", "America/Indiana/Vevay" }, { "US", "America/Chicago" }, { "US", "America/Indiana/Tell_City" }, { "US", "America/Indiana/Knox" }, { "US", "America/Menominee" }, { "US", "America/North_Dakota/Center" }, { "US", "America/North_Dakota/New_Salem" }, { "US", "America/North_Dakota/Beulah" }, { "US", "America/Denver" }, { "US", "America/Boise" }, { "US", "America/Phoenix" }, { "US", "America/Los_Angeles" }, { "US", "America/Anchorage" }, { "US", "America/Juneau" }, { "US", "America/Sitka" }, { "US", "America/Yakutat" }, { "US", "America/Nome" }, { "US", "America/Adak" }, { "US", "America/Metlakatla" }, { "US", "Pacific/Honolulu" }, { "UY", "America/Montevideo" }, { "UZ", "Asia/Samarkand" }, { "UZ", "Asia/Tashkent" }, { "VA", "Europe/Vatican" }, { "VC", "America/St_Vincent" }, { "VE", "America/Caracas" }, { "VG", "America/Tortola" }, { "VI", "America/St_Thomas" }, { "VN", "Asia/Ho_Chi_Minh" }, { "VU", "Pacific/Efate" }, { "WF", "Pacific/Wallis" }, { "WS", "Pacific/Apia" }, { "YE", "Asia/Aden" }, { "YT", "Indian/Mayotte" }, { "ZA", "Africa/Johannesburg" }, { "ZM", "Africa/Lusaka" }, { "ZW", "Africa/Harare" }, // The mappings below are custom additions to zone.tab. { "GB", "Etc/GMT" }, { "GB", "Etc/UTC" }, { "GB", "Etc/UCT" }, }; for (size_t i = 0; i < arraysize(olson_code_data); ++i) map_[olson_code_data[i].olson_code] = olson_code_data[i].country_code; // These are mapping from old codenames to new codenames. They are also // part of public domain, and available at // . struct LinkData { const char* old_code; const char* new_code; }; static const LinkData link_data[] = { { "Africa/Asmera", "Africa/Asmara" }, { "Africa/Timbuktu", "Africa/Bamako" }, { "America/Argentina/ComodRivadavia", "America/Argentina/Catamarca" }, { "America/Atka", "America/Adak" }, { "America/Buenos_Aires", "America/Argentina/Buenos_Aires" }, { "America/Catamarca", "America/Argentina/Catamarca" }, { "America/Coral_Harbour", "America/Atikokan" }, { "America/Cordoba", "America/Argentina/Cordoba" }, { "America/Ensenada", "America/Tijuana" }, { "America/Fort_Wayne", "America/Indiana/Indianapolis" }, { "America/Indianapolis", "America/Indiana/Indianapolis" }, { "America/Jujuy", "America/Argentina/Jujuy" }, { "America/Knox_IN", "America/Indiana/Knox" }, { "America/Louisville", "America/Kentucky/Louisville" }, { "America/Mendoza", "America/Argentina/Mendoza" }, { "America/Porto_Acre", "America/Rio_Branco" }, { "America/Rosario", "America/Argentina/Cordoba" }, { "America/Virgin", "America/St_Thomas" }, { "Asia/Ashkhabad", "Asia/Ashgabat" }, { "Asia/Chungking", "Asia/Chongqing" }, { "Asia/Dacca", "Asia/Dhaka" }, { "Asia/Katmandu", "Asia/Kathmandu" }, { "Asia/Calcutta", "Asia/Kolkata" }, { "Asia/Macao", "Asia/Macau" }, { "Asia/Tel_Aviv", "Asia/Jerusalem" }, { "Asia/Saigon", "Asia/Ho_Chi_Minh" }, { "Asia/Thimbu", "Asia/Thimphu" }, { "Asia/Ujung_Pandang", "Asia/Makassar" }, { "Asia/Ulan_Bator", "Asia/Ulaanbaatar" }, { "Atlantic/Faeroe", "Atlantic/Faroe" }, { "Atlantic/Jan_Mayen", "Europe/Oslo" }, { "Australia/ACT", "Australia/Sydney" }, { "Australia/Canberra", "Australia/Sydney" }, { "Australia/LHI", "Australia/Lord_Howe" }, { "Australia/NSW", "Australia/Sydney" }, { "Australia/North", "Australia/Darwin" }, { "Australia/Queensland", "Australia/Brisbane" }, { "Australia/South", "Australia/Adelaide" }, { "Australia/Tasmania", "Australia/Hobart" }, { "Australia/Victoria", "Australia/Melbourne" }, { "Australia/West", "Australia/Perth" }, { "Australia/Yancowinna", "Australia/Broken_Hill" }, { "Brazil/Acre", "America/Rio_Branco" }, { "Brazil/DeNoronha", "America/Noronha" }, { "Brazil/East", "America/Sao_Paulo" }, { "Brazil/West", "America/Manaus" }, { "Canada/Atlantic", "America/Halifax" }, { "Canada/Central", "America/Winnipeg" }, { "Canada/East-Saskatchewan", "America/Regina" }, { "Canada/Eastern", "America/Toronto" }, { "Canada/Mountain", "America/Edmonton" }, { "Canada/Newfoundland", "America/St_Johns" }, { "Canada/Pacific", "America/Vancouver" }, { "Canada/Saskatchewan", "America/Regina" }, { "Canada/Yukon", "America/Whitehorse" }, { "Chile/Continental", "America/Santiago" }, { "Chile/EasterIsland", "Pacific/Easter" }, { "Cuba", "America/Havana" }, { "Egypt", "Africa/Cairo" }, { "Eire", "Europe/Dublin" }, { "Europe/Belfast", "Europe/London" }, { "Europe/Tiraspol", "Europe/Chisinau" }, { "GB", "Europe/London" }, { "GB-Eire", "Europe/London" }, { "GMT+0", "Etc/GMT" }, { "GMT-0", "Etc/GMT" }, { "GMT0", "Etc/GMT" }, { "Greenwich", "Etc/GMT" }, { "Hongkong", "Asia/Hong_Kong" }, { "Iceland", "Atlantic/Reykjavik" }, { "Iran", "Asia/Tehran" }, { "Israel", "Asia/Jerusalem" }, { "Jamaica", "America/Jamaica" }, { "Japan", "Asia/Tokyo" }, { "Kwajalein", "Pacific/Kwajalein" }, { "Libya", "Africa/Tripoli" }, { "Mexico/BajaNorte", "America/Tijuana" }, { "Mexico/BajaSur", "America/Mazatlan" }, { "Mexico/General", "America/Mexico_City" }, { "NZ", "Pacific/Auckland" }, { "NZ-CHAT", "Pacific/Chatham" }, { "Navajo", "America/Denver" }, { "PRC", "Asia/Shanghai" }, { "Pacific/Samoa", "Pacific/Pago_Pago" }, { "Pacific/Yap", "Pacific/Chuuk" }, { "Pacific/Truk", "Pacific/Chuuk" }, { "Pacific/Ponape", "Pacific/Pohnpei" }, { "Poland", "Europe/Warsaw" }, { "Portugal", "Europe/Lisbon" }, { "ROC", "Asia/Taipei" }, { "ROK", "Asia/Seoul" }, { "Singapore", "Asia/Singapore" }, { "Turkey", "Europe/Istanbul" }, { "UCT", "Etc/UCT" }, { "US/Alaska", "America/Anchorage" }, { "US/Aleutian", "America/Adak" }, { "US/Arizona", "America/Phoenix" }, { "US/Central", "America/Chicago" }, { "US/East-Indiana", "America/Indiana/Indianapolis" }, { "US/Eastern", "America/New_York" }, { "US/Hawaii", "Pacific/Honolulu" }, { "US/Indiana-Starke", "America/Indiana/Knox" }, { "US/Michigan", "America/Detroit" }, { "US/Mountain", "America/Denver" }, { "US/Pacific", "America/Los_Angeles" }, { "US/Samoa", "Pacific/Pago_Pago" }, { "UTC", "Etc/UTC" }, { "Universal", "Etc/UTC" }, { "W-SU", "Europe/Moscow" }, { "Zulu", "Etc/UTC" }, }; for (size_t i = 0; i < arraysize(link_data); ++i) map_[link_data[i].old_code] = map_[link_data[i].new_code]; } friend struct DefaultSingletonTraits; struct CompareCStrings { bool operator()(const char* str1, const char* str2) const { return strcmp(str1, str2) < 0; } }; std::map map_; DISALLOW_COPY_AND_ASSIGN(TimezoneMap); }; } // namespace std::string CountryCodeForCurrentTimezone() { scoped_ptr zone(icu::TimeZone::createDefault()); icu::UnicodeString id; zone->getID(id); string16 olson_code(id.getBuffer(), id.length()); return TimezoneMap::GetInstance()->CountryCodeForTimezone( UTF16ToUTF8(olson_code)); } } // namespace base