3 namespace Sabre\VObject;
6 * Time zone name translation
8 * This file translates well-known time zone names into "Olson database" time zone names.
10 * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved.
11 * @author Frank Edelhaeuser (fedel@users.sourceforge.net)
12 * @author Evert Pot (http://www.rooftopsolutions.nl/)
13 * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
17 public static $map = array(
19 // from http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
20 // snapshot taken on 2012/01/16
23 'AUS Central Standard Time'=>'Australia/Darwin',
24 'AUS Eastern Standard Time'=>'Australia/Sydney',
25 'Afghanistan Standard Time'=>'Asia/Kabul',
26 'Alaskan Standard Time'=>'America/Anchorage',
27 'Arab Standard Time'=>'Asia/Riyadh',
28 'Arabian Standard Time'=>'Asia/Dubai',
29 'Arabic Standard Time'=>'Asia/Baghdad',
30 'Argentina Standard Time'=>'America/Buenos_Aires',
31 'Armenian Standard Time'=>'Asia/Yerevan',
32 'Atlantic Standard Time'=>'America/Halifax',
33 'Azerbaijan Standard Time'=>'Asia/Baku',
34 'Azores Standard Time'=>'Atlantic/Azores',
35 'Bangladesh Standard Time'=>'Asia/Dhaka',
36 'Canada Central Standard Time'=>'America/Regina',
37 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde',
38 'Caucasus Standard Time'=>'Asia/Yerevan',
39 'Cen. Australia Standard Time'=>'Australia/Adelaide',
40 'Central America Standard Time'=>'America/Guatemala',
41 'Central Asia Standard Time'=>'Asia/Almaty',
42 'Central Brazilian Standard Time'=>'America/Cuiaba',
43 'Central Europe Standard Time'=>'Europe/Budapest',
44 'Central European Standard Time'=>'Europe/Warsaw',
45 'Central Pacific Standard Time'=>'Pacific/Guadalcanal',
46 'Central Standard Time'=>'America/Chicago',
47 'Central Standard Time (Mexico)'=>'America/Mexico_City',
48 'China Standard Time'=>'Asia/Shanghai',
49 'Dateline Standard Time'=>'Etc/GMT+12',
50 'E. Africa Standard Time'=>'Africa/Nairobi',
51 'E. Australia Standard Time'=>'Australia/Brisbane',
52 'E. Europe Standard Time'=>'Europe/Minsk',
53 'E. South America Standard Time'=>'America/Sao_Paulo',
54 'Eastern Standard Time'=>'America/New_York',
55 'Egypt Standard Time'=>'Africa/Cairo',
56 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg',
57 'FLE Standard Time'=>'Europe/Kiev',
58 'Fiji Standard Time'=>'Pacific/Fiji',
59 'GMT Standard Time'=>'Europe/London',
60 'GTB Standard Time'=>'Europe/Istanbul',
61 'Georgian Standard Time'=>'Asia/Tbilisi',
62 'Greenland Standard Time'=>'America/Godthab',
63 'Greenwich Standard Time'=>'Atlantic/Reykjavik',
64 'Hawaiian Standard Time'=>'Pacific/Honolulu',
65 'India Standard Time'=>'Asia/Calcutta',
66 'Iran Standard Time'=>'Asia/Tehran',
67 'Israel Standard Time'=>'Asia/Jerusalem',
68 'Jordan Standard Time'=>'Asia/Amman',
69 'Kamchatka Standard Time'=>'Asia/Kamchatka',
70 'Korea Standard Time'=>'Asia/Seoul',
71 'Magadan Standard Time'=>'Asia/Magadan',
72 'Mauritius Standard Time'=>'Indian/Mauritius',
73 'Mexico Standard Time'=>'America/Mexico_City',
74 'Mexico Standard Time 2'=>'America/Chihuahua',
75 'Mid-Atlantic Standard Time'=>'Etc/GMT+2',
76 'Middle East Standard Time'=>'Asia/Beirut',
77 'Montevideo Standard Time'=>'America/Montevideo',
78 'Morocco Standard Time'=>'Africa/Casablanca',
79 'Mountain Standard Time'=>'America/Denver',
80 'Mountain Standard Time (Mexico)'=>'America/Chihuahua',
81 'Myanmar Standard Time'=>'Asia/Rangoon',
82 'N. Central Asia Standard Time'=>'Asia/Novosibirsk',
83 'Namibia Standard Time'=>'Africa/Windhoek',
84 'Nepal Standard Time'=>'Asia/Katmandu',
85 'New Zealand Standard Time'=>'Pacific/Auckland',
86 'Newfoundland Standard Time'=>'America/St_Johns',
87 'North Asia East Standard Time'=>'Asia/Irkutsk',
88 'North Asia Standard Time'=>'Asia/Krasnoyarsk',
89 'Pacific SA Standard Time'=>'America/Santiago',
90 'Pacific Standard Time'=>'America/Los_Angeles',
91 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel',
92 'Pakistan Standard Time'=>'Asia/Karachi',
93 'Paraguay Standard Time'=>'America/Asuncion',
94 'Romance Standard Time'=>'Europe/Paris',
95 'Russian Standard Time'=>'Europe/Moscow',
96 'SA Eastern Standard Time'=>'America/Cayenne',
97 'SA Pacific Standard Time'=>'America/Bogota',
98 'SA Western Standard Time'=>'America/La_Paz',
99 'SE Asia Standard Time'=>'Asia/Bangkok',
100 'Samoa Standard Time'=>'Pacific/Apia',
101 'Singapore Standard Time'=>'Asia/Singapore',
102 'South Africa Standard Time'=>'Africa/Johannesburg',
103 'Sri Lanka Standard Time'=>'Asia/Colombo',
104 'Syria Standard Time'=>'Asia/Damascus',
105 'Taipei Standard Time'=>'Asia/Taipei',
106 'Tasmania Standard Time'=>'Australia/Hobart',
107 'Tokyo Standard Time'=>'Asia/Tokyo',
108 'Tonga Standard Time'=>'Pacific/Tongatapu',
109 'US Eastern Standard Time'=>'America/Indianapolis',
110 'US Mountain Standard Time'=>'America/Phoenix',
112 'UTC+12'=>'Etc/GMT-12',
113 'UTC-02'=>'Etc/GMT+2',
114 'UTC-11'=>'Etc/GMT+11',
115 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar',
116 'Venezuela Standard Time'=>'America/Caracas',
117 'Vladivostok Standard Time'=>'Asia/Vladivostok',
118 'W. Australia Standard Time'=>'Australia/Perth',
119 'W. Central Africa Standard Time'=>'Africa/Lagos',
120 'W. Europe Standard Time'=>'Europe/Berlin',
121 'West Asia Standard Time'=>'Asia/Tashkent',
122 'West Pacific Standard Time'=>'Pacific/Port_Moresby',
123 'Yakutsk Standard Time'=>'Asia/Yakutsk',
125 // Microsoft exchange timezones
127 // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx
129 // Correct timezones deduced with help from:
130 // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
131 'Universal Coordinated Time' => 'UTC',
132 'Casablanca, Monrovia' => 'Africa/Casablanca',
133 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon',
134 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London',
135 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin',
136 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague',
137 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris',
138 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris',
139 'Prague, Central Europe' => 'Europe/Prague',
140 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo',
141 'West Central Africa' => 'Africa/Luanda', // This was a best guess
142 'Athens, Istanbul, Minsk' => 'Europe/Athens',
143 'Bucharest' => 'Europe/Bucharest',
144 'Cairo' => 'Africa/Cairo',
145 'Harare, Pretoria' => 'Africa/Harare',
146 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki',
147 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem',
148 'Baghdad' => 'Asia/Baghdad',
149 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait',
150 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow',
151 'East Africa, Nairobi' => 'Africa/Nairobi',
152 'Tehran' => 'Asia/Tehran',
153 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess
154 'Baku, Tbilisi, Yerevan' => 'Asia/Baku',
155 'Kabul' => 'Asia/Kabul',
156 'Ekaterinburg' => 'Asia/Yekaterinburg',
157 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi',
158 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta',
159 'Kathmandu, Nepal' => 'Asia/Kathmandu',
160 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty',
161 'Astana, Dhaka' => 'Asia/Dhaka',
162 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo',
163 'Rangoon' => 'Asia/Rangoon',
164 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok',
165 'Krasnoyarsk' => 'Asia/Krasnoyarsk',
166 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai',
167 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk',
168 'Kuala Lumpur, Singapore' => 'Asia/Singapore',
169 'Perth, Western Australia' => 'Australia/Perth',
170 'Taipei' => 'Asia/Taipei',
171 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo',
172 'Seoul, Korea Standard time' => 'Asia/Seoul',
173 'Yakutsk' => 'Asia/Yakutsk',
174 'Adelaide, Central Australia' => 'Australia/Adelaide',
175 'Darwin' => 'Australia/Darwin',
176 'Brisbane, East Australia' => 'Australia/Brisbane',
177 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney',
178 'Guam, Port Moresby' => 'Pacific/Guam',
179 'Hobart, Tasmania' => 'Australia/Hobart',
180 'Vladivostok' => 'Asia/Vladivostok',
181 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan',
182 'Auckland, Wellington' => 'Pacific/Auckland',
183 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji',
184 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu',
185 'Azores' => 'Atlantic/Azores',
186 'Cape Verde Is.' => 'Atlantic/Cape_Verde',
187 'Mid-Atlantic' => 'America/Noronha',
188 'Brasilia' => 'America/Sao_Paulo', // Best guess
189 'Buenos Aires' => 'America/Argentina/Buenos_Aires',
190 'Greenland' => 'America/Godthab',
191 'Newfoundland' => 'America/St_Johns',
192 'Atlantic Time (Canada)' => 'America/Halifax',
193 'Caracas, La Paz' => 'America/Caracas',
194 'Santiago' => 'America/Santiago',
195 'Bogota, Lima, Quito' => 'America/Bogota',
196 'Eastern Time (US & Canada)' => 'America/New_York',
197 'Indiana (East)' => 'America/Indiana/Indianapolis',
198 'Central America' => 'America/Guatemala',
199 'Central Time (US & Canada)' => 'America/Chicago',
200 'Mexico City, Tegucigalpa' => 'America/Mexico_City',
201 'Saskatchewan' => 'America/Edmonton',
202 'Arizona' => 'America/Phoenix',
203 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess
204 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess
205 'Alaska' => 'America/Anchorage',
206 'Hawaii' => 'Pacific/Honolulu',
207 'Midway Island, Samoa' => 'Pacific/Midway',
208 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein',
212 public static $microsoftExchangeMap = array(
214 31 => 'Africa/Casablanca',
215 2 => 'Europe/Lisbon',
216 1 => 'Europe/London',
217 4 => 'Europe/Berlin',
218 6 => 'Europe/Prague',
220 69 => 'Africa/Luanda', // This was a best guess
221 7 => 'Europe/Athens',
222 5 => 'Europe/Bucharest',
223 49 => 'Africa/Cairo',
224 50 => 'Africa/Harare',
225 59 => 'Europe/Helsinki',
226 27 => 'Asia/Jerusalem',
227 26 => 'Asia/Baghdad',
229 51 => 'Europe/Moscow',
230 56 => 'Africa/Nairobi',
232 24 => 'Asia/Muscat', // Best guess
235 58 => 'Asia/Yekaterinburg',
236 47 => 'Asia/Karachi',
237 23 => 'Asia/Calcutta',
238 62 => 'Asia/Kathmandu',
241 66 => 'Asia/Colombo',
242 61 => 'Asia/Rangoon',
243 22 => 'Asia/Bangkok',
244 64 => 'Asia/Krasnoyarsk',
245 45 => 'Asia/Shanghai',
246 63 => 'Asia/Irkutsk',
247 21 => 'Asia/Singapore',
248 73 => 'Australia/Perth',
252 70 => 'Asia/Yakutsk',
253 19 => 'Australia/Adelaide',
254 44 => 'Australia/Darwin',
255 18 => 'Australia/Brisbane',
256 76 => 'Australia/Sydney',
257 43 => 'Pacific/Guam',
258 42 => 'Australia/Hobart',
259 68 => 'Asia/Vladivostok',
260 41 => 'Asia/Magadan',
261 17 => 'Pacific/Auckland',
262 40 => 'Pacific/Fiji',
263 67 => 'Pacific/Tongatapu',
264 29 => 'Atlantic/Azores',
265 53 => 'Atlantic/Cape_Verde',
266 30 => 'America/Noronha',
267 8 => 'America/Sao_Paulo', // Best guess
268 32 => 'America/Argentina/Buenos_Aires',
269 69 => 'America/Godthab',
270 28 => 'America/St_Johns',
271 9 => 'America/Halifax',
272 33 => 'America/Caracas',
273 65 => 'America/Santiago',
274 35 => 'America/Bogota',
275 10 => 'America/New_York',
276 34 => 'America/Indiana/Indianapolis',
277 55 => 'America/Guatemala',
278 11 => 'America/Chicago',
279 37 => 'America/Mexico_City',
280 36 => 'America/Edmonton',
281 38 => 'America/Phoenix',
282 12 => 'America/Denver', // Best guess
283 13 => 'America/Los_Angeles', // Best guess
284 14 => 'America/Anchorage',
285 15 => 'Pacific/Honolulu',
286 16 => 'Pacific/Midway',
287 39 => 'Pacific/Kwajalein',
291 * This method will try to find out the correct timezone for an iCalendar
294 * You must pass the contents of the TZID parameter, as well as the full
297 * If the lookup fails, this method will return UTC.
299 * @param string $tzid
300 * @param Sabre\VObject\Component $vcalendar
301 * @return DateTimeZone
303 static public function getTimeZone($tzid, Component $vcalendar = null) {
305 // First we will just see if the tzid is a support timezone identifier.
307 return new \DateTimeZone($tzid);
308 } catch (\Exception $e) {
311 // Next, we check if the tzid is somewhere in our tzid map.
312 if (isset(self::$map[$tzid])) {
313 return new \DateTimeZone(self::$map[$tzid]);
318 // If that didn't work, we will scan VTIMEZONE objects
319 foreach($vcalendar->select('VTIMEZONE') as $vtimezone) {
321 if ((string)$vtimezone->TZID === $tzid) {
323 // Some clients add 'X-LIC-LOCATION' with the olson name.
324 if (isset($vtimezone->{'X-LIC-LOCATION'})) {
326 return new \DateTimeZone($vtimezone->{'X-LIC-LOCATION'});
327 } catch (\Exception $e) {
331 // Microsoft may add a magic number, which we also have an
333 if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) {
334 if (isset(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value])) {
335 return new \DateTimeZone(self::$microsoftExchangeMap[(int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value]);
344 // If we got all the way here, we default to UTC.
345 return new \DateTimeZone(date_default_timezone_get());