PageRenderTime 81ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/forum/includes/automatic_dst.php

https://github.com/GreyTeardrop/socionicasys-forum
PHP | 223 lines | 174 code | 27 blank | 22 comment | 14 complexity | 599f448fb8612d2b3a44dbbd9b12f97c MD5 | raw file
Possible License(s): AGPL-1.0, LGPL-3.0, MPL-2.0-no-copyleft-exception
  1. <?php
  2. /**
  3. *
  4. * @package - "Automatic Daylight Savings Time 2"
  5. * @version $Id: automatic_dst.php 9 2009-11-18 MartectX $
  6. * @copyright (C)2008-2009, MartectX ( http://mods.martectx.de/ )
  7. * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  8. *
  9. */
  10. if (!defined('IN_PHPBB'))
  11. {
  12. exit;
  13. }
  14. function automatic_dst_session()
  15. {
  16. if (!defined('AUTOMATIC_DST_TIMEZONE'))
  17. {
  18. global $config, $db, $user;
  19. $user->add_lang('mods/automatic_dst');
  20. if ($user->data['user_id'] != ANONYMOUS)
  21. {
  22. if (is_numeric($user->data['user_timezone']))
  23. {
  24. // Time zone not yet converted, so lets temporarily do just that - if there's no entry to convert to reset to board time
  25. $timetable = automatic_dst_get_timetable();
  26. $user->data['user_timezone'] = ($timetable[$user->data['user_timezone']]) ? $timetable[$user->data['user_timezone']] : AUTOMATIC_DST_BOARD_TIMEZONE;
  27. }
  28. if ($user->data['user_timezone'] != AUTOMATIC_DST_BOARD_TIMEZONE)
  29. {
  30. if (version_compare(PHP_VERSION, '5.2.0', '>'))
  31. {
  32. date_default_timezone_set($user->data['user_timezone']);
  33. $january = new DateTime(date('Y') . '-01-01 12:00:00');
  34. $july = new DateTime(date('Y') . '-07-01 12:00:00');
  35. $offset = ($january->getOffset() < $july->getOffset()) ? $january->getOffset() / 3600 : $july->getOffset() / 3600;
  36. }
  37. else
  38. {
  39. putenv('TZ=' . $user->data['user_timezone']);
  40. $offset = (date('Z', mktime(0, 0, 0, 01, 01)) < date('Z', mktime(0, 0, 0, 07, 01))) ? date('Z', mktime(0, 0, 0, 01, 01)) / 3600 : date('Z', mktime(0, 0, 0, 07, 01)) / 3600;
  41. }
  42. }
  43. else
  44. {
  45. $offset = $config['board_timezone'];
  46. }
  47. define('AUTOMATIC_DST_TIMEZONE', $user->data['user_timezone']);
  48. define('AUTOMATIC_DST_ISDST', date('I'));
  49. // Set all variables you can think of to the automatically determined - you never know which ones may be used by keen MOD authors... ;-)
  50. $user->data['user_timezone'] = $offset;
  51. $user->data['user_dst'] = AUTOMATIC_DST_ISDST;
  52. $user->timezone = $offset * 3600;
  53. $user->dst = AUTOMATIC_DST_ISDST * 3600;
  54. }
  55. else
  56. {
  57. if ($user->data['user_timezone'] != AUTOMATIC_DST_BOARD_TIMEZONE)
  58. {
  59. // Set the time zone of the anonymous user to the board's time zone
  60. $sql = 'UPDATE ' . USERS_TABLE . "
  61. SET user_timezone = '" . AUTOMATIC_DST_BOARD_TIMEZONE . "'
  62. WHERE user_id = " . ANONYMOUS;
  63. $db->sql_query($sql);
  64. $user->data['user_timezone'] = AUTOMATIC_DST_BOARD_TIMEZONE;
  65. }
  66. define('AUTOMATIC_DST_TIMEZONE', AUTOMATIC_DST_BOARD_TIMEZONE);
  67. define('AUTOMATIC_DST_ISDST', AUTOMATIC_DST_BOARD_ISDST);
  68. // Set all variables you can think of to the automatically determined - you never know which ones may be used by keen MOD authors... ;-)
  69. $user->data['user_timezone'] = $config['board_timezone'];
  70. $user->data['user_dst'] = AUTOMATIC_DST_ISDST;
  71. $user->timezone = $config['board_timezone'] * 3600;
  72. $user->dst = AUTOMATIC_DST_ISDST * 3600;
  73. }
  74. }
  75. }
  76. function automatic_dst_cache($timezone)
  77. {
  78. if (is_numeric($timezone))
  79. {
  80. // Time zone not yet converted, so lets temporarily do just that - if there's no entry to convert to reset to GMT
  81. $timetable = automatic_dst_get_timetable();
  82. $timezone = number_format($timezone, 2);
  83. $timezone = ($timetable[$timezone]) ? $timetable[$timezone] : 'Europe/London';
  84. // It's important for the converter that this time zone is temporary, so lets tell it
  85. define('AUTOMATIC_DST_TEMP_TIMEZONE', TRUE);
  86. }
  87. if (version_compare(PHP_VERSION, '5.2.0', '>'))
  88. {
  89. date_default_timezone_set($timezone);
  90. $january = new DateTime(date('Y') . '-01-01 12:00:00');
  91. $july = new DateTime(date('Y') . '-07-01 12:00:00');
  92. $offset = ($january->getOffset() < $july->getOffset()) ? $january->getOffset() / 3600 : $july->getOffset() / 3600;
  93. }
  94. else
  95. {
  96. putenv('TZ=' . $timezone);
  97. $offset = (date('Z', mktime(0, 0, 0, 01, 01)) < date('Z', mktime(0, 0, 0, 07, 01))) ? date('Z', mktime(0, 0, 0, 01, 01)) / 3600 : date('Z', mktime(0, 0, 0, 07, 01)) / 3600;
  98. }
  99. define('AUTOMATIC_DST_BOARD_TIMEZONE', $timezone);
  100. define('AUTOMATIC_DST_BOARD_ISDST', date('I'));
  101. // Return time zone offset
  102. return $offset;
  103. }
  104. function automatic_dst_get_timezones()
  105. {
  106. // From http://us.php.net/manual/en/function.date-default-timezone-set.php#84459
  107. // Credit to Rob Kaper
  108. global $user;
  109. if (version_compare(PHP_VERSION, '5.2.0', '>'))
  110. {
  111. $timezoneslist = DateTimeZone::listAbbreviations();
  112. $cities = array();
  113. foreach($timezoneslist as $key => $zones)
  114. {
  115. foreach($zones as $id => $zone)
  116. {
  117. if (preg_match('/^(Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)\//', $zone['timezone_id']))
  118. {
  119. $cities[$zone['timezone_id']] = strtr($zone['timezone_id'], $user->lang['automatic_dst_timezones']);
  120. }
  121. }
  122. }
  123. }
  124. else
  125. {
  126. // Sad, but that's how it has to be done...
  127. $timezoneslist = array(
  128. 'Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 'Africa/Blantyre', 'Africa/Brazzaville', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Ceuta', 'Africa/Conakry', 'Africa/Dakar', 'Africa/Dar_es_Salaam', 'Africa/Djibouti', 'Africa/Douala', 'Africa/El_Aaiun', 'Africa/Freetown', 'Africa/Gaborone', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Kampala', 'Africa/Khartoum', 'Africa/Kigali', 'Africa/Lagos', 'Africa/Libreville', 'Africa/Luanda', 'Africa/Lusaka', 'Africa/Malabo', 'Africa/Maputo', 'Africa/Maseru', 'Africa/Mbabane', 'Africa/Mogadishu', 'Africa/Monrovia', 'Africa/Nairobi', 'Africa/Ndjamena', 'Africa/Niamey', 'Africa/Nouakchott', 'Africa/Ouagadougou', 'Africa/Porto-Novo', 'Africa/Sao_Tome', 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek',
  129. 'America/Adak', 'America/Anchorage', 'America/Anguilla', 'America/Antigua', 'America/Araguaina', 'America/Argentina/Buenos_Aires', 'America/Argentina/Catamarca', 'America/Argentina/ComodRivadavia', 'America/Argentina/Cordoba', 'America/Argentina/Jujuy', 'America/Argentina/La_Rioja', 'America/Argentina/Mendoza', 'America/Argentina/Rio_Gallegos', 'America/Argentina/San_Juan', 'America/Argentina/Tucuman', 'America/Argentina/Ushuaia', 'America/Aruba', 'America/Asuncion', 'America/Atikokan', 'America/Atka', 'America/Bahia', 'America/Barbados', 'America/Belem', 'America/Belize', 'America/Blanc-Sablon', 'America/Boa_Vista', 'America/Bogota', 'America/Boise', 'America/Buenos_Aires', 'America/Cambridge_Bay', 'America/Campo_Grande', 'America/Cancun', 'America/Caracas', 'America/Catamarca', 'America/Cayenne', 'America/Cayman', 'America/Chicago', 'America/Chihuahua', 'America/Coral_Harbour', 'America/Cordoba', 'America/Costa_Rica', 'America/Cuiaba', 'America/Curacao', 'America/Danmarkshavn', 'America/Dawson', 'America/Dawson_Creek', 'America/Denver', 'America/Detroit', 'America/Dominica', 'America/Edmonton', 'America/Eirunepe', 'America/El_Salvador', 'America/Ensenada', 'America/Fort_Wayne', 'America/Fortaleza', 'America/Glace_Bay', 'America/Godthab', 'America/Goose_Bay', 'America/Grand_Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guatemala', 'America/Guayaquil', 'America/Guyana', 'America/Halifax', 'America/Havana', 'America/Hermosillo', 'America/Indiana/Indianapolis', 'America/Indiana/Knox', 'America/Indiana/Marengo', 'America/Indiana/Petersburg', 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', 'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', 'America/Jujuy', 'America/Juneau', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Knox_IN', 'America/La_Paz', 'America/Lima', 'America/Los_Angeles', 'America/Louisville', 'America/Maceio', 'America/Managua', 'America/Manaus', 'America/Martinique', 'America/Mazatlan', 'America/Mendoza', 'America/Menominee', 'America/Merida', 'America/Mexico_City', 'America/Miquelon', 'America/Moncton', 'America/Monterrey', 'America/Montevideo', 'America/Montreal', 'America/Montserrat', 'America/Nassau', 'America/New_York', 'America/Nipigon', 'America/Nome', 'America/Noronha', 'America/North_Dakota/Center', 'America/North_Dakota/New_Salem', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo', 'America/Phoenix', 'America/Port-au-Prince', 'America/Port_of_Spain', 'America/Porto_Acre', 'America/Porto_Velho', 'America/Puerto_Rico', 'America/Rainy_River', 'America/Rankin_Inlet', 'America/Recife', 'America/Regina', 'America/Rio_Branco', 'America/Rosario', 'America/Santiago', 'America/Santo_Domingo', 'America/Sao_Paulo', 'America/Scoresbysund', 'America/Shiprock', 'America/St_Johns', 'America/St_Kitts', 'America/St_Lucia', 'America/St_Thomas', 'America/St_Vincent', 'America/Swift_Current', 'America/Tegucigalpa', 'America/Thule', 'America/Thunder_Bay', 'America/Tijuana', 'America/Toronto', 'America/Tortola', 'America/Vancouver', 'America/Virgin', 'America/Whitehorse', 'America/Winnipeg', 'America/Yakutat', 'America/Yellowknife',
  130. 'Antarctica/Casey', ' Antarctica/Davis', ' Antarctica/DumontDUrville', ' Antarctica/Mawson', ' Antarctica/McMurdo', ' Antarctica/Palmer', ' Antarctica/Rothera', ' Antarctica/South_Pole', ' Antarctica/Syowa', ' Antarctica/Vostok',
  131. 'Arctic/Longyearbyen',
  132. 'Asia/Aden', 'Asia/Almaty', 'Asia/Amman', 'Asia/Anadyr', 'Asia/Aqtau', 'Asia/Aqtobe', 'Asia/Ashgabat', 'Asia/Ashkhabad', 'Asia/Baghdad', 'Asia/Bahrain', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Beirut', 'Asia/Bishkek', 'Asia/Brunei', 'Asia/Calcutta', 'Asia/Choibalsan', 'Asia/Chongqing', 'Asia/Chungking', 'Asia/Colombo', 'Asia/Dacca', 'Asia/Damascus', 'Asia/Dhaka', 'Asia/Dili', 'Asia/Dubai', 'Asia/Dushanbe', 'Asia/Gaza', 'Asia/Harbin', 'Asia/Hong_Kong', 'Asia/Hovd', 'Asia/Irkutsk', 'Asia/Istanbul', 'Asia/Jakarta', 'Asia/Jayapura', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kashgar', 'Asia/Katmandu', 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuching', 'Asia/Kuwait', 'Asia/Macao', 'Asia/Macau', 'Asia/Magadan', 'Asia/Makassar', 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', 'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', 'Asia/Phnom_Penh', 'Asia/Pontianak', 'Asia/Pyongyang', 'Asia/Qatar', 'Asia/Qyzylorda', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Saigon', 'Asia/Sakhalin', 'Asia/Samarkand', 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tel_Aviv', 'Asia/Thimbu', 'Asia/Thimphu', 'Asia/Tokyo', 'Asia/Ujung_Pandang', 'Asia/Ulaanbaatar', 'Asia/Ulan_Bator', 'Asia/Urumqi', 'Asia/Vientiane', 'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yekaterinburg', 'Asia/Yerevan',
  133. 'Atlantic/Azores', 'Atlantic/Bermuda', 'Atlantic/Canary', 'Atlantic/Cape_Verde', 'Atlantic/Faeroe', 'Atlantic/Faroe', 'Atlantic/Jan_Mayen', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Atlantic/St_Helena', 'Atlantic/Stanley',
  134. 'Australia/ACT', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Broken_Hill', 'Australia/Canberra', 'Australia/Currie', 'Australia/Darwin', 'Australia/Eucla', 'Australia/Hobart', 'Australia/LHI', 'Australia/Lindeman', 'Australia/Lord_Howe', 'Australia/Melbourne', 'Australia/NSW', 'Australia/North', 'Australia/Perth', 'Australia/Queensland', 'Australia/South', 'Australia/Sydney', 'Australia/Tasmania', 'Australia/Victoria', 'Australia/West', 'Australia/Yancowinna',
  135. 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Athens', 'Europe/Belfast', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', 'Europe/Chisinau', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Gibraltar', 'Europe/Guernsey', 'Europe/Helsinki', 'Europe/Isle_of_Man', 'Europe/Istanbul', 'Europe/Jersey', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/Luxembourg', 'Europe/Madrid', 'Europe/Malta', 'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow', 'Europe/Nicosia', 'Europe/Oslo', 'Europe/Paris', 'Europe/Podgorica', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', 'Europe/San_Marino', 'Europe/Sarajevo', 'Europe/Simferopol', 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', 'Europe/Tiraspol', 'Europe/Uzhgorod', 'Europe/Vaduz', 'Europe/Vatican', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich',
  136. 'Indian/Antananarivo', 'Indian/Chagos', 'Indian/Comoro', 'Indian/Kerguelen', 'Indian/Mahe', 'Indian/Maldives', 'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion',
  137. 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', 'Pacific/Fiji', 'Pacific/Galapagos', 'Pacific/Gambier', 'Pacific/Guadalcanal', 'Pacific/Guam', 'Pacific/Honolulu', 'Pacific/Kiritimati', 'Pacific/Kosrae', 'Pacific/Kwajalein', 'Pacific/Majuro', 'Pacific/Marquesas', 'Pacific/Midway', 'Pacific/Nauru', 'Pacific/Niue', 'Pacific/Norfolk', 'Pacific/Noumea', 'Pacific/Pago_Pago', 'Pacific/Pitcairn', 'Pacific/Rarotonga', 'Pacific/Saipan', 'Pacific/Samoa', 'Pacific/Tahiti', 'Pacific/Tongatapu',
  138. );
  139. foreach ($timezoneslist as $zone)
  140. {
  141. $cities[$zone] = strtr($zone, $user->lang['automatic_dst_timezones']);
  142. }
  143. }
  144. // We have to sort the array because of possible translation order changes
  145. asort($cities);
  146. return $cities;
  147. }
  148. function automatic_dst_get_timetable()
  149. {
  150. return array(
  151. /**
  152. * Time zone conversion table (don't flame me if your city isn't here - I had to pick one for every time zone!)
  153. */
  154. '-12.00' => '', // [UTC - 12] Baker Island Time
  155. '-11.00' => 'Pacific/Samoa', // [UTC - 11] Niue Time, Samoa Standard Time
  156. '-10.00' => 'Pacific/Tahiti', // [UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time
  157. '-9.50' => '', // [UTC - 9:30] Marquesas Islands Time
  158. '-9.00' => 'America/Anchorage', // [UTC - 9] Alaska Standard Time, Gambier Island Time
  159. '-8.00' => 'America/Los_Angeles', // [UTC - 8] Pacific Standard Time
  160. '-7.00' => 'America/Denver', // [UTC - 7] Mountain Standard Time
  161. '-6.00' => 'America/Detroit', // [UTC - 6] Central Standard Time
  162. '-5.00' => 'America/Chicago', // [UTC - 5] Eastern Standard Time
  163. '-4.50' => '', // [UTC - 4:30] Venezuelan Standard Time
  164. '-4.00' => 'America/Grenada', // [UTC - 4] Atlantic Standard Time
  165. '-3.50' => '', // [UTC - 3:30] Newfoundland Standard Time
  166. '-3.00' => 'America/Sao_Paulo', // [UTC - 3] Amazon Standard Time, Central Greenland Time
  167. '-2.00' => 'America/Scoresbysund', // [UTC - 2] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time
  168. '-1.00' => 'Atlantic/Cape_Verde', // [UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time
  169. '0.00' => 'Europe/London', // [UTC] Western European Time, Greenwich Mean Time
  170. '1.00' => 'Europe/Berlin', // [UTC + 1] Central European Time, West African Time
  171. '2.00' => 'Europe/Kiev', // [UTC + 2] Eastern European Time, Central African Time
  172. '3.00' => 'Europe/Moscow', // [UTC + 3] Moscow Standard Time, Eastern African Time
  173. '3.50' => 'Asia/Tehran', // [UTC + 3:30] Iran Standard Time
  174. '4.00' => 'Asia/Dubai', // [UTC + 4] Gulf Standard Time, Samara Standard Time
  175. '4.50' => 'Asia/Kabul', // [UTC + 4:30] Afghanistan Time
  176. '5.00' => 'Asia/Karachi', // [UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time
  177. '5.50' => 'Asia/Calcutta', // [UTC + 5:30] Indian Standard Time, Sri Lanka Time
  178. '5.75' => 'Asia/Katmandu', // [UTC + 5:45] Nepal Time
  179. '6.00' => 'Asia/Novosibirsk', // [UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time
  180. '6.50' => 'Asia/Rangoon', // [UTC + 6:30] Cocos Islands Time, Myanmar Time
  181. '7.00' => 'Asia/Bangkok', // [UTC + 7] Indochina Time, Krasnoyarsk Standard Time
  182. '8.00' => 'Asia/Shanghai', // [UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time
  183. '8.75' => '', // [UTC + 8:45] Southeastern Western Australia Standard Time
  184. '9.00' => 'Asia/Tokyo', // [UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time
  185. '9.50' => '', // [UTC + 9:30] Australian Central Standard Time
  186. '10.00' => 'Asia/Vladivostok', // [UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time
  187. '10.50' => 'Australia/Lord_Howe', // [UTC + 10:30] Lord Howe Standard Time
  188. '11.00' => 'Pacific/Guadalcanal', // [UTC + 11] Solomon Island Time, Magadan Standard Time
  189. '11.50' => 'Pacific/Norfolk', // [UTC + 11:30] Norfolk Island Time
  190. '12.00' => 'Pacific/Auckland', // [UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time
  191. '12.75' => 'Pacific/Chatham', // [UTC + 12:45] Chatham Islands Time
  192. '13.00' => 'Pacific/Tongatapu', // [UTC + 13] Tonga Time, Phoenix Islands Time
  193. '14.00' => 'Pacific/Kiritimati' // [UTC + 14] Line Island Time
  194. );
  195. }
  196. ?>