]> git.mxchange.org Git - friendica-addons.git/blob - dav/sabre-vobject/lib/Sabre/VObject/TimeZoneUtil.php
Second part of refactoring; should be runnable again, yet not thoroughly tested
[friendica-addons.git] / dav / sabre-vobject / lib / Sabre / VObject / TimeZoneUtil.php
1 <?php
2
3 namespace Sabre\VObject;
4
5 /**
6  * Time zone name translation
7  *
8  * This file translates well-known time zone names into "Olson database" time zone names.
9  *
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
14  */
15 class TimeZoneUtil {
16
17     public static $map = array(
18
19         // from http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
20         // snapshot taken on 2012/01/16
21
22         // windows
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',
111         'UTC'=>'Etc/GMT',
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',
124
125         // Microsoft exchange timezones
126         // Source:
127         // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx
128         //
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',
209
210     );
211
212     public static $microsoftExchangeMap = array(
213         0  => 'UTC',
214         31 => 'Africa/Casablanca',
215         2  => 'Europe/Lisbon',
216         1  => 'Europe/London',
217         4  => 'Europe/Berlin',
218         6  => 'Europe/Prague',
219         3  => 'Europe/Paris',
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',
228         74 => 'Asia/Kuwait',
229         51 => 'Europe/Moscow',
230         56 => 'Africa/Nairobi',
231         25 => 'Asia/Tehran',
232         24 => 'Asia/Muscat', // Best guess
233         54 => 'Asia/Baku',
234         48 => 'Asia/Kabul',
235         58 => 'Asia/Yekaterinburg',
236         47 => 'Asia/Karachi',
237         23 => 'Asia/Calcutta',
238         62 => 'Asia/Kathmandu',
239         46 => 'Asia/Almaty',
240         71 => 'Asia/Dhaka',
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',
249         75 => 'Asia/Taipei',
250         20 => 'Asia/Tokyo',
251         72 => 'Asia/Seoul',
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',
288     );
289
290     /**
291      * This method will try to find out the correct timezone for an iCalendar
292      * date-time value.
293      *
294      * You must pass the contents of the TZID parameter, as well as the full
295      * calendar.
296      *
297      * If the lookup fails, this method will return UTC.
298      *
299      * @param string $tzid
300      * @param Sabre\VObject\Component $vcalendar
301      * @return DateTimeZone
302      */
303     static public function getTimeZone($tzid, Component $vcalendar = null) {
304
305         // First we will just see if the tzid is a support timezone identifier.
306         try {
307             return new \DateTimeZone($tzid);
308         } catch (\Exception $e) {
309         }
310
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]);
314         }
315
316         if ($vcalendar) {
317
318             // If that didn't work, we will scan VTIMEZONE objects
319             foreach($vcalendar->select('VTIMEZONE') as $vtimezone) {
320
321                 if ((string)$vtimezone->TZID === $tzid) {
322
323                     // Some clients add 'X-LIC-LOCATION' with the olson name.
324                     if (isset($vtimezone->{'X-LIC-LOCATION'})) {
325                         try {
326                             return new \DateTimeZone($vtimezone->{'X-LIC-LOCATION'});
327                         } catch (\Exception $e) {
328                         }
329
330                     }
331                     // Microsoft may add a magic number, which we also have an
332                     // answer for.
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]);
336                         }
337                     }
338                 }
339
340             }
341
342         }
343
344         // If we got all the way here, we default to UTC.
345         return new \DateTimeZone(date_default_timezone_get());
346
347
348     }
349
350
351 }