OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/i18n/timezone.h" | |
6 | |
7 #include <map> | |
8 | |
9 #include "base/memory/singleton.h" | |
10 #include "base/strings/string16.h" | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "third_party/icu/source/i18n/unicode/timezone.h" | |
13 | |
14 namespace base { | |
15 | |
16 namespace { | |
17 | |
18 class TimezoneMap { | |
19 public: | |
20 static TimezoneMap* GetInstance() { | |
21 return Singleton<TimezoneMap>::get(); | |
22 } | |
23 | |
24 std::string CountryCodeForTimezone(const std::string& olson_code) { | |
25 std::map<std::string, std::string>::iterator iter = map_.find(olson_code); | |
26 if (iter != map_.end()) | |
27 return iter->second; | |
28 | |
29 return std::string(); | |
30 } | |
31 | |
32 private: | |
33 TimezoneMap() { | |
34 // These mappings are adapted from zone.tab, which is available at | |
35 // <http://www.ietf.org/timezones/data/zone.tab> and is a part of public | |
36 // domain. | |
37 struct OlsonCodeData { | |
38 std::string country_code; | |
39 std::string olson_code; | |
40 } olson_code_data[] = { | |
41 { "AD", "Europe/Andorra" }, | |
42 { "AE", "Asia/Dubai" }, | |
43 { "AF", "Asia/Kabul" }, | |
44 { "AG", "America/Antigua" }, | |
45 { "AI", "America/Anguilla" }, | |
46 { "AL", "Europe/Tirane" }, | |
47 { "AM", "Asia/Yerevan" }, | |
48 { "AO", "Africa/Luanda" }, | |
49 { "AQ", "Antarctica/McMurdo" }, | |
50 { "AQ", "Antarctica/Rothera" }, | |
51 { "AQ", "Antarctica/Palmer" }, | |
52 { "AQ", "Antarctica/Mawson" }, | |
53 { "AQ", "Antarctica/Davis" }, | |
54 { "AQ", "Antarctica/Casey" }, | |
55 { "AQ", "Antarctica/Vostok" }, | |
56 { "AQ", "Antarctica/DumontDUrville" }, | |
57 { "AQ", "Antarctica/Syowa" }, | |
58 { "AR", "America/Argentina/Buenos_Aires" }, | |
59 { "AR", "America/Argentina/Cordoba" }, | |
60 { "AR", "America/Argentina/Salta" }, | |
61 { "AR", "America/Argentina/Jujuy" }, | |
62 { "AR", "America/Argentina/Tucuman" }, | |
63 { "AR", "America/Argentina/Catamarca" }, | |
64 { "AR", "America/Argentina/La_Rioja" }, | |
65 { "AR", "America/Argentina/San_Juan" }, | |
66 { "AR", "America/Argentina/Mendoza" }, | |
67 { "AR", "America/Argentina/San_Luis" }, | |
68 { "AR", "America/Argentina/Rio_Gallegos" }, | |
69 { "AR", "America/Argentina/Ushuaia" }, | |
70 { "AS", "Pacific/Pago_Pago" }, | |
71 { "AT", "Europe/Vienna" }, | |
72 { "AU", "Australia/Lord_Howe" }, | |
73 { "AU", "Antarctica/Macquarie" }, | |
74 { "AU", "Australia/Hobart" }, | |
75 { "AU", "Australia/Currie" }, | |
76 { "AU", "Australia/Melbourne" }, | |
77 { "AU", "Australia/Sydney" }, | |
78 { "AU", "Australia/Broken_Hill" }, | |
79 { "AU", "Australia/Brisbane" }, | |
80 { "AU", "Australia/Lindeman" }, | |
81 { "AU", "Australia/Adelaide" }, | |
82 { "AU", "Australia/Darwin" }, | |
83 { "AU", "Australia/Perth" }, | |
84 { "AU", "Australia/Eucla" }, | |
85 { "AW", "America/Aruba" }, | |
86 { "AX", "Europe/Mariehamn" }, | |
87 { "AZ", "Asia/Baku" }, | |
88 { "BA", "Europe/Sarajevo" }, | |
89 { "BB", "America/Barbados" }, | |
90 { "BD", "Asia/Dhaka" }, | |
91 { "BE", "Europe/Brussels" }, | |
92 { "BF", "Africa/Ouagadougou" }, | |
93 { "BG", "Europe/Sofia" }, | |
94 { "BH", "Asia/Bahrain" }, | |
95 { "BI", "Africa/Bujumbura" }, | |
96 { "BJ", "Africa/Porto-Novo" }, | |
97 { "BL", "America/St_Barthelemy" }, | |
98 { "BM", "Atlantic/Bermuda" }, | |
99 { "BN", "Asia/Brunei" }, | |
100 { "BO", "America/La_Paz" }, | |
101 { "BQ", "America/Kralendijk" }, | |
102 { "BR", "America/Noronha" }, | |
103 { "BR", "America/Belem" }, | |
104 { "BR", "America/Fortaleza" }, | |
105 { "BR", "America/Recife" }, | |
106 { "BR", "America/Araguaina" }, | |
107 { "BR", "America/Maceio" }, | |
108 { "BR", "America/Bahia" }, | |
109 { "BR", "America/Sao_Paulo" }, | |
110 { "BR", "America/Campo_Grande" }, | |
111 { "BR", "America/Cuiaba" }, | |
112 { "BR", "America/Santarem" }, | |
113 { "BR", "America/Porto_Velho" }, | |
114 { "BR", "America/Boa_Vista" }, | |
115 { "BR", "America/Manaus" }, | |
116 { "BR", "America/Eirunepe" }, | |
117 { "BR", "America/Rio_Branco" }, | |
118 { "BS", "America/Nassau" }, | |
119 { "BT", "Asia/Thimphu" }, | |
120 { "BW", "Africa/Gaborone" }, | |
121 { "BY", "Europe/Minsk" }, | |
122 { "BZ", "America/Belize" }, | |
123 { "CA", "America/St_Johns" }, | |
124 { "CA", "America/Halifax" }, | |
125 { "CA", "America/Glace_Bay" }, | |
126 { "CA", "America/Moncton" }, | |
127 { "CA", "America/Goose_Bay" }, | |
128 { "CA", "America/Blanc-Sablon" }, | |
129 { "CA", "America/Toronto" }, | |
130 { "CA", "America/Nipigon" }, | |
131 { "CA", "America/Thunder_Bay" }, | |
132 { "CA", "America/Iqaluit" }, | |
133 { "CA", "America/Pangnirtung" }, | |
134 { "CA", "America/Resolute" }, | |
135 { "CA", "America/Atikokan" }, | |
136 { "CA", "America/Rankin_Inlet" }, | |
137 { "CA", "America/Winnipeg" }, | |
138 { "CA", "America/Rainy_River" }, | |
139 { "CA", "America/Regina" }, | |
140 { "CA", "America/Swift_Current" }, | |
141 { "CA", "America/Edmonton" }, | |
142 { "CA", "America/Cambridge_Bay" }, | |
143 { "CA", "America/Yellowknife" }, | |
144 { "CA", "America/Inuvik" }, | |
145 { "CA", "America/Creston" }, | |
146 { "CA", "America/Dawson_Creek" }, | |
147 { "CA", "America/Vancouver" }, | |
148 { "CA", "America/Whitehorse" }, | |
149 { "CA", "America/Dawson" }, | |
150 { "CC", "Indian/Cocos" }, | |
151 { "CD", "Africa/Kinshasa" }, | |
152 { "CD", "Africa/Lubumbashi" }, | |
153 { "CF", "Africa/Bangui" }, | |
154 { "CG", "Africa/Brazzaville" }, | |
155 { "CH", "Europe/Zurich" }, | |
156 { "CI", "Africa/Abidjan" }, | |
157 { "CK", "Pacific/Rarotonga" }, | |
158 { "CL", "America/Santiago" }, | |
159 { "CL", "Pacific/Easter" }, | |
160 { "CM", "Africa/Douala" }, | |
161 { "CN", "Asia/Shanghai" }, | |
162 { "CN", "Asia/Harbin" }, | |
163 { "CN", "Asia/Chongqing" }, | |
164 { "CN", "Asia/Urumqi" }, | |
165 { "CN", "Asia/Kashgar" }, | |
166 { "CO", "America/Bogota" }, | |
167 { "CR", "America/Costa_Rica" }, | |
168 { "CU", "America/Havana" }, | |
169 { "CV", "Atlantic/Cape_Verde" }, | |
170 { "CW", "America/Curacao" }, | |
171 { "CX", "Indian/Christmas" }, | |
172 { "CY", "Asia/Nicosia" }, | |
173 { "CZ", "Europe/Prague" }, | |
174 { "DE", "Europe/Berlin" }, | |
175 { "DE", "Europe/Busingen" }, | |
176 { "DJ", "Africa/Djibouti" }, | |
177 { "DK", "Europe/Copenhagen" }, | |
178 { "DM", "America/Dominica" }, | |
179 { "DO", "America/Santo_Domingo" }, | |
180 { "DZ", "Africa/Algiers" }, | |
181 { "EC", "America/Guayaquil" }, | |
182 { "EC", "Pacific/Galapagos" }, | |
183 { "EE", "Europe/Tallinn" }, | |
184 { "EG", "Africa/Cairo" }, | |
185 { "EH", "Africa/El_Aaiun" }, | |
186 { "ER", "Africa/Asmara" }, | |
187 { "ES", "Europe/Madrid" }, | |
188 { "ES", "Africa/Ceuta" }, | |
189 { "ES", "Atlantic/Canary" }, | |
190 { "ET", "Africa/Addis_Ababa" }, | |
191 { "FI", "Europe/Helsinki" }, | |
192 { "FJ", "Pacific/Fiji" }, | |
193 { "FK", "Atlantic/Stanley" }, | |
194 { "FM", "Pacific/Chuuk" }, | |
195 { "FM", "Pacific/Pohnpei" }, | |
196 { "FM", "Pacific/Kosrae" }, | |
197 { "FO", "Atlantic/Faroe" }, | |
198 { "FR", "Europe/Paris" }, | |
199 { "GA", "Africa/Libreville" }, | |
200 { "GB", "Europe/London" }, | |
201 { "GD", "America/Grenada" }, | |
202 { "GE", "Asia/Tbilisi" }, | |
203 { "GF", "America/Cayenne" }, | |
204 { "GG", "Europe/Guernsey" }, | |
205 { "GH", "Africa/Accra" }, | |
206 { "GI", "Europe/Gibraltar" }, | |
207 { "GL", "America/Godthab" }, | |
208 { "GL", "America/Danmarkshavn" }, | |
209 { "GL", "America/Scoresbysund" }, | |
210 { "GL", "America/Thule" }, | |
211 { "GM", "Africa/Banjul" }, | |
212 { "GN", "Africa/Conakry" }, | |
213 { "GP", "America/Guadeloupe" }, | |
214 { "GQ", "Africa/Malabo" }, | |
215 { "GR", "Europe/Athens" }, | |
216 { "GS", "Atlantic/South_Georgia" }, | |
217 { "GT", "America/Guatemala" }, | |
218 { "GU", "Pacific/Guam" }, | |
219 { "GW", "Africa/Bissau" }, | |
220 { "GY", "America/Guyana" }, | |
221 { "HK", "Asia/Hong_Kong" }, | |
222 { "HN", "America/Tegucigalpa" }, | |
223 { "HR", "Europe/Zagreb" }, | |
224 { "HT", "America/Port-au-Prince" }, | |
225 { "HU", "Europe/Budapest" }, | |
226 { "ID", "Asia/Jakarta" }, | |
227 { "ID", "Asia/Pontianak" }, | |
228 { "ID", "Asia/Makassar" }, | |
229 { "ID", "Asia/Jayapura" }, | |
230 { "IE", "Europe/Dublin" }, | |
231 { "IL", "Asia/Jerusalem" }, | |
232 { "IM", "Europe/Isle_of_Man" }, | |
233 { "IN", "Asia/Kolkata" }, | |
234 { "IO", "Indian/Chagos" }, | |
235 { "IQ", "Asia/Baghdad" }, | |
236 { "IR", "Asia/Tehran" }, | |
237 { "IS", "Atlantic/Reykjavik" }, | |
238 { "IT", "Europe/Rome" }, | |
239 { "JE", "Europe/Jersey" }, | |
240 { "JM", "America/Jamaica" }, | |
241 { "JO", "Asia/Amman" }, | |
242 { "JP", "Asia/Tokyo" }, | |
243 { "KE", "Africa/Nairobi" }, | |
244 { "KG", "Asia/Bishkek" }, | |
245 { "KH", "Asia/Phnom_Penh" }, | |
246 { "KI", "Pacific/Tarawa" }, | |
247 { "KI", "Pacific/Enderbury" }, | |
248 { "KI", "Pacific/Kiritimati" }, | |
249 { "KM", "Indian/Comoro" }, | |
250 { "KN", "America/St_Kitts" }, | |
251 { "KP", "Asia/Pyongyang" }, | |
252 { "KR", "Asia/Seoul" }, | |
253 { "KW", "Asia/Kuwait" }, | |
254 { "KY", "America/Cayman" }, | |
255 { "KZ", "Asia/Almaty" }, | |
256 { "KZ", "Asia/Qyzylorda" }, | |
257 { "KZ", "Asia/Aqtobe" }, | |
258 { "KZ", "Asia/Aqtau" }, | |
259 { "KZ", "Asia/Oral" }, | |
260 { "LA", "Asia/Vientiane" }, | |
261 { "LB", "Asia/Beirut" }, | |
262 { "LC", "America/St_Lucia" }, | |
263 { "LI", "Europe/Vaduz" }, | |
264 { "LK", "Asia/Colombo" }, | |
265 { "LR", "Africa/Monrovia" }, | |
266 { "LS", "Africa/Maseru" }, | |
267 { "LT", "Europe/Vilnius" }, | |
268 { "LU", "Europe/Luxembourg" }, | |
269 { "LV", "Europe/Riga" }, | |
270 { "LY", "Africa/Tripoli" }, | |
271 { "MA", "Africa/Casablanca" }, | |
272 { "MC", "Europe/Monaco" }, | |
273 { "MD", "Europe/Chisinau" }, | |
274 { "ME", "Europe/Podgorica" }, | |
275 { "MF", "America/Marigot" }, | |
276 { "MG", "Indian/Antananarivo" }, | |
277 { "MH", "Pacific/Majuro" }, | |
278 { "MH", "Pacific/Kwajalein" }, | |
279 { "MK", "Europe/Skopje" }, | |
280 { "ML", "Africa/Bamako" }, | |
281 { "MM", "Asia/Rangoon" }, | |
282 { "MN", "Asia/Ulaanbaatar" }, | |
283 { "MN", "Asia/Hovd" }, | |
284 { "MN", "Asia/Choibalsan" }, | |
285 { "MO", "Asia/Macau" }, | |
286 { "MP", "Pacific/Saipan" }, | |
287 { "MQ", "America/Martinique" }, | |
288 { "MR", "Africa/Nouakchott" }, | |
289 { "MS", "America/Montserrat" }, | |
290 { "MT", "Europe/Malta" }, | |
291 { "MU", "Indian/Mauritius" }, | |
292 { "MV", "Indian/Maldives" }, | |
293 { "MW", "Africa/Blantyre" }, | |
294 { "MX", "America/Mexico_City" }, | |
295 { "MX", "America/Cancun" }, | |
296 { "MX", "America/Merida" }, | |
297 { "MX", "America/Monterrey" }, | |
298 { "MX", "America/Matamoros" }, | |
299 { "MX", "America/Mazatlan" }, | |
300 { "MX", "America/Chihuahua" }, | |
301 { "MX", "America/Ojinaga" }, | |
302 { "MX", "America/Hermosillo" }, | |
303 { "MX", "America/Tijuana" }, | |
304 { "MX", "America/Santa_Isabel" }, | |
305 { "MX", "America/Bahia_Banderas" }, | |
306 { "MY", "Asia/Kuala_Lumpur" }, | |
307 { "MY", "Asia/Kuching" }, | |
308 { "MZ", "Africa/Maputo" }, | |
309 { "NA", "Africa/Windhoek" }, | |
310 { "NC", "Pacific/Noumea" }, | |
311 { "NE", "Africa/Niamey" }, | |
312 { "NF", "Pacific/Norfolk" }, | |
313 { "NG", "Africa/Lagos" }, | |
314 { "NI", "America/Managua" }, | |
315 { "NL", "Europe/Amsterdam" }, | |
316 { "NO", "Europe/Oslo" }, | |
317 { "NP", "Asia/Kathmandu" }, | |
318 { "NR", "Pacific/Nauru" }, | |
319 { "NU", "Pacific/Niue" }, | |
320 { "NZ", "Pacific/Auckland" }, | |
321 { "NZ", "Pacific/Chatham" }, | |
322 { "OM", "Asia/Muscat" }, | |
323 { "PA", "America/Panama" }, | |
324 { "PE", "America/Lima" }, | |
325 { "PF", "Pacific/Tahiti" }, | |
326 { "PF", "Pacific/Marquesas" }, | |
327 { "PF", "Pacific/Gambier" }, | |
328 { "PG", "Pacific/Port_Moresby" }, | |
329 { "PH", "Asia/Manila" }, | |
330 { "PK", "Asia/Karachi" }, | |
331 { "PL", "Europe/Warsaw" }, | |
332 { "PM", "America/Miquelon" }, | |
333 { "PN", "Pacific/Pitcairn" }, | |
334 { "PR", "America/Puerto_Rico" }, | |
335 { "PS", "Asia/Gaza" }, | |
336 { "PS", "Asia/Hebron" }, | |
337 { "PT", "Europe/Lisbon" }, | |
338 { "PT", "Atlantic/Madeira" }, | |
339 { "PT", "Atlantic/Azores" }, | |
340 { "PW", "Pacific/Palau" }, | |
341 { "PY", "America/Asuncion" }, | |
342 { "QA", "Asia/Qatar" }, | |
343 { "RE", "Indian/Reunion" }, | |
344 { "RO", "Europe/Bucharest" }, | |
345 { "RS", "Europe/Belgrade" }, | |
346 { "RU", "Europe/Kaliningrad" }, | |
347 { "RU", "Europe/Moscow" }, | |
348 { "RU", "Europe/Volgograd" }, | |
349 { "RU", "Europe/Samara" }, | |
350 { "RU", "Asia/Yekaterinburg" }, | |
351 { "RU", "Asia/Omsk" }, | |
352 { "RU", "Asia/Novosibirsk" }, | |
353 { "RU", "Asia/Novokuznetsk" }, | |
354 { "RU", "Asia/Krasnoyarsk" }, | |
355 { "RU", "Asia/Irkutsk" }, | |
356 { "RU", "Asia/Yakutsk" }, | |
357 { "RU", "Asia/Khandyga" }, | |
358 { "RU", "Asia/Vladivostok" }, | |
359 { "RU", "Asia/Sakhalin" }, | |
360 { "RU", "Asia/Ust-Nera" }, | |
361 { "RU", "Asia/Magadan" }, | |
362 { "RU", "Asia/Kamchatka" }, | |
363 { "RU", "Asia/Anadyr" }, | |
364 { "RW", "Africa/Kigali" }, | |
365 { "SA", "Asia/Riyadh" }, | |
366 { "SB", "Pacific/Guadalcanal" }, | |
367 { "SC", "Indian/Mahe" }, | |
368 { "SD", "Africa/Khartoum" }, | |
369 { "SE", "Europe/Stockholm" }, | |
370 { "SG", "Asia/Singapore" }, | |
371 { "SH", "Atlantic/St_Helena" }, | |
372 { "SI", "Europe/Ljubljana" }, | |
373 { "SJ", "Arctic/Longyearbyen" }, | |
374 { "SK", "Europe/Bratislava" }, | |
375 { "SL", "Africa/Freetown" }, | |
376 { "SM", "Europe/San_Marino" }, | |
377 { "SN", "Africa/Dakar" }, | |
378 { "SO", "Africa/Mogadishu" }, | |
379 { "SR", "America/Paramaribo" }, | |
380 { "SS", "Africa/Juba" }, | |
381 { "ST", "Africa/Sao_Tome" }, | |
382 { "SV", "America/El_Salvador" }, | |
383 { "SX", "America/Lower_Princes" }, | |
384 { "SY", "Asia/Damascus" }, | |
385 { "SZ", "Africa/Mbabane" }, | |
386 { "TC", "America/Grand_Turk" }, | |
387 { "TD", "Africa/Ndjamena" }, | |
388 { "TF", "Indian/Kerguelen" }, | |
389 { "TG", "Africa/Lome" }, | |
390 { "TH", "Asia/Bangkok" }, | |
391 { "TJ", "Asia/Dushanbe" }, | |
392 { "TK", "Pacific/Fakaofo" }, | |
393 { "TL", "Asia/Dili" }, | |
394 { "TM", "Asia/Ashgabat" }, | |
395 { "TN", "Africa/Tunis" }, | |
396 { "TO", "Pacific/Tongatapu" }, | |
397 { "TR", "Europe/Istanbul" }, | |
398 { "TT", "America/Port_of_Spain" }, | |
399 { "TV", "Pacific/Funafuti" }, | |
400 { "TW", "Asia/Taipei" }, | |
401 { "TZ", "Africa/Dar_es_Salaam" }, | |
402 { "UA", "Europe/Kiev" }, | |
403 { "UA", "Europe/Uzhgorod" }, | |
404 { "UA", "Europe/Zaporozhye" }, | |
405 { "UA", "Europe/Simferopol" }, | |
406 { "UG", "Africa/Kampala" }, | |
407 { "UM", "Pacific/Johnston" }, | |
408 { "UM", "Pacific/Midway" }, | |
409 { "UM", "Pacific/Wake" }, | |
410 { "US", "America/New_York" }, | |
411 { "US", "America/Detroit" }, | |
412 { "US", "America/Kentucky/Louisville" }, | |
413 { "US", "America/Kentucky/Monticello" }, | |
414 { "US", "America/Indiana/Indianapolis" }, | |
415 { "US", "America/Indiana/Vincennes" }, | |
416 { "US", "America/Indiana/Winamac" }, | |
417 { "US", "America/Indiana/Marengo" }, | |
418 { "US", "America/Indiana/Petersburg" }, | |
419 { "US", "America/Indiana/Vevay" }, | |
420 { "US", "America/Chicago" }, | |
421 { "US", "America/Indiana/Tell_City" }, | |
422 { "US", "America/Indiana/Knox" }, | |
423 { "US", "America/Menominee" }, | |
424 { "US", "America/North_Dakota/Center" }, | |
425 { "US", "America/North_Dakota/New_Salem" }, | |
426 { "US", "America/North_Dakota/Beulah" }, | |
427 { "US", "America/Denver" }, | |
428 { "US", "America/Boise" }, | |
429 { "US", "America/Phoenix" }, | |
430 { "US", "America/Los_Angeles" }, | |
431 { "US", "America/Anchorage" }, | |
432 { "US", "America/Juneau" }, | |
433 { "US", "America/Sitka" }, | |
434 { "US", "America/Yakutat" }, | |
435 { "US", "America/Nome" }, | |
436 { "US", "America/Adak" }, | |
437 { "US", "America/Metlakatla" }, | |
438 { "US", "Pacific/Honolulu" }, | |
439 { "UY", "America/Montevideo" }, | |
440 { "UZ", "Asia/Samarkand" }, | |
441 { "UZ", "Asia/Tashkent" }, | |
442 { "VA", "Europe/Vatican" }, | |
443 { "VC", "America/St_Vincent" }, | |
444 { "VE", "America/Caracas" }, | |
445 { "VG", "America/Tortola" }, | |
446 { "VI", "America/St_Thomas" }, | |
447 { "VN", "Asia/Ho_Chi_Minh" }, | |
448 { "VU", "Pacific/Efate" }, | |
449 { "WF", "Pacific/Wallis" }, | |
450 { "WS", "Pacific/Apia" }, | |
451 { "YE", "Asia/Aden" }, | |
452 { "YT", "Indian/Mayotte" }, | |
453 { "ZA", "Africa/Johannesburg" }, | |
454 { "ZM", "Africa/Lusaka" }, | |
455 { "ZW", "Africa/Harare" }, | |
456 // The mappings below are custom additions to zone.tab. | |
457 { "GB", "Etc/GMT" }, | |
458 { "GB", "Etc/UTC" }, | |
459 { "GB", "Etc/UCT" }, | |
460 }; | |
461 | |
462 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(olson_code_data); ++i) { | |
463 map_[olson_code_data[i].olson_code] = olson_code_data[i].country_code; | |
464 } | |
465 | |
466 // These are mapping from old codenames to new codenames. They are also | |
467 // part of public domain, and available at | |
468 // <http://www.ietf.org/timezones/data/backward>. | |
469 struct LinkData { | |
470 std::string old_code; | |
471 std::string new_code; | |
472 } link_data[] = { | |
473 { "Africa/Asmera", "Africa/Asmara" }, | |
474 { "Africa/Timbuktu", "Africa/Bamako" }, | |
475 { "America/Argentina/ComodRivadavia", "America/Argentina/Catamarca" }, | |
476 { "America/Atka", "America/Adak" }, | |
477 { "America/Buenos_Aires", "America/Argentina/Buenos_Aires" }, | |
478 { "America/Catamarca", "America/Argentina/Catamarca" }, | |
479 { "America/Coral_Harbour", "America/Atikokan" }, | |
480 { "America/Cordoba", "America/Argentina/Cordoba" }, | |
481 { "America/Ensenada", "America/Tijuana" }, | |
482 { "America/Fort_Wayne", "America/Indiana/Indianapolis" }, | |
483 { "America/Indianapolis", "America/Indiana/Indianapolis" }, | |
484 { "America/Jujuy", "America/Argentina/Jujuy" }, | |
485 { "America/Knox_IN", "America/Indiana/Knox" }, | |
486 { "America/Louisville", "America/Kentucky/Louisville" }, | |
487 { "America/Mendoza", "America/Argentina/Mendoza" }, | |
488 { "America/Porto_Acre", "America/Rio_Branco" }, | |
489 { "America/Rosario", "America/Argentina/Cordoba" }, | |
490 { "America/Virgin", "America/St_Thomas" }, | |
491 { "Asia/Ashkhabad", "Asia/Ashgabat" }, | |
492 { "Asia/Chungking", "Asia/Chongqing" }, | |
493 { "Asia/Dacca", "Asia/Dhaka" }, | |
494 { "Asia/Katmandu", "Asia/Kathmandu" }, | |
495 { "Asia/Calcutta", "Asia/Kolkata" }, | |
496 { "Asia/Macao", "Asia/Macau" }, | |
497 { "Asia/Tel_Aviv", "Asia/Jerusalem" }, | |
498 { "Asia/Saigon", "Asia/Ho_Chi_Minh" }, | |
499 { "Asia/Thimbu", "Asia/Thimphu" }, | |
500 { "Asia/Ujung_Pandang", "Asia/Makassar" }, | |
501 { "Asia/Ulan_Bator", "Asia/Ulaanbaatar" }, | |
502 { "Atlantic/Faeroe", "Atlantic/Faroe" }, | |
503 { "Atlantic/Jan_Mayen", "Europe/Oslo" }, | |
504 { "Australia/ACT", "Australia/Sydney" }, | |
505 { "Australia/Canberra", "Australia/Sydney" }, | |
506 { "Australia/LHI", "Australia/Lord_Howe" }, | |
507 { "Australia/NSW", "Australia/Sydney" }, | |
508 { "Australia/North", "Australia/Darwin" }, | |
509 { "Australia/Queensland", "Australia/Brisbane" }, | |
510 { "Australia/South", "Australia/Adelaide" }, | |
511 { "Australia/Tasmania", "Australia/Hobart" }, | |
512 { "Australia/Victoria", "Australia/Melbourne" }, | |
513 { "Australia/West", "Australia/Perth" }, | |
514 { "Australia/Yancowinna", "Australia/Broken_Hill" }, | |
515 { "Brazil/Acre", "America/Rio_Branco" }, | |
516 { "Brazil/DeNoronha", "America/Noronha" }, | |
517 { "Brazil/East", "America/Sao_Paulo" }, | |
518 { "Brazil/West", "America/Manaus" }, | |
519 { "Canada/Atlantic", "America/Halifax" }, | |
520 { "Canada/Central", "America/Winnipeg" }, | |
521 { "Canada/East-Saskatchewan", "America/Regina" }, | |
522 { "Canada/Eastern", "America/Toronto" }, | |
523 { "Canada/Mountain", "America/Edmonton" }, | |
524 { "Canada/Newfoundland", "America/St_Johns" }, | |
525 { "Canada/Pacific", "America/Vancouver" }, | |
526 { "Canada/Saskatchewan", "America/Regina" }, | |
527 { "Canada/Yukon", "America/Whitehorse" }, | |
528 { "Chile/Continental", "America/Santiago" }, | |
529 { "Chile/EasterIsland", "Pacific/Easter" }, | |
530 { "Cuba", "America/Havana" }, | |
531 { "Egypt", "Africa/Cairo" }, | |
532 { "Eire", "Europe/Dublin" }, | |
533 { "Europe/Belfast", "Europe/London" }, | |
534 { "Europe/Tiraspol", "Europe/Chisinau" }, | |
535 { "GB", "Europe/London" }, | |
536 { "GB-Eire", "Europe/London" }, | |
537 { "GMT+0", "Etc/GMT" }, | |
538 { "GMT-0", "Etc/GMT" }, | |
539 { "GMT0", "Etc/GMT" }, | |
540 { "Greenwich", "Etc/GMT" }, | |
541 { "Hongkong", "Asia/Hong_Kong" }, | |
542 { "Iceland", "Atlantic/Reykjavik" }, | |
543 { "Iran", "Asia/Tehran" }, | |
544 { "Israel", "Asia/Jerusalem" }, | |
545 { "Jamaica", "America/Jamaica" }, | |
546 { "Japan", "Asia/Tokyo" }, | |
547 { "Kwajalein", "Pacific/Kwajalein" }, | |
548 { "Libya", "Africa/Tripoli" }, | |
549 { "Mexico/BajaNorte", "America/Tijuana" }, | |
550 { "Mexico/BajaSur", "America/Mazatlan" }, | |
551 { "Mexico/General", "America/Mexico_City" }, | |
552 { "NZ", "Pacific/Auckland" }, | |
553 { "NZ-CHAT", "Pacific/Chatham" }, | |
554 { "Navajo", "America/Denver" }, | |
555 { "PRC", "Asia/Shanghai" }, | |
556 { "Pacific/Samoa", "Pacific/Pago_Pago" }, | |
557 { "Pacific/Yap", "Pacific/Chuuk" }, | |
558 { "Pacific/Truk", "Pacific/Chuuk" }, | |
559 { "Pacific/Ponape", "Pacific/Pohnpei" }, | |
560 { "Poland", "Europe/Warsaw" }, | |
561 { "Portugal", "Europe/Lisbon" }, | |
562 { "ROC", "Asia/Taipei" }, | |
563 { "ROK", "Asia/Seoul" }, | |
564 { "Singapore", "Asia/Singapore" }, | |
565 { "Turkey", "Europe/Istanbul" }, | |
566 { "UCT", "Etc/UCT" }, | |
567 { "US/Alaska", "America/Anchorage" }, | |
568 { "US/Aleutian", "America/Adak" }, | |
569 { "US/Arizona", "America/Phoenix" }, | |
570 { "US/Central", "America/Chicago" }, | |
571 { "US/East-Indiana", "America/Indiana/Indianapolis" }, | |
572 { "US/Eastern", "America/New_York" }, | |
573 { "US/Hawaii", "Pacific/Honolulu" }, | |
574 { "US/Indiana-Starke", "America/Indiana/Knox" }, | |
575 { "US/Michigan", "America/Detroit" }, | |
576 { "US/Mountain", "America/Denver" }, | |
577 { "US/Pacific", "America/Los_Angeles" }, | |
578 { "US/Samoa", "Pacific/Pago_Pago" }, | |
579 { "UTC", "Etc/UTC" }, | |
580 { "Universal", "Etc/UTC" }, | |
581 { "W-SU", "Europe/Moscow" }, | |
582 { "Zulu", "Etc/UTC" }, | |
583 }; | |
584 | |
585 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(link_data); ++i) { | |
586 map_[link_data[i].old_code] = map_[link_data[i].new_code]; | |
587 } | |
588 } | |
589 | |
590 friend struct DefaultSingletonTraits<TimezoneMap>; | |
591 | |
592 std::map<std::string, std::string> map_; | |
593 | |
594 DISALLOW_COPY_AND_ASSIGN(TimezoneMap); | |
595 }; | |
596 | |
597 } // namespace | |
598 | |
599 std::string CountryForCurrentTimezone() { | |
600 scoped_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault()); | |
601 icu::UnicodeString id; | |
602 zone->getID(id); | |
603 string16 olson_code(id.getBuffer(), id.length()); | |
jungshik at Google
2013/10/28 21:01:19
BTW, you can use UnicodeString::toUTF8String. ( ht
Evan Stade
2013/10/28 22:08:42
done, thanks for the pointer.
| |
604 return TimezoneMap::GetInstance()->CountryCodeForTimezone( | |
605 UTF16ToUTF8(olson_code)); | |
606 } | |
607 | |
608 } // namespace base | |
OLD | NEW |