source: trunk/zpush/lib/utils/timezoneutil.php @ 7589

Revision 7589, 61.9 KB checked in by douglas, 11 years ago (diff)

Ticket #3209 - Integrar módulo de sincronização Z-push ao Expresso

Line 
1<?php
2/***********************************************
3* File      :   timezoneutil.php
4* Project   :   Z-Push
5* Descr     :   class to generate AS compatible timezone information
6*
7* Created   :   01.06.2012
8*
9* Copyright 2007 - 2012 Zarafa Deutschland GmbH
10*
11* This program is free software: you can redistribute it and/or modify
12* it under the terms of the GNU Affero General Public License, version 3,
13* as published by the Free Software Foundation with the following additional
14* term according to sec. 7:
15*
16* According to sec. 7 of the GNU Affero General Public License, version 3,
17* the terms of the AGPL are supplemented with the following terms:
18*
19* "Zarafa" is a registered trademark of Zarafa B.V.
20* "Z-Push" is a registered trademark of Zarafa Deutschland GmbH
21* The licensing of the Program under the AGPL does not imply a trademark license.
22* Therefore any rights, title and interest in our trademarks remain entirely with us.
23*
24* However, if you propagate an unmodified version of the Program you are
25* allowed to use the term "Z-Push" to indicate that you distribute the Program.
26* Furthermore you may use our trademarks where it is necessary to indicate
27* the intended purpose of a product or service provided you use it in accordance
28* with honest practices in industrial or commercial matters.
29* If you want to propagate modified versions of the Program under the name "Z-Push",
30* you may only do so if you have a written permission by Zarafa Deutschland GmbH
31* (to acquire a permission please contact Zarafa at trademark@zarafa.com).
32*
33* This program is distributed in the hope that it will be useful,
34* but WITHOUT ANY WARRANTY; without even the implied warranty of
35* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36* GNU Affero General Public License for more details.
37*
38* You should have received a copy of the GNU Affero General Public License
39* along with this program.  If not, see <http://www.gnu.org/licenses/>.
40*
41* Consult LICENSE file for details
42************************************************/
43
44
45class TimezoneUtil {
46
47    /**
48     * list of MS and AS compatible timezones
49     *
50     * origin: http://msdn.microsoft.com/en-us/library/ms912391%28v=winembedded.11%29.aspx
51     * dots of tz identifiers were removed
52     *
53     * Updated at: 01.06.2012
54     */
55    private static $mstzones = array(
56                        "000" => array("Dateline Standard Time",                    "(GMT-12:00) International Date Line West"),
57                        "001" => array("Samoa Standard Time",                       "(GMT-11:00) Midway Island, Samoa"),
58                        "002" => array("Hawaiian Standard Time",                    "(GMT-10:00) Hawaii"),
59                        "003" => array("Alaskan Standard Time",                     "(GMT-09:00) Alaska"),
60                        "004" => array("Pacific Standard Time",                     "(GMT-08:00) Pacific Time (US and Canada); Tijuana"),
61                        "010" => array("Mountain Standard Time",                    "(GMT-07:00) Mountain Time (US and Canada)"),
62                        "013" => array("Mexico Standard Time 2",                    "(GMT-07:00) Chihuahua, La Paz, Mazatlan"),
63                        "015" => array("US Mountain Standard Time",                 "(GMT-07:00) Arizona"),
64                        "020" => array("Central Standard Time",                     "(GMT-06:00) Central Time (US and Canada"),
65                        "025" => array("Canada Central Standard Time",              "(GMT-06:00) Saskatchewan"),
66                        "030" => array("Mexico Standard Time",                      "(GMT-06:00) Guadalajara, Mexico City, Monterrey"),
67                        "033" => array("Central America Standard Time",             "(GMT-06:00) Central America"),
68                        "035" => array("Eastern Standard Time",                     "(GMT-05:00) Eastern Time (US and Canada)"),
69                        "040" => array("US Eastern Standard Time",                  "(GMT-05:00) Indiana (East)"),
70                        "045" => array("SA Pacific Standard Time",                  "(GMT-05:00) Bogota, Lima, Quito"),
71                        "uk1" => array("Venezuela Standard Time",                   "(GMT-04:30) Caracas"),                     // added
72                        "050" => array("Atlantic Standard Time",                    "(GMT-04:00) Atlantic Time (Canada)"),
73                        "055" => array("SA Western Standard Time",                  "(GMT-04:00) Caracas, La Paz"),
74                        "056" => array("Pacific SA Standard Time",                  "(GMT-04:00) Santiago"),
75                        "060" => array("Newfoundland and Labrador Standard Time",   "(GMT-03:30) Newfoundland and Labrador"),
76                        "065" => array("E South America Standard Time" ,            "(GMT-03:00) Brasilia"),
77                        "070" => array("SA Eastern Standard Time",                  "(GMT-03:00) Buenos Aires, Georgetown"),
78                        "073" => array("Greenland Standard Time",                   "(GMT-03:00) Greenland"),
79                        "075" => array("Mid-Atlantic Standard Time",                "(GMT-02:00) Mid-Atlantic"),
80                        "080" => array("Azores Standard Time",                      "(GMT-01:00) Azores"),
81                        "083" => array("Cape Verde Standard Time",                  "(GMT-01:00) Cape Verde Islands"),
82                        "085" => array("GMT Standard Time",                         "(GMT) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London"),
83                        "090" => array("Greenwich Standard Time",                   "(GMT) Casablanca, Monrovia"),
84                        "095" => array("Central Europe Standard Time",              "(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague"),
85                        "100" => array("Central European Standard Time",            "(GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb"),
86                        "105" => array("Romance Standard Time",                     "(GMT+01:00) Brussels, Copenhagen, Madrid, Paris"),
87                        "110" => array("W Europe Standard Time",                    "(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna"),
88                        "113" => array("W Central Africa Standard Time",            "(GMT+01:00) West Central Africa"),
89                        "115" => array("E Europe Standard Time",                    "(GMT+02:00) Bucharest"),
90                        "120" => array("Egypt Standard Time",                       "(GMT+02:00) Cairo"),
91                        "125" => array("FLE Standard Time",                         "(GMT+02:00) Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius"),
92                        "130" => array("GTB Standard Time",                         "(GMT+02:00) Athens, Istanbul, Minsk"),
93                        "135" => array("Israel Standard Time",                      "(GMT+02:00) Jerusalem"),
94                        "140" => array("South Africa Standard Time",                "(GMT+02:00) Harare, Pretoria"),
95                        "145" => array("Russian Standard Time",                     "(GMT+03:00) Moscow, St. Petersburg, Volgograd"),
96                        "150" => array("Arab Standard Time",                        "(GMT+03:00) Kuwait, Riyadh"),
97                        "155" => array("E Africa Standard Time",                    "(GMT+03:00) Nairobi"),
98                        "158" => array("Arabic Standard Time",                      "(GMT+03:00) Baghdad"),
99                        "160" => array("Iran Standard Time",                        "(GMT+03:30) Tehran"),
100                        "165" => array("Arabian Standard Time",                     "(GMT+04:00) Abu Dhabi, Muscat"),
101                        "170" => array("Caucasus Standard Time",                    "(GMT+04:00) Baku, Tbilisi, Yerevan"),
102                        "175" => array("Transitional Islamic State of Afghanistan Standard Time","(GMT+04:30) Kabul"),
103                        "180" => array("Ekaterinburg Standard Time",                "(GMT+05:00) Ekaterinburg"),
104                        "185" => array("West Asia Standard Time",                   "(GMT+05:00) Islamabad, Karachi, Tashkent"),
105                        "190" => array("India Standard Time",                       "(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi"),
106                        "193" => array("Nepal Standard Time",                       "(GMT+05:45) Kathmandu"),
107                        "195" => array("Central Asia Standard Time",                "(GMT+06:00) Astana, Dhaka"),
108                        "200" => array("Sri Lanka Standard Time",                   "(GMT+06:00) Sri Jayawardenepura"),
109                        "201" => array("N Central Asia Standard Time",              "(GMT+06:00) Almaty, Novosibirsk"),
110                        "203" => array("Myanmar Standard Time",                     "(GMT+06:30) Yangon Rangoon"),
111                        "205" => array("SE Asia Standard Time",                     "(GMT+07:00) Bangkok, Hanoi, Jakarta"),
112                        "207" => array("North Asia Standard Time",                  "(GMT+07:00) Krasnoyarsk"),
113                        "210" => array("China Standard Time",                       "(GMT+08:00) Beijing, Chongqing, Hong Kong SAR, Urumqi"),
114                        "215" => array("Singapore Standard Time",                   "(GMT+08:00) Kuala Lumpur, Singapore"),
115                        "220" => array("Taipei Standard Time",                      "(GMT+08:00) Taipei"),
116                        "225" => array("W Australia Standard Time",                 "(GMT+08:00) Perth"),
117                        "227" => array("North Asia East Standard Time",             "(GMT+08:00) Irkutsk, Ulaanbaatar"),
118                        "230" => array("Korea Standard Time",                       "(GMT+09:00) Seoul"),
119                        "235" => array("Tokyo Standard Time",                       "(GMT+09:00) Osaka, Sapporo, Tokyo"),
120                        "240" => array("Yakutsk Standard Time",                     "(GMT+09:00) Yakutsk"),
121                        "245" => array("AUS Central Standard Time",                 "(GMT+09:30) Darwin"),
122                        "250" => array("Cen Australia Standard Time",               "(GMT+09:30) Adelaide"),
123                        "255" => array("AUS Eastern Standard Time",                 "(GMT+10:00) Canberra, Melbourne, Sydney"),
124                        "260" => array("E Australia Standard Time",                 "(GMT+10:00) Brisbane"),
125                        "265" => array("Tasmania Standard Time",                    "(GMT+10:00) Hobart"),
126                        "270" => array("Vladivostok Standard Time",                 "(GMT+10:00) Vladivostok"),
127                        "275" => array("West Pacific Standard Time",                "(GMT+10:00) Guam, Port Moresby"),
128                        "280" => array("Central Pacific Standard Time",             "(GMT+11:00) Magadan, Solomon Islands, New Caledonia"),
129                        "285" => array("Fiji Islands Standard Time",                "(GMT+12:00) Fiji Islands, Kamchatka, Marshall Islands"),
130                        "290" => array("New Zealand Standard Time",                 "(GMT+12:00) Auckland, Wellington"),
131                        "300" => array("Tonga Standard Time",                       "(GMT+13:00) Nuku'alofa"),
132                );
133
134    /**
135     * Python generated offset list
136     * dots in keys were removed
137     *
138     * Array indices
139     *  0 = lBias
140     *  1 = lStandardBias
141     *  2 = lDSTBias
142     *  3 = wStartYear
143     *  4 = wStartMonth
144     *  5 = wStartDOW
145     *  6 = wStartDay
146     *  7 = wStartHour
147     *  8 = wStartMinute
148     *  9 = wStartSecond
149     * 10 = wStartMilliseconds
150     * 11 = wEndYear
151     * 12 = wEndMonth
152     * 13 = wEndDOW
153     * 14 = wEndDay
154     * 15 = wEndHour
155     * 16 = wEndMinute
156     * 17 = wEndSecond
157     * 18 = wEndMilloseconds
158     *
159     * As the $tzoneoffsets and the $mstzones need to be resolved in both directions,
160     * some offsets are commented as they are not available in the $mstzones.
161     *
162     * Created at: 01.06.2012
163     */
164    private static $tzonesoffsets = array(
165                        "Transitional Islamic State of Afghanistan Standard Time"
166                                                                    => array(-270, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
167                        "Alaskan Standard Time"                     => array(540, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
168                        "Arab Standard Time"                        => array(-180, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
169                        "Arabian Standard Time"                     => array(-240, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
170                        "Arabic Standard Time"                      => array(-180, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
171                        //"Argentina Standard Time"                   => array(180, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
172                        "Atlantic Standard Time"                    => array(240, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
173                        "AUS Central Standard Time"                 => array(-570, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
174                        "AUS Eastern Standard Time"                 => array(-600, 0, -60,  0, 4, 0, 1, 3, 0, 0, 0,  0, 10, 0, 1, 2, 0, 0, 0),
175                        //"Azerbaijan Standard Time"                  => array(-240, 0, -60,  0, 10, 0, 5, 5, 0, 0, 0,  0, 3, 0, 5, 4, 0, 0, 0),
176                        "Azores Standard Time"                      => array(60, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
177                        //"Bangladesh Standard Time"                  => array(-360, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
178                        "Canada Central Standard Time"              => array(360, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
179                        "Cape Verde Standard Time"                  => array(60, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
180                        "Caucasus Standard Time"                    => array(-240, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
181                        "Cen Australia Standard Time"               => array(-570, 0, -60,  0, 4, 0, 1, 3, 0, 0, 0,  0, 10, 0, 1, 2, 0, 0, 0),
182                        "Central America Standard Time"             => array(360, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
183                        "Central Asia Standard Time"                => array(-360, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
184                        //"Central Brazilian Standard Time"           => array(240, 0, -60,  0, 2, 6, 4, 23, 59, 59, 999,  0, 10, 6, 3, 23, 59, 59, 999),
185                        "Central Europe Standard Time"              => array(-60, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
186                        "Central European Standard Time"            => array(-60, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
187                        "Central Pacific Standard Time"             => array(-660, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
188                        "Central Standard Time"                     => array(360, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
189                        "Mexico Standard Time"                      => array(360, 0, -60,  0, 10, 0, 5, 2, 0, 0, 0,  0, 4, 0, 1, 2, 0, 0, 0),
190                        "China Standard Time"                       => array(-480, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
191                        "Dateline Standard Time"                    => array(720, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
192                        "E Africa Standard Time"                    => array(-180, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
193                        "E Australia Standard Time"                 => array(-600, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
194                        "E Europe Standard Time"                    => array(-120, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
195                        "E South America Standard Time"             => array(180, 0, -60,  0, 2, 6, 4, 23, 59, 59, 999,  0, 10, 6, 3, 23, 59, 59, 999),
196                        "Eastern Standard Time"                     => array(300, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
197                        "Egypt Standard Time"                       => array(-120, 0, -60,  0, 9, 4, 5, 23, 59, 59, 999,  0, 4, 4, 5, 23, 59, 59, 999),
198                        "Ekaterinburg Standard Time"                => array(-300, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
199                        "Fiji Islands Standard Time"                => array(-720, 0, -60,  0, 3, 0, 5, 3, 0, 0, 0,  0, 10, 0, 4, 2, 0, 0, 0),
200                        "FLE Standard Time"                         => array(-120, 0, -60,  0, 10, 0, 5, 4, 0, 0, 0,  0, 3, 0, 5, 3, 0, 0, 0),
201                        //"Georgian Standard Time"                    => array(-240, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
202                        "GMT Standard Time"                         => array(0, 0, -60,  0, 10, 0, 5, 2, 0, 0, 0,  0, 3, 0, 5, 1, 0, 0, 0),
203                        "Greenland Standard Time"                   => array(180, 0, -60,  0, 10, 6, 5, 23, 0, 0, 0,  0, 3, 6, 4, 22, 0, 0, 0),
204                        "Greenwich Standard Time"                   => array(0, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
205                        "GTB Standard Time"                         => array(-120, 0, -60,  0, 10, 0, 5, 4, 0, 0, 0,  0, 3, 0, 5, 3, 0, 0, 0),
206                        "Hawaiian Standard Time"                    => array(600, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
207                        "India Standard Time"                       => array(-330, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
208                        "Iran Standard Time"                        => array(-210, 0, -60,  0, 9, 1, 3, 23, 59, 59, 999,  0, 3, 6, 3, 23, 59, 59, 999),
209                        "Israel Standard Time"                      => array(-120, 0, -60,  0, 9, 0, 4, 2, 0, 0, 0,  0, 3, 5, 5, 2, 0, 0, 0),
210                        //"Jordan Standard Time"                      => array(-120, 0, -60,  0, 10, 5, 5, 1, 0, 0, 0,  0, 3, 4, 5, 23, 59, 59, 999),
211                        //"Kamchatka Standard Time"                   => array(-720, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
212                        "Korea Standard Time"                       => array(-540, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
213                        //"Magadan Standard Time"                     => array(-660, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
214                        //"Mauritius Standard Time"                   => array(-240, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
215                        "Mid-Atlantic Standard Time"                => array(120, 0, -60,  0, 9, 0, 5, 2, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
216                        //"Middle East Standard Time"                 => array(-120, 0, -60,  0, 10, 6, 5, 23, 59, 59, 999,  0, 3, 6, 4, 23, 59, 59, 999),
217                        //"Montevideo Standard Time"                  => array(180, 0, -60,  0, 3, 0, 2, 2, 0, 0, 0,  0, 10, 0, 1, 2, 0, 0, 0),
218                        //"Morocco Standard Time"                     => array(0, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
219                        "Mountain Standard Time"                    => array(420, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
220                        "Mexico Standard Time 2"                    => array(420, 0, -60,  0, 10, 0, 5, 2, 0, 0, 0,  0, 4, 0, 1, 2, 0, 0, 0),
221                        "Myanmar Standard Time"                     => array(-390, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
222                        "N Central Asia Standard Time"              => array(-360, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
223                        //"Namibia Standard Time"                     => array(-60, 0, -60,  0, 4, 0, 1, 2, 0, 0, 0,  0, 9, 0, 1, 2, 0, 0, 0),
224                        "Nepal Standard Time"                       => array(-345, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
225                        "New Zealand Standard Time"                 => array(-720, 0, -60,  0, 4, 0, 1, 3, 0, 0, 0,  0, 9, 0, 5, 2, 0, 0, 0),
226                        "Newfoundland and Labrador Standard Time"   => array(210, 0, -60,  0, 11, 0, 1, 0, 1, 0, 0,  0, 3, 0, 2, 0, 1, 0, 0),
227                        "North Asia East Standard Time"             => array(-480, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
228                        "North Asia Standard Time"                  => array(-420, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
229                        "Pacific SA Standard Time"                  => array(240, 0, -60,  0, 3, 6, 2, 23, 59, 59, 999,  0, 10, 6, 2, 23, 59, 59, 999),
230                        "Pacific Standard Time"                     => array(480, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
231                        //"Pacific Standard Time (Mexico)"            => array(480, 0, -60,  0, 10, 0, 5, 2, 0, 0, 0,  0, 4, 0, 1, 2, 0, 0, 0),
232                        //"Pakistan Standard Time"                    => array(-300, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
233                        //"Paraguay Standard Time"                    => array(240, 0, -60,  0, 4, 6, 1, 23, 59, 59, 999,  0, 10, 6, 1, 23, 59, 59, 999),
234                        "Romance Standard Time"                     => array(-60, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
235                        "Russian Standard Time"                     => array(-180, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
236                        "SA Eastern Standard Time"                  => array(180, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
237                        "SA Pacific Standard Time"                  => array(300, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
238                        "SA Western Standard Time"                  => array(240, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
239                        "Samoa Standard Time"                       => array(660, 0, -60,  0, 3, 6, 5, 23, 59, 59, 999,  0, 9, 6, 5, 23, 59, 59, 999),
240                        "SE Asia Standard Time"                     => array(-420, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
241                        "Singapore Standard Time"                   => array(-480, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
242                        "South Africa Standard Time"                => array(-120, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
243                        "Sri Lanka Standard Time"                   => array(-330, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
244                        //"Syria Standard Time"                       => array(-120, 0, -60,  0, 10, 4, 5, 23, 59, 59, 999,  0, 4, 4, 1, 23, 59, 59, 999),
245                        "Taipei Standard Time"                      => array(-480, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
246                        "Tasmania Standard Time"                    => array(-600, 0, -60,  0, 4, 0, 1, 3, 0, 0, 0,  0, 10, 0, 1, 2, 0, 0, 0),
247                        "Tokyo Standard Time"                       => array(-540, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
248                        "Tonga Standard Time"                       => array(-780, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
249                        //"Ulaanbaatar Standard Time"                 => array(-480, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
250                        "US Eastern Standard Time"                  => array(300, 0, -60,  0, 11, 0, 1, 2, 0, 0, 0,  0, 3, 0, 2, 2, 0, 0, 0),
251                        "US Mountain Standard Time"                 => array(420, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
252                        //"UTC"                                       => array(0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
253                        //"UTC+12"                                    => array(-720, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
254                        //"UTC-02"                                    => array(120, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
255                        //"UTC-11"                                    => array(660, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
256                        "Venezuela Standard Time"                   => array(270, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
257                        "Vladivostok Standard Time"                 => array(-600, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
258                        "W Australia Standard Time"                 => array(-480, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
259                        "W Central Africa Standard Time"            => array(-60, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
260                        "W Europe Standard Time"                    => array(-60, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
261                        "West Asia Standard Time"                   => array(-300, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
262                        "West Pacific Standard Time"                => array(-600, 0, -60,  0, 0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0),
263                        "Yakutsk Standard Time"                     => array(-540, 0, -60,  0, 10, 0, 5, 3, 0, 0, 0,  0, 3, 0, 5, 2, 0, 0, 0),
264                );
265
266    /**
267     * Generated list of PHP timezones in GMT timezones
268     *
269     * Created at: 01.06.2012
270     */
271    private static $phptimezones = array(
272            // -720 min
273            "Dateline Standard Time" => array(
274                        "Etc/GMT+12",
275                 ),
276
277            // -660 min
278            "Samoa Standard Time" => array(
279                        "Etc/GMT+11",
280                        "Pacific/Midway",
281                        "Pacific/Niue",
282                        "Pacific/Pago_Pago",
283                        "Pacific/Samoa",
284                        "US/Samoa",
285                 ),
286
287            // -600 min
288            "Hawaiian Standard Time" => array(
289                        "America/Adak",
290                        "America/Atka",
291                        "Etc/GMT+10",
292                        "HST",
293                        "Pacific/Honolulu",
294                        "Pacific/Johnston",
295                        "Pacific/Rarotonga",
296                        "Pacific/Tahiti",
297                        "US/Aleutian",
298                        "US/Hawaii",
299                 ),
300
301            // -570 min
302            "-570" => array(
303                        "Pacific/Marquesas",
304                 ),
305
306            // -540 min
307            "Alaskan Standard Time" => array(
308                        "America/Anchorage",
309                        "America/Juneau",
310                        "America/Nome",
311                        "America/Sitka",
312                        "America/Yakutat",
313                        "Etc/GMT+9",
314                        "Pacific/Gambier",
315                        "US/Alaska",
316                 ),
317
318            // -480 min
319            "Pacific Standard Time" => array(
320                        "America/Dawson",
321                        "America/Ensenada",
322                        "America/Los_Angeles",
323                        "America/Metlakatla",
324                        "America/Santa_Isabel",
325                        "America/Tijuana",
326                        "America/Vancouver",
327                        "America/Whitehorse",
328                        "Canada/Pacific",
329                        "Canada/Yukon",
330                        "Etc/GMT+8",
331                        "Mexico/BajaNorte",
332                        "Pacific/Pitcairn",
333                        "PST8PDT",
334                        "US/Pacific",
335                        "US/Pacific-New",
336                 ),
337
338            // -420 min
339            "US Mountain Standard Time" => array(
340                        "America/Boise",
341                        "America/Cambridge_Bay",
342                        "America/Chihuahua",
343                        "America/Creston",
344                        "America/Dawson_Creek",
345                        "America/Denver",
346                        "America/Edmonton",
347                        "America/Hermosillo",
348                        "America/Inuvik",
349                        "America/Mazatlan",
350                        "America/Ojinaga",
351                        "America/Phoenix",
352                        "America/Shiprock",
353                        "America/Yellowknife",
354                        "Canada/Mountain",
355                        "Etc/GMT+7",
356                        "Mexico/BajaSur",
357                        "MST",
358                        "MST7MDT",
359                        "Navajo",
360                        "US/Arizona",
361                        "US/Mountain",
362                 ),
363
364            // -360 min
365            "Central Standard Time" => array(
366                        "America/Chicago",
367                        "America/Indiana/Knox",
368                        "America/Indiana/Tell_City",
369                        "America/Knox_IN",
370                        "America/North_Dakota/Beulah",
371                        "America/North_Dakota/Center",
372                        "America/North_Dakota/New_Salem",
373                        "America/Rainy_River",
374                        "America/Rankin_Inlet",
375                        "America/Regina",
376                        "America/Resolute",
377                        "America/Swift_Current",
378                        "America/Tegucigalpa",
379                        "America/Winnipeg",
380                        "US/Central",
381                        "US/Indiana-Starke",
382                        "CST6CDT",
383                        "Etc/GMT+6",
384                 ),
385            "Canada Central Standard Time" => array(
386                        "Canada/Central",
387                        "Canada/East-Saskatchewan",
388                        "Canada/Saskatchewan",
389                 ),
390            "Mexico Standard Time" => array(
391                        "America/Mexico_City",
392                        "America/Monterrey",
393                        "Mexico/General",
394                 ),
395            "Central America Standard Time" => array(
396                        "America/Bahia_Banderas",
397                        "America/Belize",
398                        "America/Cancun",
399                        "America/Costa_Rica",
400                        "America/El_Salvador",
401                        "America/Guatemala",
402                        "America/Managua",
403                        "America/Matamoros",
404                        "America/Menominee",
405                        "America/Merida",
406                        "Chile/EasterIsland",
407                        "Pacific/Easter",
408                        "Pacific/Galapagos",
409                 ),
410
411            // -300 min
412            "US Eastern Standard Time" => array(
413                        "America/Detroit",
414                        "America/Fort_Wayne",
415                        "America/Grand_Turk",
416                        "America/Indiana/Indianapolis",
417                        "America/Indiana/Marengo",
418                        "America/Indiana/Petersburg",
419                        "America/Indiana/Vevay",
420                        "America/Indiana/Vincennes",
421                        "America/Indiana/Winamac",
422                        "America/Indianapolis",
423                        "America/Jamaica",
424                        "America/Kentucky/Louisville",
425                        "America/Kentucky/Monticello",
426                        "America/Louisville",
427                        "America/Montreal",
428                        "America/New_York",
429                        "America/Thunder_Bay",
430                        "America/Toronto",
431                        "Canada/Eastern",
432                        "Cuba",
433                        "EST",
434                        "EST5EDT",
435                        "Etc/GMT+5",
436                        "Jamaica",
437                        "US/East-Indiana",
438                        "US/Eastern",
439                        "US/Michigan",
440                 ),
441            "SA Pacific Standard Time" => array(
442                        "America/Atikokan",
443                        "America/Bogota",
444                        "America/Cayman",
445                        "America/Coral_Harbour",
446                        "America/Guayaquil",
447                        "America/Havana",
448                        "America/Iqaluit",
449                        "America/Lima",
450                        "America/Nassau",
451                        "America/Nipigon",
452                        "America/Panama",
453                        "America/Pangnirtung",
454                        "America/Port-au-Prince",
455                 ),
456
457            // -270 min
458            "Venezuela Standard Time" => array(
459                        "America/Caracas",
460                 ),
461            // -240 min
462            "Atlantic Standard Time" => array(
463                        "America/Barbados",
464                        "America/Blanc-Sablon",
465                        "America/Glace_Bay",
466                        "America/Goose_Bay",
467                        "America/Halifax",
468                        "America/Lower_Princes",
469                        "America/St_Barthelemy",
470                        "America/St_Kitts",
471                        "America/St_Lucia",
472                        "America/St_Thomas",
473                        "America/St_Vincent",
474                        "America/Thule",
475                        "America/Tortola",
476                        "America/Virgin",
477                        "Atlantic/Bermuda",
478                        "Canada/Atlantic",
479                        "Etc/GMT+4",
480                 ),
481            "SA Western Standard Time" => array(
482                        "America/Anguilla",
483                        "America/Antigua",
484                        "America/Aruba",
485                        "America/Asuncion",
486                        "America/Boa_Vista",
487                        "America/Campo_Grande",
488                        "America/Cuiaba",
489                        "America/Curacao",
490                        "America/Dominica",
491                        "America/Eirunepe",
492                        "America/Grenada",
493                        "America/Guadeloupe",
494                        "America/Guyana",
495                        "America/Kralendijk",
496                        "America/La_Paz",
497                        "America/Manaus",
498                        "America/Marigot",
499                        "America/Martinique",
500                        "America/Moncton",
501                        "America/Montserrat",
502                        "America/Port_of_Spain",
503                        "America/Porto_Acre",
504                        "America/Porto_Velho",
505                        "America/Puerto_Rico",
506                        "America/Rio_Branco",
507                        "Brazil/Acre",
508                        "Brazil/West",
509                 ),
510            "Pacific SA Standard Time" => array(
511                        "America/Santiago",
512                        "America/Santo_Domingo",
513                        "Antarctica/Palmer",
514                        "Chile/Continental",
515                 ),
516
517            // -210 min
518            "Newfoundland and Labrador Standard Time" => array(
519                        "America/St_Johns",
520                        "Canada/Newfoundland",
521                 ),
522
523            // -180 min
524            "E South America Standard Time" => array(
525                        "America/Araguaina",
526                        "America/Bahia",
527                        "America/Belem",
528                        "America/Fortaleza",
529                        "America/Maceio",
530                        "America/Recife",
531                        "America/Sao_Paulo",
532                        "Brazil/East",
533                        "Etc/GMT+3",
534                 ),
535            "SA Eastern Standard Time" => array(
536                        "America/Argentina/Buenos_Aires",
537                        "America/Argentina/Catamarca",
538                        "America/Argentina/ComodRivadavia",
539                        "America/Argentina/Cordoba",
540                        "America/Argentina/Jujuy",
541                        "America/Argentina/La_Rioja",
542                        "America/Argentina/Mendoza",
543                        "America/Argentina/Rio_Gallegos",
544                        "America/Argentina/Salta",
545                        "America/Argentina/San_Juan",
546                        "America/Argentina/San_Luis",
547                        "America/Argentina/Tucuman",
548                        "America/Argentina/Ushuaia",
549                        "America/Buenos_Aires",
550                        "America/Catamarca",
551                        "America/Cayenne",
552                        "America/Cordoba",
553                        "America/Godthab",
554                        "America/Jujuy",
555                        "America/Mendoza",
556                        "America/Miquelon",
557                        "America/Montevideo",
558                        "America/Paramaribo",
559                        "America/Rosario",
560                        "America/Santarem",
561                 ),
562            "Greenland Standard Time" => array(
563                        "Antarctica/Rothera",
564                        "Atlantic/Stanley",
565                 ),
566
567            // -120 min
568            "Mid-Atlantic Standard Time" => array(
569                        "America/Noronha",
570                        "Atlantic/South_Georgia",
571                        "Brazil/DeNoronha",
572                        "Etc/GMT+2",
573                 ),
574
575            // -60 min
576            "Azores Standard Time" => array(
577                        "Atlantic/Azores",
578                        "Etc/GMT+1",
579                 ),
580            "Cape Verde Standard Time" => array(
581                        "America/Scoresbysund",
582                        "Atlantic/Cape_Verde",
583                 ),
584
585            // 0 min
586            "GMT Standard Time" => array(
587                        "Eire",
588                        "Etc/GMT",
589                        "Etc/GMT+0",
590                        "Etc/GMT-0",
591                        "Etc/GMT0",
592                        "Etc/Greenwich",
593                        "Etc/UCT",
594                        "Etc/Universal",
595                        "Etc/UTC",
596                        "Etc/Zulu",
597                        "Europe/Belfast",
598                        "Europe/Dublin",
599                        "Europe/Guernsey",
600                        "Europe/Isle_of_Man",
601                        "Europe/Jersey",
602                        "Europe/Lisbon",
603                        "Europe/London",
604                        "Factory",
605                        "GB",
606                        "GB-Eire",
607                        "GMT",
608                        "GMT+0",
609                        "GMT-0",
610                        "GMT0",
611                        "Greenwich",
612                        "Iceland",
613                        "Portugal",
614                        "UCT",
615                        "Universal",
616                        "UTC",
617                 ),
618            "Greenwich Standard Time" => array(
619                        "Africa/Abidjan",
620                        "Africa/Accra",
621                        "Africa/Bamako",
622                        "Africa/Banjul",
623                        "Africa/Bissau",
624                        "Africa/Casablanca",
625                        "Africa/Conakry",
626                        "Africa/Dakar",
627                        "Africa/El_Aaiun",
628                        "Africa/Freetown",
629                        "Africa/Lome",
630                        "Africa/Monrovia",
631                        "Africa/Nouakchott",
632                        "Africa/Ouagadougou",
633                        "Africa/Sao_Tome",
634                        "Africa/Timbuktu",
635                        "America/Danmarkshavn",
636                        "Atlantic/Canary",
637                        "Atlantic/Faeroe",
638                        "Atlantic/Faroe",
639                        "Atlantic/Madeira",
640                        "Atlantic/Reykjavik",
641                        "Atlantic/St_Helena",
642                        "Zulu",
643                 ),
644
645            // +60 min
646            "Central Europe Standard Time" => array(
647                        "Europe/Belgrade",
648                        "Europe/Bratislava",
649                        "Europe/Budapest",
650                        "Europe/Ljubljana",
651                        "Europe/Prague",
652                        "Europe/Vaduz",
653                 ),
654            "Central European Standard Time" => array(
655                        "Europe/Sarajevo",
656                        "Europe/Skopje",
657                        "Europe/Warsaw",
658                        "Europe/Zagreb",
659                        "MET",
660                        "Poland",
661                 ),
662            "Romance Standard Time" => array(
663                        "Europe/Andorra",
664                        "Europe/Brussels",
665                        "Europe/Copenhagen",
666                        "Europe/Gibraltar",
667                        "Europe/Madrid",
668                        "Europe/Malta",
669                        "Europe/Monaco",
670                        "Europe/Paris",
671                        "Europe/Podgorica",
672                        "Europe/San_Marino",
673                        "Europe/Tirane",
674                 ),
675            "W Europe Standard Time" => array(
676                        "Europe/Amsterdam",
677                        "Europe/Berlin",
678                        "Europe/Luxembourg",
679                        "Europe/Vatican",
680                        "Europe/Rome",
681                        "Europe/Stockholm",
682                        "Arctic/Longyearbyen",
683                        "Europe/Vienna",
684                        "Europe/Zurich",
685                        "Europe/Oslo",
686                        "WET",
687                        "CET",
688                        "Etc/GMT-1",
689                 ),
690            "W Central Africa Standard Time" => array(
691                        "Africa/Algiers",
692                        "Africa/Bangui",
693                        "Africa/Brazzaville",
694                        "Africa/Ceuta",
695                        "Africa/Douala",
696                        "Africa/Kinshasa",
697                        "Africa/Lagos",
698                        "Africa/Libreville",
699                        "Africa/Luanda",
700                        "Africa/Malabo",
701                        "Africa/Ndjamena",
702                        "Africa/Niamey",
703                        "Africa/Porto-Novo",
704                        "Africa/Tunis",
705                        "Africa/Windhoek",
706                        "Atlantic/Jan_Mayen",
707                 ),
708
709            // +120 min
710            "E Europe Standard Time" => array(
711                        "Europe/Bucharest",
712                        "EET",
713                        "Etc/GMT-2",
714                        "Europe/Chisinau",
715                        "Europe/Mariehamn",
716                        "Europe/Nicosia",
717                        "Europe/Simferopol",
718                        "Europe/Tiraspol",
719                        "Europe/Uzhgorod",
720                        "Europe/Zaporozhye",
721                 ),
722            "Egypt Standard Time" => array(
723                        "Africa/Cairo",
724                        "Africa/Tripoli",
725                        "Egypt",
726                        "Libya",
727                 ),
728            "FLE Standard Time" => array(
729                        "Europe/Helsinki",
730                        "Europe/Kiev",
731                        "Europe/Riga",
732                        "Europe/Sofia",
733                        "Europe/Tallinn",
734                        "Europe/Vilnius",
735                 ),
736            "GTB Standard Time" => array(
737                        "Asia/Istanbul",
738                        "Europe/Athens",
739                        "Europe/Istanbul",
740                        "Turkey",
741                 ),
742            "Israel Standard Time" => array(
743                        "Asia/Amman",
744                        "Asia/Beirut",
745                        "Asia/Damascus",
746                        "Asia/Gaza",
747                        "Asia/Hebron",
748                        "Asia/Nicosia",
749                        "Asia/Tel_Aviv",
750                        "Asia/Jerusalem",
751                        "Israel",
752                 ),
753            "South Africa Standard Time" => array(
754                        "Africa/Blantyre",
755                        "Africa/Bujumbura",
756                        "Africa/Gaborone",
757                        "Africa/Harare",
758                        "Africa/Johannesburg",
759                        "Africa/Kigali",
760                        "Africa/Lubumbashi",
761                        "Africa/Lusaka",
762                        "Africa/Maputo",
763                        "Africa/Maseru",
764                        "Africa/Mbabane",
765                 ),
766
767            // +180 min
768            "Russian Standard Time" => array(
769                        "Antarctica/Syowa",
770                        "Europe/Kaliningrad",
771                        "Europe/Minsk",
772                        "Etc/GMT-3",
773                 ),
774            "Arab Standard Time" => array(
775                        "Asia/Qatar",
776                        "Asia/Kuwait",
777                        "Asia/Riyadh",
778                 ),
779            "E Africa Standard Time" => array(
780                        "Africa/Addis_Ababa",
781                        "Africa/Asmara",
782                        "Africa/Asmera",
783                        "Africa/Dar_es_Salaam",
784                        "Africa/Djibouti",
785                        "Africa/Juba",
786                        "Africa/Kampala",
787                        "Africa/Khartoum",
788                        "Africa/Mogadishu",
789                        "Africa/Nairobi",
790                 ),
791            "Arabic Standard Time" => array(
792                        "Asia/Aden",
793                        "Asia/Baghdad",
794                        "Asia/Bahrain",
795                        "Indian/Antananarivo",
796                        "Indian/Comoro",
797                        "Indian/Mayotte",
798                 ),
799
800            // +210 min
801            "Iran Standard Time" => array(
802                        "Asia/Tehran",
803                        "Iran",
804                 ),
805
806            // +240 min
807            "Arabian Standard Time" => array(
808                        "Asia/Dubai",
809                        "Asia/Muscat",
810                        "Indian/Mahe",
811                        "Indian/Mauritius",
812                        "Indian/Reunion",
813                 ),
814            "Caucasus Standard Time" => array(
815                        "Asia/Baku",
816                        "Asia/Tbilisi",
817                        "Asia/Yerevan",
818                        "Etc/GMT-4",
819                        "Europe/Moscow",
820                        "Europe/Samara",
821                        "Europe/Volgograd",
822                        "W-SU",
823                 ),
824
825            // +270 min
826            "Transitional Islamic State of Afghanistan Standard Time" => array(
827                        "Asia/Kabul",
828                 ),
829
830            // +300 min
831            "Ekaterinburg Standard Time" => array(
832                        "Antarctica/Mawson",
833                 ),
834            "West Asia Standard Time" => array(
835                        "Asia/Aqtau",
836                        "Asia/Aqtobe",
837                        "Asia/Ashgabat",
838                        "Asia/Ashkhabad",
839                        "Asia/Dushanbe",
840                        "Asia/Karachi",
841                        "Asia/Oral",
842                        "Asia/Samarkand",
843                        "Asia/Tashkent",
844                        "Etc/GMT-5",
845                        "Indian/Kerguelen",
846                        "Indian/Maldives",
847                 ),
848
849            // +330 min
850            "India Standard Time" => array(
851                        "Asia/Calcutta",
852                        "Asia/Colombo",
853                        "Asia/Kolkata",
854                 ),
855
856            // +345 min
857            "Nepal Standard Time" => array(
858                        "Asia/Kathmandu",
859                        "Asia/Katmandu",
860                 ),
861
862            // +360 min
863            "Central Asia Standard Time" => array(
864                        "Asia/Dacca",
865                        "Asia/Dhaka",
866                 ),
867            "Sri Lanka Standard Time" => array(
868                        "Indian/Chagos",
869                 ),
870            "N Central Asia Standard Time" => array(
871                        "Antarctica/Vostok",
872                        "Asia/Almaty",
873                        "Asia/Bishkek",
874                        "Asia/Qyzylorda",
875                        "Asia/Thimbu",
876                        "Asia/Thimphu",
877                        "Asia/Yekaterinburg",
878                        "Etc/GMT-6",
879                 ),
880
881            // +390 min
882            "Myanmar Standard Time" => array(
883                        "Asia/Rangoon",
884                        "Indian/Cocos",
885                 ),
886
887            // +420 min
888            "SE Asia Standard Time" => array(
889                        "Asia/Bangkok",
890                        "Asia/Ho_Chi_Minh",
891                        "Asia/Hovd",
892                        "Asia/Jakarta",
893                        "Asia/Phnom_Penh",
894                        "Asia/Saigon",
895                        "Indian/Christmas",
896                 ),
897            "North Asia Standard Time" => array(
898                        "Antarctica/Davis",
899                        "Asia/Novokuznetsk",
900                        "Asia/Novosibirsk",
901                        "Asia/Omsk",
902                        "Asia/Pontianak",
903                        "Asia/Vientiane",
904                        "Etc/GMT-7",
905                 ),
906
907            // +480 min
908            "China Standard Time" => array(
909                        "Asia/Brunei",
910                        "Asia/Choibalsan",
911                        "Asia/Chongqing",
912                        "Asia/Chungking",
913                        "Asia/Harbin",
914                        "Asia/Hong_Kong",
915                        "Asia/Shanghai",
916                        "Asia/Ujung_Pandang",
917                        "Asia/Urumqi",
918                        "Hongkong",
919                        "PRC",
920                        "ROC",
921                 ),
922            "Singapore Standard Time" => array(
923                        "Singapore",
924                        "Asia/Singapore",
925                        "Asia/Kuala_Lumpur",
926                 ),
927            "Taipei Standard Time" => array(
928                        "Asia/Taipei",
929                 ),
930            "W Australia Standard Time" => array(
931                        "Australia/Perth",
932                        "Australia/West",
933                 ),
934            "North Asia East Standard Time" => array(
935                        "Antarctica/Casey",
936                        "Asia/Kashgar",
937                        "Asia/Krasnoyarsk",
938                        "Asia/Kuching",
939                        "Asia/Macao",
940                        "Asia/Macau",
941                        "Asia/Makassar",
942                        "Asia/Manila",
943                        "Etc/GMT-8",
944                        "Asia/Ulaanbaatar",
945                        "Asia/Ulan_Bator",
946                 ),
947
948            // +525 min
949            "525" => array(
950                        "Australia/Eucla",
951                 ),
952
953            // +540 min
954            "Korea Standard Time" => array(
955                        "Asia/Seoul",
956                        "Asia/Pyongyang",
957                        "ROK",
958                 ),
959            "Tokyo Standard Time" => array(
960                        "Asia/Tokyo",
961                        "Japan",
962                        "Etc/GMT-9",
963                 ),
964            "Yakutsk Standard Time" => array(
965                        "Asia/Dili",
966                        "Asia/Irkutsk",
967                        "Asia/Jayapura",
968                        "Pacific/Palau",
969                 ),
970
971            // +570 min
972            "AUS Central Standard Time" => array(
973                        "Australia/Darwin",
974                        "Australia/North",
975                 ),
976             // DST
977            "Cen Australia Standard Time" => array(
978                        "Australia/Adelaide",
979                        "Australia/Broken_Hill",
980                        "Australia/South",
981                        "Australia/Yancowinna",
982                 ),
983
984            // +600 min
985            "AUS Eastern Standard Time" => array(
986                        "Australia/Canberra",
987                        "Australia/Melbourne",
988                        "Australia/Sydney",
989                        "Australia/Currie",
990                        "Australia/ACT",
991                        "Australia/NSW",
992                        "Australia/Victoria",
993                 ),
994            "E Australia Standard Time" => array(
995                        "Etc/GMT-10",
996                        "Australia/Brisbane",
997                        "Australia/Queensland",
998                        "Australia/Lindeman",
999                 ),
1000            "Tasmania Standard Time" => array(
1001                        "Australia/Hobart",
1002                        "Australia/Tasmania",
1003                 ),
1004            "Vladivostok Standard Time" => array(
1005                        "Antarctica/DumontDUrville",
1006                 ),
1007            "West Pacific Standard Time" => array(
1008                        "Asia/Yakutsk",
1009                        "Pacific/Chuuk",
1010                        "Pacific/Guam",
1011                        "Pacific/Port_Moresby",
1012                        "Pacific/Saipan",
1013                        "Pacific/Truk",
1014                        "Pacific/Yap",
1015                 ),
1016
1017            // +630 min
1018            "630" => array(
1019                        "Australia/LHI",
1020                        "Australia/Lord_Howe",
1021                 ),
1022
1023            // +660 min
1024            "Central Pacific Standard Time" => array(
1025                        "Antarctica/Macquarie",
1026                        "Asia/Sakhalin",
1027                        "Asia/Vladivostok",
1028                        "Etc/GMT-11",
1029                        "Pacific/Efate",
1030                        "Pacific/Guadalcanal",
1031                        "Pacific/Kosrae",
1032                        "Pacific/Noumea",
1033                        "Pacific/Pohnpei",
1034                        "Pacific/Ponape",
1035                 ),
1036
1037            // 690 min
1038            "690" => array(
1039                        "Pacific/Norfolk",
1040                 ),
1041
1042            // +720 min
1043            "Fiji Islands Standard Time" => array(
1044                        "Asia/Anadyr",
1045                        "Asia/Kamchatka",
1046                        "Asia/Magadan",
1047                        "Kwajalein",
1048                 ),
1049            "New Zealand Standard Time" => array(
1050                        "Antarctica/McMurdo",
1051                        "Antarctica/South_Pole",
1052                        "Etc/GMT-12",
1053                        "NZ",
1054                        "Pacific/Auckland",
1055                        "Pacific/Fiji",
1056                        "Pacific/Funafuti",
1057                        "Pacific/Kwajalein",
1058                        "Pacific/Majuro",
1059                        "Pacific/Nauru",
1060                        "Pacific/Tarawa",
1061                        "Pacific/Wake",
1062                        "Pacific/Wallis",
1063                 ),
1064
1065            // +765 min
1066            "765" => array(
1067                        "NZ-CHAT",
1068                        "Pacific/Chatham",
1069                 ),
1070
1071            // +780 min
1072            "Tonga Standard Time" => array(
1073                        "Etc/GMT-13",
1074                        "Pacific/Apia",
1075                        "Pacific/Enderbury",
1076                        "Pacific/Tongatapu",
1077                 ),
1078
1079            // +840 min
1080            "840" => array(
1081                        "Etc/GMT-14",
1082                        "Pacific/Fakaofo",
1083                        "Pacific/Kiritimati",
1084                 ),
1085            );
1086
1087    /**
1088     * Returns a full timezone array
1089     *
1090     * @param string    $phptimezone    (opt) a php timezone string.
1091     *                                  If omitted the env. default timezone is used.
1092     *
1093     * @access public
1094     * @return array
1095     */
1096    static public function GetFullTZ($phptimezone = false) {
1097        if ($phptimezone === false)
1098            $phptimezone = date_default_timezone_get();
1099
1100        ZLog::Write(LOGLEVEL_DEBUG, "TimezoneUtil::GetFullTZ() for ". $phptimezone);
1101
1102        $servertzname = self::guessTZNameFromPHPName($phptimezone);
1103        $offset = self::$tzonesoffsets[$servertzname];
1104
1105        $tz = array(
1106            "bias" => $offset[0],
1107            "tzname" => self::encodeTZName(self::getMSTZnameFromTZName($servertzname)),
1108            "dstendyear" => $offset[3],
1109            "dstendmonth" => $offset[4],
1110            "dstendday" => $offset[6],
1111            "dstendweek" => $offset[5],
1112            "dstendhour" => $offset[7],
1113            "dstendminute" => $offset[8],
1114            "dstendsecond" => $offset[9],
1115            "dstendmillis" => $offset[10],
1116            "stdbias" => $offset[1],
1117            "tznamedst" => self::encodeTZName(self::getMSTZnameFromTZName($servertzname)),
1118            "dststartyear" => $offset[11],
1119            "dststartmonth" => $offset[12],
1120            "dststartday" => $offset[14],
1121            "dststartweek" => $offset[13],
1122            "dststarthour" => $offset[15],
1123            "dststartminute" => $offset[16],
1124            "dststartsecond" => $offset[17],
1125            "dststartmillis" => $offset[18],
1126            "dstbias" => $offset[2]
1127        );
1128
1129        return $tz;
1130    }
1131
1132    /**
1133     * Sets the timezone name by matching data from the offset (bias etc)
1134     *
1135     * @param array     $offset         a z-push timezone array
1136     *
1137     * @access public
1138     * @return array
1139     */
1140    static public function FillTZNames($tz) {
1141        ZLog::Write(LOGLEVEL_DEBUG, "TimezoneUtil::FillTZNames() filling up bias ". $tz["bias"]);
1142        if (!isset($tz["bias"]))
1143            ZLog::Write(LOGLEVEL_WARN, "TimezoneUtil::FillTZNames() submitted TZ array does not have a bias");
1144        else {
1145            $tzname = self::guessTZNameFromOffset($tz);
1146            $tz['tzname'] = $tz['tznamedst'] = self::encodeTZName(self::getMSTZnameFromTZName($tzname));
1147        }
1148        return $tz;
1149    }
1150
1151    /**
1152     * Tries to find a timezone using the Bias and other offset parameters
1153     *
1154     * @param array     $offset         a z-push timezone array
1155     *
1156     * @access public
1157     * @return string
1158     */
1159    static private function guessTZNameFromOffset($offset) {
1160        // try to find a quite exact match
1161        foreach (self::$tzonesoffsets as $tzname => $tzoffset) {
1162            if ($offset["bias"] == $tzoffset[0] &&
1163                isset($offset["dstendmonth"])   && $offset["dstendmonth"] == $tzoffset[4] &&
1164                isset($offset["dstendday"])     && $offset["dstendday"] == $tzoffset[6] &&
1165                isset($offset["dststartmonth"]) && $offset["dststartmonth"] == $tzoffset[12] &&
1166                isset($offset["dststartday"])   && $offset["dststartday"] == $tzoffset[14])
1167                return $tzname;
1168        }
1169
1170        // try to find a bias match
1171        foreach (self::$tzonesoffsets as $tzname => $tzoffset) {
1172            if ($offset["bias"] == $tzoffset[0])
1173                return $tzname;
1174        }
1175
1176        // nothing found? return gmt
1177        ZLog::Write(LOGLEVEL_WARN, "TimezoneUtil::guessTZNameFromOffset() no timezone found for the data submitted. Returning 'GMT Standard Time'.");
1178        return "GMT Standard Time";
1179    }
1180
1181    /**
1182     * Tries to find a AS timezone for a php timezone
1183     *
1184     * @param string    $phpname        a php timezone name
1185     *
1186     * @access public
1187     * @return string
1188     */
1189    static private function guessTZNameFromPHPName($phpname) {
1190        foreach (self::$phptimezones as $tzn => $phptzs) {
1191            if (in_array($phpname, $phptzs)) {
1192                $tzname = $tzn;
1193                break;
1194            }
1195        }
1196
1197        if (!isset($tzname) || is_int($tzname)) {
1198            ZLog::Write(LOGLEVEL_ERROR, sprintf("TimezoneUtil::guessTZNameFromPHPName() no compatible timezone found for '%s'. Returning 'GMT Standard Time'. Please contact the Z-Push dev team.", $phpname));
1199            return self::$mstzones["085"][0];
1200        }
1201
1202        return $tzname;
1203    }
1204
1205    /**
1206     * Returns an AS compatible tz name
1207     *
1208     * @param string    $name       internal timezone name
1209     *
1210     * @access public
1211     * @return string
1212     */
1213    static private function getMSTZnameFromTZName($name) {
1214        foreach (self::$mstzones as $mskey => $msdefs) {
1215            if ($name == $msdefs[0])
1216                return $msdefs[1];
1217        }
1218
1219        ZLog::Write(LOGLEVEL_WARN, sprintf("TimezoneUtil::getMSTZnameFromTZName() no MS name found for '%s'. Returning '(GMT) Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London'", $name));
1220        return self::$mstzones["085"][1];
1221    }
1222
1223    /**
1224     * Encodes the tz name to UTF-16 compatible with a syncblob
1225     *
1226     * @param string    $name       timezone name
1227     *
1228     * @access public
1229     * @return string
1230     */
1231    static private function encodeTZName($name) {
1232        return substr(iconv('UTF-8', 'UTF-16', $name),2,-1);
1233    }
1234
1235    /**
1236     * Test to check if $mstzones and $tzonesoffsets can be resolved
1237     * in both directions.
1238     *
1239     * @access public
1240     * @return
1241     */
1242    static public function TZtest() {
1243        foreach (self::$mstzones as $mskey => $msdefs) {
1244            if (!array_key_exists($msdefs[0], self::$tzonesoffsets))
1245                echo "key   '". $msdefs[0]. "'   not found in tzonesoffsets\n";
1246        }
1247
1248        foreach (self::$tzonesoffsets as $tzname => $offset) {
1249            $found = false;
1250            foreach (self::$mstzones as $mskey => $msdefs) {
1251                if ($tzname == $msdefs[0]) {
1252                    $found = true;
1253                    break;
1254                }
1255            }
1256            if (!$found)
1257                echo "key    '$tzname' NOT FOUND\n";
1258        }
1259    }
1260
1261}
1262
1263?>
Note: See TracBrowser for help on using the repository browser.