/[drupal]/contributions/modules/event/event.install
ViewVC logotype

Contents of /contributions/modules/event/event.install

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.37 - (show annotations) (download) (as text)
Sun Jul 5 00:34:15 2009 UTC (4 months, 3 weeks ago) by killes
Branch: MAIN
CVS Tags: HEAD
Changes since 1.36: +33 -1 lines
File MIME type: text/x-php
#440670, fix issues with timezones which affected ical
1 <?php
2 // $Id: event.install,v 1.36 2008/12/30 21:44:03 killes Exp $
3
4 /**
5 * We need mysql >= 4.1.1
6 */
7 function event_requirements($phase) {
8 // Ensure translations don't break at install time
9 $t = get_t();
10 global $db_type;
11 $requirements = array();
12 if ($db_type == 'mysql' || $db_type == 'mysqli') {
13 $version = db_version();
14
15 $requirements['mysql_event'] = array(
16 'title' => $t('MySQL database for event module'),
17 'value' => ($phase == 'runtime') ? l($version, 'admin/reports/status/sql') : $version,
18 );
19
20 if (version_compare($version, '4.1.1') < 0) {
21 $requirements['mysql_event']['severity'] = REQUIREMENT_ERROR;
22 $requirements['mysql_event']['description'] = $t('Your MySQL Server is too old. Event module 6.2 requires at least MySQL %version.', array('%version' => '4.1.1'));
23 }
24 }
25
26 return $requirements;
27 }
28
29 /**
30 * Implementation of hook_schema().
31 */
32 function event_schema() {
33 $schema['event'] = array(
34 'fields' => array(
35 'nid' => array(
36 'type' => 'int',
37 'unsigned' => TRUE,
38 'not null' => TRUE,
39 'default' => 0),
40 'event_start' => array(
41 'type' => 'datetime',
42 'not null' => TRUE),
43 'event_end' => array(
44 'type' => 'datetime',
45 'not null' => TRUE),
46 'timezone' => array(
47 'type' => 'int',
48 'not null' => TRUE,
49 'default' => 0),
50 'start_in_dst' => array(
51 'type' => 'int',
52 'not null' => TRUE,
53 'default' => 0),
54 'end_in_dst' => array(
55 'type' => 'int',
56 'not null' => TRUE,
57 'default' => 0),
58 'has_time' => array(
59 'type' => 'int',
60 'not null' => TRUE,
61 'default' => 1),
62 'has_end_date' => array(
63 'type' => 'int',
64 'not null' => TRUE,
65 'default' => 1)
66 ),
67 'indexes' => array(
68 'event_start' => array('event_start'),
69 'event_end' => array('event_end'),
70 'timezone' => array('timezone')
71 ),
72 'primary key' => array('nid'),
73 );
74
75 return $schema;
76 }
77
78 /**
79 * Implementation of hook_install().
80 */
81 function event_install() {
82 drupal_install_schema('event');
83 $ret = array();
84 db_add_field($ret, 'users', 'timezone_id', array('type' => 'int', 'not null' => TRUE, 'default' => 0));
85
86 // Schema API doesn't have a TIME field reverting to old method.
87 switch ($GLOBALS['db_type']) {
88 case 'mysql':
89 case 'mysqli':
90 db_query("CREATE TABLE {event_timezones} (
91 timezone int NOT NULL default '0',
92 name varchar(255) NOT NULL default '',
93 offset TIME NOT NULL default '0',
94 offset_dst TIME NOT NULL default '0',
95 dst_region int NOT NULL default '0',
96 is_dst int NOT NULL default '0',
97 PRIMARY KEY (timezone)
98 ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
99 break;
100 case 'pgsql':
101 db_query("CREATE TABLE {event_timezones} (
102 timezone integer NOT NULL default '0',
103 name varchar(255) NOT NULL default '',
104 \"offset\" interval NOT NULL default '0 seconds',
105 offset_dst interval NOT NULL default '0 seconds',
106 dst_region integer NOT NULL default '0',
107 is_dst integer NOT NULL default '0',
108 PRIMARY KEY (timezone)
109 ) ");
110 break;
111 }
112 $zones = event_install_timezones();
113 foreach ($zones as $zone => $value) {
114 switch ($GLOBALS['db_type']) {
115 case 'mysql':
116 case 'mysqli':
117 db_query("INSERT INTO {event_timezones} (timezone, name, offset, offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
118 break;
119 case 'pgsql':
120 db_query("INSERT INTO {event_timezones} (timezone, name, \"offset\", offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
121 break;
122 }
123 }
124 variable_del('event_range_prev');
125 variable_del('event_range_next');
126
127 // Create default event type
128 $type = array(
129 'type' => 'event',
130 'name' => t('Event'),
131 'module' => 'node',
132 'description' => t('Events have a start date and an optional end date as well as a teaser and a body. They can be extended by other modules, too.'),
133 'custom' => TRUE,
134 'modified' => TRUE,
135 'locked' => FALSE,
136 );
137 $type = (object) _node_type_set_defaults($type);
138 node_type_save($type);
139 variable_set('event_nodeapi_event', 'all');
140
141 // Notify of changes
142 drupal_set_message(t('Event module was successfully installed with default options. To customize event and/or location settings for events, please view the <a href="!settings">event content type settings page</a>. Make sure to <a href="!url">select the default timezone</a> for your website before creating events.', array('!settings' => url('admin/content/node-type/event'), '!url' => url('admin/settings/date-time'))));
143 drupal_set_message('A content type "event" was created.');
144 }
145
146 /**
147 * Implementation of hook_uninstall().
148 */
149 function event_uninstall() {
150 $ret = array();
151 drupal_uninstall_schema('event');
152 db_drop_field($ret, 'users', 'timezone_id');
153 db_query('DROP TABLE {event_timezones}');
154 variable_del('event_timezone_input');
155 variable_del('event_timezone_display');
156 variable_del('event_ampm');
157 variable_del('event_upcoming_limit');
158 variable_del('event_overview');
159 variable_del('event_table_duration');
160 variable_del('event_taxonomy_control');
161 variable_del('event_type_control');
162 variable_del('event_range_prev');
163 variable_del('event_range_next');
164 foreach (node_get_types() as $type => $info) {
165 variable_del('event_nodeapi_'. $type);
166 }
167
168 drupal_set_message(t('Event module successfully uninstalled'));
169 }
170
171
172 /**
173 * Update 4.7 or 5.1 to 5.2
174 */
175 function event_update_3() {
176 $ret = array();
177 variable_del('event_range_prev');
178 variable_del('event_range_next');
179
180 switch ($GLOBALS['db_type']) {
181 case 'mysql':
182 case 'mysqli':
183 $ret[] = update_sql("RENAME TABLE {event} TO {event_backup}");
184 $ret[] = update_sql("CREATE TABLE {event_timezones} (
185 timezone int NOT NULL default '0',
186 name varchar(255) NOT NULL default '',
187 offset TIME NOT NULL default '0',
188 offset_dst TIME NOT NULL default '0',
189 dst_region int NOT NULL default '0',
190 PRIMARY KEY (timezone)
191 ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
192 $zones = event_install_timezones();
193 foreach ($zones as $zone => $value) {
194 db_query("INSERT INTO {event_timezones} (timezone, name, offset, offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
195 }
196
197 $ret[] = update_sql("CREATE TABLE {event} (
198 nid int(10) unsigned NOT NULL default '0',
199 event_start datetime NOT NULL,
200 event_end datetime NOT NULL,
201 timezone int NOT NULL default '0',
202 start_in_dst int NOT NULL default '0',
203 end_in_dst int NOT NULL default '0'
204 ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
205
206 $ret[] = update_sql("SET time_zone = '+00:00'");
207 $sql = "INSERT INTO {event} (nid, event_start, event_end, timezone, start_in_dst, end_in_dst) SELECT e.nid, IF(%cond_start, FROM_UNIXTIME(e.event_start) + INTERVAL ez.offset_dst HOUR_SECOND, FROM_UNIXTIME(e.event_start) + INTERVAL ez.offset HOUR_SECOND) AS event_start, IF(%cond_end, FROM_UNIXTIME(e.event_end) + INTERVAL ez.offset_dst HOUR_SECOND, FROM_UNIXTIME(e.event_end) + INTERVAL ez.offset HOUR_SECOND) AS event_end, e.timezone, IF(%cond_start, 1, 0), IF(%cond_end, 1, 0) FROM {event_backup} e INNER JOIN {event_timezones} ez ON e.timezone = ez.timezone WHERE ez.dst_region = %d";
208 // Loop over the 21 supported DST regions.
209 for ($i = 0; $i <= 20; $i++) {
210 if ($i == 0) {
211 $ret[] = update_sql("INSERT INTO {event} (nid, event_start, event_end, timezone, start_in_dst, end_in_dst) SELECT e.nid, FROM_UNIXTIME(e.event_start) + INTERVAL ez.offset HOUR_SECOND AS event_start, FROM_UNIXTIME(e.event_end) + INTERVAL ez.offset HOUR_SECOND AS event_end, e.timezone, 0, 0 FROM {event_backup} e INNER JOIN {event_timezones} ez ON e.timezone = ez.timezone WHERE ez.dst_region = 0");
212 }
213 else {
214 $start = str_replace('%date', 'e.event_start', _event_install_get_dst_dates($i));
215 $end = str_replace('%date', 'e.event_end', _event_install_get_dst_dates($i));
216 $ret[] = update_sql(str_replace(array('%cond_start', '%cond_end', '%d'), array($start, $end, $i), $sql));
217 }
218 }
219
220 $ret[] = update_sql('ALTER TABLE {event} ADD PRIMARY KEY nid (nid)');
221 $ret[] = update_sql('ALTER TABLE {event} ADD KEY timezone (timezone)');
222 $ret[] = update_sql("ALTER TABLE {users} ADD timezone_id int NOT NULL default '0'");
223 break;
224 case 'pgsql':
225 $ret[] = update_sql("ALTER TABLE {event} RENAME TO {event_backup}");
226
227 $ret[] = update_sql("CREATE TABLE {event_timezones} (
228 timezone integer NOT NULL default '0',
229 name varchar(255) NOT NULL default '',
230 \"offset\" interval NOT NULL default '0 seconds',
231 offset_dst interval NOT NULL default '0 seconds',
232 dst_region integer NOT NULL default '0',
233 PRIMARY KEY (timezone)
234 ) ");
235 $zones = event_install_timezones();
236 foreach ($zones as $zone => $value) {
237 db_query("INSERT INTO {event_timezones} (timezone, name, \"offset\", offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
238 }
239
240 db_query("CREATE TABLE {event} (
241 nid integer NOT NULL default '0',
242 event_start timestamp NOT NULL,
243 event_end timestamp NOT NULL,
244 timezone integer NOT NULL default '0',
245 start_in_dst integer NOT NULL default '0',
246 end_in_dst integer NOT NULL default '0'
247 ) ");
248
249 // needs work?
250 $sql = "INSERT INTO {event} (nid, event_start, event_end, timezone, start_in_dst, end_in_dst) SELECT e.nid, IF(%cond_start, TIMESTAMP 'epoch' + event_start * INTERVAL '1 second' + ez.offset_dst, TIMESTAMP 'epoch' + event_start * INTERVAL '1 second' + ez.offset) AS event_start, IF(%cond_end, TIMESTAMP 'epoch' + event_end * INTERVAL '1 second' + ez.offset_dst, TIMESTAMP 'epoch' + event_end * INTERVAL '1 second' + ez.offset) AS event_end, e.timezone, IF(%cond_start, 1, 0), IF(%cond_end, 1, 0) FROM {event_backup} e INNER JOIN {event_timezones} ez ON e.timezone = ez.timezone WHERE ez.dst_region = %d";
251
252 // Loop over the 21 supported DST regions.
253 for ($i = 0; $i <= 20; $i++) {
254 if ($i == 0) {
255 // needs work?
256 $ret[] = update_sql("INSERT INTO {event} (nid, event_start, event_end, timezone, start_in_dst, end_in_dst) SELECT e.nid, TIMESTAMP 'epoch' + event_start * INTERVAL '1 second' + ez.offset AS event_start, TIMESTAMP 'epoch' + event_end * INTERVAL '1 second' + ez.offset AS event_end, e.timezone, 0, 0 FROM {event_backup} e INNER JOIN {event_timezones} ez ON e.timezone = ez.timezone WHERE ez.dst_region = 0");
257 }
258 else {
259 $start = str_replace('%date', 'e.event_start', _event_install_get_dst_dates($i));
260 $end = str_replace('%date', 'e.event_end', _event_install_get_dst_dates($i));
261 $ret[] = update_sql(str_replace(array('%cond_start', '%cond_end', '%d'), array($start, $end, $i), $sql));
262 }
263 }
264
265 $ret[] = update_sql('ALTER TABLE {event} ADD PRIMARY KEY (nid)');
266 $ret[] = update_sql('CREATE INDEX {event}_timezone_idx ON {event} (timezone)');
267 $ret[] = update_sql("ALTER TABLE {users} ADD timezone_id integer NOT NULL default '0'");
268 break;
269 }
270 return $ret;
271 }
272
273 /**
274 * Replace basicevent module if installed
275 */
276 function event_update_4() {
277 $is_existing = db_result(db_query("SELECT * FROM {node_type} WHERE type = '%s'", 'event'));
278 if ($is_existing != 1) {
279 // Create default event type
280 $type = array(
281 'type' => 'event',
282 'name' => t('Event'),
283 'module' => 'node',
284 'description' => t('Events have a start date and an optional end date as well as a teaser and a body. They can be extended by other modules, too.'),
285 'custom' => TRUE,
286 'modified' => TRUE,
287 'locked' => FALSE,
288 );
289 $type = (object) _node_type_set_defaults($type);
290 node_type_save($type);
291 variable_set('event_nodeapi_event', 'all');
292 drupal_set_message('A content type "event" was created.');
293 }
294 $basicevent = db_result(db_query("SELECT * FROM {system} WHERE name = '%s' AND status = 1", 'basicevent'));
295 if ($basicevent) {
296 db_query("UPDATE {system} SET status = 0 WHERE name = '%s'", 'basicevent');
297 drupal_set_message(t('The basicevent module is no longer supported, it was disabled during the upgrade process.'));
298 }
299
300 $basicevent = db_result(db_query("SELECT * FROM {node_type} WHERE module = '%s'", 'basicevent'));
301 if ($basicevent) {
302 db_query("UPDATE {node_type} SET module = 'node' WHERE module = '%s'", 'basicevent');
303 }
304
305 return array();
306 }
307
308 /**
309 * Set DST
310 */
311 function event_update_5() {
312 $ret = array();
313 switch ($GLOBALS['db_type']) {
314 case 'pgsql':
315 db_add_column($ret, 'event_timezones', 'is_dst', 'integer', array('default' => 0, 'not null' => TRUE));
316 break;
317 case 'mysql':
318 case 'mysqli':
319 $ret[] = update_sql("ALTER TABLE {event_timezones} ADD is_dst int NOT NULL default 0");
320 break;
321 }
322 // There's a bug in core that will runn this update funcvtion even
323 // if the module is not enabled.
324 if (!function_exists('_event_user_time')) {
325 include_once(drupal_get_path('module', 'event') .'/event.module');
326 }
327 $time = _event_user_time();
328 // Loop over the 21 supported DST regions.
329 for ($i = 0; $i <= 20; $i++) {
330 $is_dst = event_is_dst($i, $time);
331 $ret[] = update_sql("UPDATE {event_timezones} SET is_dst = $is_dst WHERE dst_region = $i");
332 }
333 return $ret;
334 }
335
336 /**
337 * Add keys
338 */
339 function event_update_6() {
340 $ret = array();
341 switch ($GLOBALS['db_type']) {
342 case 'pgsql':
343 $ret[] = update_sql('CREATE INDEX {event}_event_start_idx ON {event} (event_start)');
344 $ret[] = update_sql('CREATE INDEX {event}_event_end_idx ON {event} (event_end)');
345 break;
346 case 'mysql':
347 case 'mysqli':
348 $ret[] = update_sql("ALTER TABLE {event} ADD KEY event_start (event_start)");
349 $ret[] = update_sql("ALTER TABLE {event} ADD KEY event_end (event_end)");
350 break;
351 }
352 return $ret;
353 }
354
355 /**
356 * Add all_day/end_date columns
357 */
358 function event_update_7() {
359 $ret = array();
360 switch ($GLOBALS['db_type']) {
361 case 'pgsql':
362 db_add_column($ret, 'event', 'has_time', 'integer', array('default' => 1, 'not null' => TRUE));
363 db_add_column($ret, 'event', 'has_end_date', 'integer', array('default' => 1, 'not null' => TRUE));
364 break;
365 case 'mysql':
366 case 'mysqli':
367 $ret[] = update_sql("ALTER TABLE {event} ADD has_time int NOT NULL default 1");
368 $ret[] = update_sql("ALTER TABLE {event} ADD has_end_date int NOT NULL default 1");
369 break;
370 }
371 return $ret;
372 }
373
374 /**
375 * Update all_day/end_date columns
376 */
377 function event_update_8() {
378 $ret = array();
379 switch ($GLOBALS['db_type']) {
380 case 'pgsql':
381 $ret[] = update_sql('UPDATE {event} SET has_end_date = 0 WHERE event_start = event_end');
382 // TODO: Check
383 $ret[] = update_sql("UPDATE {event} SET has_time = 0 WHERE EXTRACT(HOUR_SECOND FROM event_start) = 0 AND EXTRACT(HOUR_SECOND FROM event_end) = 235900");
384 break;
385 case 'mysql':
386 case 'mysqli':
387 $ret[] = update_sql('UPDATE {event} SET has_end_date = 0 WHERE event_start = event_end');
388 $ret[] = update_sql("UPDATE {event} SET has_time = 0 WHERE EXTRACT(HOUR_SECOND FROM event_start) = 0 AND EXTRACT(HOUR_SECOND FROM event_end) = 235900");
389 break;
390 }
391 return $ret;
392 }
393
394 /**
395 * Fix broken event_timezones table
396 */
397 function event_update_6000() {
398 db_query('DROP TABLE {event_timezones}');
399 // Schema API doesn't have a TIME field reverting to old method.
400 switch ($GLOBALS['db_type']) {
401 case 'mysql':
402 case 'mysqli':
403 db_query("CREATE TABLE {event_timezones} (
404 timezone int NOT NULL default '0',
405 name varchar(255) NOT NULL default '',
406 offset TIME NOT NULL default '0',
407 offset_dst TIME NOT NULL default '0',
408 dst_region int NOT NULL default '0',
409 is_dst int NOT NULL default '0',
410 PRIMARY KEY (timezone)
411 ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
412 break;
413 case 'pgsql':
414 db_query("CREATE TABLE {event_timezones} (
415 timezone integer NOT NULL default '0',
416 name varchar(255) NOT NULL default '',
417 \"offset\" interval NOT NULL default '0 seconds',
418 offset_dst interval NOT NULL default '0 seconds',
419 dst_region integer NOT NULL default '0',
420 is_dst integer NOT NULL default '0',
421 PRIMARY KEY (timezone)
422 ) ");
423 break;
424 }
425 $zones = event_install_timezones();
426 foreach ($zones as $zone => $value) {
427 switch ($GLOBALS['db_type']) {
428 case 'mysql':
429 case 'mysqli':
430 db_query("INSERT INTO {event_timezones} (timezone, name, offset, offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
431 break;
432 case 'pgsql':
433 db_query("INSERT INTO {event_timezones} (timezone, name, \"offset\", offset_dst, dst_region) VALUES (%d, '%s', '%s', '%s', %d)", $zone, $value['timezone'], $value['offset'], $value['offset_dst'], $value['dst_region']);
434 break;
435 }
436 }
437 return array();
438 }
439
440 /**
441 * Truncate cache because of new theme functions.
442 */
443 function event_update_6001() {
444 db_query('TRUNCATE {cache}');
445 return array();
446 }
447
448 /**
449 * Truncate cache because of new theme functions.
450 */
451 function event_update_6002() {
452 db_query('TRUNCATE {cache}');
453 return array();
454 }
455
456 /**
457 * Truncate cache because of new theme functions.
458 */
459 function event_update_6003() {
460 db_query('TRUNCATE {cache}');
461 return array();
462 }
463
464 /**
465 * Update DST in timezones, might be screwed up.
466 */
467 function event_update_6004() {
468 include_once(drupal_get_path('module', 'event') .'/event.module');
469 $timezones = event_install_timezones();
470 foreach ($timezones as $id => $timezone) {
471 $timezone = event_zonelist_by_id($id);
472 $status = event_is_dst($timezone['dst_region'], gmdate('Y-m-d H:i', time()));
473 db_query('UPDATE {event_timezones} SET is_dst = %d WHERE timezone = %d', $status, $id);
474 }
475 return array();
476 }
477
478 /**
479 * Update DST in events, might be screwed up.
480 */
481 function event_update_6005() {
482 include_once(drupal_get_path('module', 'event') .'/event.module');
483 // get all events
484 $result = db_query('SELECT e.* FROM {event} e');
485 while ($event = db_fetch_object($result)) {
486 $timezone = event_zonelist_by_id($event->timezone);
487 $status_start = event_is_dst($timezone['dst_region'], $event->event_start);
488 $status_end = event_is_dst($timezone['dst_region'], $event->event_end);
489 if ($event->start_in_dst != $status_start || $event->end_in_dst != $status_end) {
490 db_query('UPDATE {event} SET start_in_dst = %d, end_in_dst = %d WHERE nid = %d', $status_start, $status_end, $event->nid);
491 }
492 }
493 return array();
494 }
495
496 /**
497 * Timezones table used only during installation.
498 */
499 function event_install_timezones() {
500 return array(1 => array('timezone' => 'Africa/Addis Ababa', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
501 2 => array('timezone' => 'Africa/Algiers', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
502 3 => array('timezone' => 'Africa/Asmera', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
503 4 => array('timezone' => 'Africa/Bangui', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
504 5 => array('timezone' => 'Africa/Blantyre', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
505 6 => array('timezone' => 'Africa/Brazzaville', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
506 7 => array('timezone' => 'Africa/Bujumbura', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
507 8 => array('timezone' => 'Africa/Cairo', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '1'),
508 9 => array('timezone' => 'Africa/Ceuta', 'offset' => '1:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '1'),
509 10 => array('timezone' => 'Africa/Dar es Salaam', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
510 11 => array('timezone' => 'Africa/Djibouti', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
511 12 => array('timezone' => 'Africa/Douala', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
512 13 => array('timezone' => 'Africa/Gaborone', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
513 14 => array('timezone' => 'Africa/Harare', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
514 15 => array('timezone' => 'Africa/Johannesburg', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
515 16 => array('timezone' => 'Africa/Kampala', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
516 17 => array('timezone' => 'Africa/Khartoum', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
517 18 => array('timezone' => 'Africa/Kigali', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
518 19 => array('timezone' => 'Africa/Kinshasa', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
519 20 => array('timezone' => 'Africa/Lagos', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
520 21 => array('timezone' => 'Africa/Libreville', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
521 22 => array('timezone' => 'Africa/Luanda', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
522 23 => array('timezone' => 'Africa/Lubumbashi', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
523 24 => array('timezone' => 'Africa/Lusaka', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
524 25 => array('timezone' => 'Africa/Malabo', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
525 26 => array('timezone' => 'Africa/Maputo', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
526 27 => array('timezone' => 'Africa/Maseru', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
527 28 => array('timezone' => 'Africa/Mbabane', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
528 29 => array('timezone' => 'Africa/Mogadishu', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
529 30 => array('timezone' => 'Africa/Nairobi', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
530 31 => array('timezone' => 'Africa/Ndjamena', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
531 32 => array('timezone' => 'Africa/Niamey', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
532 33 => array('timezone' => 'Africa/Porto-Novo', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
533 34 => array('timezone' => 'Africa/Tripoli', 'offset' => '2:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '0'),
534 35 => array('timezone' => 'Africa/Tunis', 'offset' => '1:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '0'),
535 36 => array('timezone' => 'Africa/Windhoek', 'offset' => '2:00:00', 'offset_dst' => '1:00:00', 'dst_region' => '2'),
536 37 => array('timezone' => 'America/Adak', 'offset' => '-10:00:00', 'offset_dst' => '-9:00:00', 'dst_region' => '15'),
537 38 => array('timezone' => 'America/Anchorage', 'offset' => '-9:00:00', 'offset_dst' => '-8:00:00', 'dst_region' => '15'),
538 39 => array('timezone' => 'America/Anguilla', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
539 40 => array('timezone' => 'America/Antigua', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
540 41 => array('timezone' => 'America/Araguaina', 'offset' => '-2:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '17'),
541 42 => array('timezone' => 'America/Aruba', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
542 43 => array('timezone' => 'America/Asuncion', 'offset' => '-3:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '20'),
543 44 => array('timezone' => 'America/Atka', 'offset' => '-10:00:00', 'offset_dst' => '-9:00:00', 'dst_region' => '15'),
544 45 => array('timezone' => 'America/Barbados', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
545 46 => array('timezone' => 'America/Belem', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
546 47 => array('timezone' => 'America/Belize', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
547 48 => array('timezone' => 'America/Boa Vista', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
548 49 => array('timezone' => 'America/Bogota', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
549 50 => array('timezone' => 'America/Boise', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
550 51 => array('timezone' => 'America/Buenos Aires', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
551 52 => array('timezone' => 'America/Cambridge Bay', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
552 53 => array('timezone' => 'America/Cancun', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
553 54 => array('timezone' => 'America/Caracas', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
554 55 => array('timezone' => 'America/Catamarca', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
555 56 => array('timezone' => 'America/Cayenne', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
556 57 => array('timezone' => 'America/Cayman', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
557 58 => array('timezone' => 'America/Chicago', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
558 59 => array('timezone' => 'America/Chihuahua', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
559 60 => array('timezone' => 'America/Cordoba', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
560 61 => array('timezone' => 'America/Costa Rica', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
561 62 => array('timezone' => 'America/Cuiaba', 'offset' => '-3:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '17'),
562 63 => array('timezone' => 'America/Curacao', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
563 64 => array('timezone' => 'America/Dawson', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
564 65 => array('timezone' => 'America/Dawson Creek', 'offset' => '-7:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '0'),
565 66 => array('timezone' => 'America/Denver', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
566 67 => array('timezone' => 'America/Detroit', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
567 68 => array('timezone' => 'America/Dominica', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
568 69 => array('timezone' => 'America/Edmonton', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
569 70 => array('timezone' => 'America/Eirunepe', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
570 71 => array('timezone' => 'America/El Salvador', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
571 72 => array('timezone' => 'America/Ensenada', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
572 73 => array('timezone' => 'America/Fort Wayne', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
573 74 => array('timezone' => 'America/Fortaleza', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
574 75 => array('timezone' => 'America/Glace Bay', 'offset' => '-4:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '15'),
575 76 => array('timezone' => 'America/Godthab', 'offset' => '-3:00:00', 'offset_dst' => '-2:00:00', 'dst_region' => '15'),
576 77 => array('timezone' => 'America/Goose Bay', 'offset' => '-4:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '15'),
577 78 => array('timezone' => 'America/Grand Turk', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '16'),
578 79 => array('timezone' => 'America/Grenada', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
579 80 => array('timezone' => 'America/Guadeloupe', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
580 81 => array('timezone' => 'America/Guatemala', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
581 82 => array('timezone' => 'America/Guayaquil', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
582 83 => array('timezone' => 'America/Guyana', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
583 84 => array('timezone' => 'America/Halifax', 'offset' => '-4:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '15'),
584 85 => array('timezone' => 'America/Havana', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '16'),
585 86 => array('timezone' => 'America/Hermosillo', 'offset' => '-7:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '0'),
586 87 => array('timezone' => 'America/Indiana/Indianapolis', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
587 88 => array('timezone' => 'America/Indiana/Knox', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
588 89 => array('timezone' => 'America/Indiana/Marengo', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
589 90 => array('timezone' => 'America/Indiana/Vevay', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
590 91 => array('timezone' => 'America/Indianapolis', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
591 92 => array('timezone' => 'America/Inuvik', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
592 93 => array('timezone' => 'America/Iqaluit', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
593 94 => array('timezone' => 'America/Jamaica', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
594 95 => array('timezone' => 'America/Jujuy', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
595 96 => array('timezone' => 'America/Juneau', 'offset' => '-9:00:00', 'offset_dst' => '-8:00:00', 'dst_region' => '15'),
596 97 => array('timezone' => 'America/Kentucky/Louisville', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
597 98 => array('timezone' => 'America/Kentucky/Monticello', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
598 99 => array('timezone' => 'America/Knox IN', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
599 100 => array('timezone' => 'America/La Paz', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
600 101 => array('timezone' => 'America/Lima', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
601 102 => array('timezone' => 'America/Los Angeles', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
602 103 => array('timezone' => 'America/Louisville', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
603 104 => array('timezone' => 'America/Maceio', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
604 105 => array('timezone' => 'America/Managua', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
605 106 => array('timezone' => 'America/Manaus', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
606 107 => array('timezone' => 'America/Martinique', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
607 108 => array('timezone' => 'America/Mazatlan', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
608 109 => array('timezone' => 'America/Mendoza', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
609 110 => array('timezone' => 'America/Menominee', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
610 111 => array('timezone' => 'America/Merida', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
611 112 => array('timezone' => 'America/Mexico City', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
612 113 => array('timezone' => 'America/Miquelon', 'offset' => '-3:00:00', 'offset_dst' => '-2:00:00', 'dst_region' => '15'),
613 114 => array('timezone' => 'America/Monterrey', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
614 115 => array('timezone' => 'America/Montevideo', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
615 116 => array('timezone' => 'America/Montreal', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
616 117 => array('timezone' => 'America/Montserrat', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
617 118 => array('timezone' => 'America/Nassau', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
618 119 => array('timezone' => 'America/New York', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
619 120 => array('timezone' => 'America/Nipigon', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
620 121 => array('timezone' => 'America/Nome', 'offset' => '-9:00:00', 'offset_dst' => '-8:00:00', 'dst_region' => '15'),
621 122 => array('timezone' => 'America/Noronha', 'offset' => '-2:00:00', 'offset_dst' => '-2:00:00', 'dst_region' => '0'),
622 123 => array('timezone' => 'America/Panama', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
623 124 => array('timezone' => 'America/Pangnirtung', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
624 125 => array('timezone' => 'America/Paramaribo', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
625 126 => array('timezone' => 'America/Phoenix', 'offset' => '-7:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '0'),
626 127 => array('timezone' => 'America/Port-au-Prince', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
627 128 => array('timezone' => 'America/Port of Spain', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
628 129 => array('timezone' => 'America/Porto Acre', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
629 130 => array('timezone' => 'America/Porto Velho', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
630 131 => array('timezone' => 'America/Puerto Rico', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
631 132 => array('timezone' => 'America/Rainy River', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
632 133 => array('timezone' => 'America/Rankin Inlet', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
633 134 => array('timezone' => 'America/Recife', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
634 135 => array('timezone' => 'America/Regina', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
635 136 => array('timezone' => 'America/Rio Branco', 'offset' => '-5:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '0'),
636 137 => array('timezone' => 'America/Rosario', 'offset' => '-3:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '0'),
637 138 => array('timezone' => 'America/Santiago', 'offset' => '-3:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
638 139 => array('timezone' => 'America/Santo Domingo', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
639 140 => array('timezone' => 'America/Sao Paulo', 'offset' => '-2:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '15'),
640 141 => array('timezone' => 'America/Scoresbysund', 'offset' => '-1:00:00', 'offset_dst' => '00:00:00', 'dst_region' => '15'),
641 142 => array('timezone' => 'America/Shiprock', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
642 143 => array('timezone' => 'America/St Johns', 'offset' => '-3:30:00', 'offset_dst' => '-2:30:00', 'dst_region' => '15'),
643 144 => array('timezone' => 'America/St Kitts', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
644 145 => array('timezone' => 'America/St Lucia', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
645 146 => array('timezone' => 'America/St Thomas', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
646 147 => array('timezone' => 'America/St Vincent', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
647 148 => array('timezone' => 'America/Swift Current', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
648 149 => array('timezone' => 'America/Tegucigalpa', 'offset' => '-6:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '0'),
649 150 => array('timezone' => 'America/Thule', 'offset' => '-4:00:00', 'offset_dst' => '-3:00:00', 'dst_region' => '15'),
650 151 => array('timezone' => 'America/Thunder Bay', 'offset' => '-5:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '15'),
651 152 => array('timezone' => 'America/Tijuana', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
652 153 => array('timezone' => 'America/Tortola', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
653 154 => array('timezone' => 'America/Vancouver', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
654 155 => array('timezone' => 'America/Virgin', 'offset' => '-4:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '0'),
655 156 => array('timezone' => 'America/Whitehorse', 'offset' => '-8:00:00', 'offset_dst' => '-7:00:00', 'dst_region' => '15'),
656 157 => array('timezone' => 'America/Winnipeg', 'offset' => '-6:00:00', 'offset_dst' => '-5:00:00', 'dst_region' => '15'),
657 158 => array('timezone' => 'America/Yakutat', 'offset' => '-9:00:00', 'offset_dst' => '-8:00:00', 'dst_region' => '15'),
658 159 => array('timezone' => 'America/Yellowknife', 'offset' => '-7:00:00', 'offset_dst' => '-6:00:00', 'dst_region' => '15'),
659 160 => array('timezone' => 'Antarctica/Casey', 'offset' => '8:00:00', 'offset_dst' => '8:00:00', 'dst_region' => '0'),
660 161 => array('timezone' => 'Antarctica/Davis', 'offset' => '7:00:00', 'offset_dst' => '7:00:00', 'dst_region' => '0'),
661 162 => array('timezone' => 'Antarctica/DumontDUrville', 'offset' => '10:00:00', 'offset_dst' => '10:00:00', 'dst_region' => '0'),
662 163 => array('timezone' => 'Antarctica/Mawson', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
663 164 => array('timezone' => 'Antarctica/McMurdo', 'offset' => '13:00:00', 'offset_dst' => '12:00:00', 'dst_region' => '11'),
664 165 => array('timezone' => 'Antarctica/Palmer', 'offset' => '-3:00:00', 'offset_dst' => '-4:00:00', 'dst_region' => '18'),
665 166 => array('timezone' => 'Antarctica/South Pole', 'offset' => '13:00:00', 'offset_dst' => '12:00:00', 'dst_region' => '11'),
666 167 => array('timezone' => 'Antarctica/Syowa', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
667 168 => array('timezone' => 'Antarctica/Vostok', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
668 169 => array('timezone' => 'Arctic/Longyearbyen', 'offset' => '1:00:00', 'offset_dst' => '2:00:00', 'dst_region' => '14'),
669 170 => array('timezone' => 'Asia/Aden', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
670 171 => array('timezone' => 'Asia/Almaty', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
671 172 => array('timezone' => 'Asia/Amman', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '8'),
672 173 => array('timezone' => 'Asia/Anadyr', 'offset' => '12:00:00', 'offset_dst' => '13:00:00', 'dst_region' => '3'),
673 174 => array('timezone' => 'Asia/Aqtau', 'offset' => '4:00:00', 'offset_dst' => '5:00:00', 'dst_region' => '3'),
674 175 => array('timezone' => 'Asia/Aqtobe', 'offset' => '5:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '3'),
675 176 => array('timezone' => 'Asia/Ashgabat', 'offset' => '5:00:00', 'offset_dst' => '5:00:00', 'dst_region' => '0'),
676 177 => array('timezone' => 'Asia/Ashkhabad', 'offset' => '5:00:00', 'offset_dst' => '5:00:00', 'dst_region' => '0'),
677 178 => array('timezone' => 'Asia/Baghdad', 'offset' => '3:00:00', 'offset_dst' => '4:00:00', 'dst_region' => '4'),
678 179 => array('timezone' => 'Asia/Bahrain', 'offset' => '3:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '0'),
679 180 => array('timezone' => 'Asia/Baku', 'offset' => '4:00:00', 'offset_dst' => '5:00:00', 'dst_region' => '3'),
680 181 => array('timezone' => 'Asia/Bangkok', 'offset' => '7:00:00', 'offset_dst' => '7:00:00', 'dst_region' => '0'),
681 182 => array('timezone' => 'Asia/Beirut', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '6'),
682 183 => array('timezone' => 'Asia/Bishkek', 'offset' => '5:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '6'),
683 184 => array('timezone' => 'Asia/Brunei', 'offset' => '8:00:00', 'offset_dst' => '8:00:00', 'dst_region' => '0'),
684 185 => array('timezone' => 'Asia/Calcutta', 'offset' => '5:30:00', 'offset_dst' => '5:30:30', 'dst_region' => '0'),
685 186 => array('timezone' => 'Asia/Chungking', 'offset' => '8:00:00', 'offset_dst' => '8:00:00', 'dst_region' => '0'),
686 187 => array('timezone' => 'Asia/Colombo', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
687 188 => array('timezone' => 'Asia/Dacca', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
688 189 => array('timezone' => 'Asia/Damascus', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '4'),
689 190 => array('timezone' => 'Asia/Dhaka', 'offset' => '6:00:00', 'offset_dst' => '6:00:00', 'dst_region' => '0'),
690 191 => array('timezone' => 'Asia/Dili', 'offset' => '9:00:00', 'offset_dst' => '9:00:00', 'dst_region' => '0'),
691 192 => array('timezone' => 'Asia/Dubai', 'offset' => '4:00:00', 'offset_dst' => '4:00:00', 'dst_region' => '0'),
692 193 => array('timezone' => 'Asia/Dushanbe', 'offset' => '5:00:00', 'offset_dst' => '5:00:00', 'dst_region' => '0'),
693 194 => array('timezone' => 'Asia/Gaza', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '7'),
694 195 => array('timezone' => 'Asia/Harbin', 'offset' => '8:00:00', 'offset_dst' => '8:00:00', 'dst_region' => '0'),
695 196 => array('timezone' => 'Asia/Hong Kong', 'offset' => '8:00:00', 'offset_dst' => '8:00:00', 'dst_region' => '0'),
696 197 => array('timezone' => 'Asia/Hovd', 'offset' => '7:00:00', 'offset_dst' => '7:00:00', 'dst_region' => '0'),
697 198 => array('timezone' => 'Asia/Irkutsk', 'offset' => '8:00:00', 'offset_dst' => '9:00:00', 'dst_region' => '3'),
698 199 => array('timezone' => 'Asia/Istanbul', 'offset' => '2:00:00', 'offset_dst' => '3:00:00', 'dst_region' => '3'),
699 200 => array('timezone' => 'Asia/Jakarta', 'offset' => '7:00:00', 'offset_dst' => '7:00:00', 'dst_region' => '0'),
700 201 => array('timezone' => 'Asia/Jayapura'