Я ищу способ генерации списка часовых поясов для отображения в <select>
Создание выпадающего списка часовых поясов с помощью PHP
$list = DateTimeZone::listAbbreviations(); $idents = DateTimeZone::listIdentifiers(); $data = $offset = $added = array(); foreach ($list as $abbr => $info) { foreach ($info as $zone) { if ( ! empty($zone['timezone_id']) AND ! in_array($zone['timezone_id'], $added) AND in_array($zone['timezone_id'], $idents)) { $z = new DateTimeZone($zone['timezone_id']); $c = new DateTime(null, $z); $zone['time'] = $c->format('H:i a'); $data[] = $zone; $offset[] = $z->getOffset($c); $added[] = $zone['timezone_id']; } } } array_multisort($offset, SORT_ASC, $data); $options = array(); foreach ($data as $key => $row) { $options[$row['timezone_id']] = $row['time'] . ' - ' . formatOffset($row['offset']) . ' ' . $row['timezone_id']; } // now you can use $options; function formatOffset($offset) { $hours = $offset / 3600; $remainder = $offset % 3600; $sign = $hours > 0 ? '+' : '-'; $hour = (int) abs($hours); $minutes = (int) abs($remainder / 60); if ($hour == 0 AND $minutes == 0) { $sign = ' '; } return 'GMT' . $sign . str_pad($hour, 2, '0', STR_PAD_LEFT) .':'. str_pad($minutes,2, '0'); }
Когда я проверил свою страну, смещение было неправильным, я в Азии / Сингапуре, это должно быть UTC / GMT +8 http://www.timeanddate.com/worldclock/city.html?n=236, но в соответствии с сгенерированным перечислите его +9. Есть ли какая-то логическая ошибка? Время было правильным.
Есть ли лучший способ создать этот список? из того же вопроса в приведенной выше ссылке,
static $regions = array( 'Africa' => DateTimeZone::AFRICA, 'America' => DateTimeZone::AMERICA, 'Antarctica' => DateTimeZone::ANTARCTICA, 'Aisa' => DateTimeZone::ASIA, 'Atlantic' => DateTimeZone::ATLANTIC, 'Europe' => DateTimeZone::EUROPE, 'Indian' => DateTimeZone::INDIAN, 'Pacific' => DateTimeZone::PACIFIC ); foreach ($regions as $name => $mask) { $tzlist[] = DateTimeZone::listIdentifiers($mask); }
Это просто получает идентификаторы, в которых я хочу приветственное отображаемое имя, например. UTC + 8 Азия / Сингапур или что-то подобное. Как я могу это получить?
Возьмите мой массив часовых поясов, которые я сделал специально для выбранного элемента. Это связанный массив, где ключ – это часовой пояс PHP, а значение – это представление человека. Это оно:
$timezones = array( 'Pacific/Midway' => "(GMT-11:00) Midway Island", 'US/Samoa' => "(GMT-11:00) Samoa", 'US/Hawaii' => "(GMT-10:00) Hawaii", 'US/Alaska' => "(GMT-09:00) Alaska", 'US/Pacific' => "(GMT-08:00) Pacific Time (US & Canada)", 'America/Tijuana' => "(GMT-08:00) Tijuana", 'US/Arizona' => "(GMT-07:00) Arizona", 'US/Mountain' => "(GMT-07:00) Mountain Time (US & Canada)", 'America/Chihuahua' => "(GMT-07:00) Chihuahua", 'America/Mazatlan' => "(GMT-07:00) Mazatlan", 'America/Mexico_City' => "(GMT-06:00) Mexico City", 'America/Monterrey' => "(GMT-06:00) Monterrey", 'Canada/Saskatchewan' => "(GMT-06:00) Saskatchewan", 'US/Central' => "(GMT-06:00) Central Time (US & Canada)", 'US/Eastern' => "(GMT-05:00) Eastern Time (US & Canada)", 'US/East-Indiana' => "(GMT-05:00) Indiana (East)", 'America/Bogota' => "(GMT-05:00) Bogota", 'America/Lima' => "(GMT-05:00) Lima", 'America/Caracas' => "(GMT-04:30) Caracas", 'Canada/Atlantic' => "(GMT-04:00) Atlantic Time (Canada)", 'America/La_Paz' => "(GMT-04:00) La Paz", 'America/Santiago' => "(GMT-04:00) Santiago", 'Canada/Newfoundland' => "(GMT-03:30) Newfoundland", 'America/Buenos_Aires' => "(GMT-03:00) Buenos Aires", 'Greenland' => "(GMT-03:00) Greenland", 'Atlantic/Stanley' => "(GMT-02:00) Stanley", 'Atlantic/Azores' => "(GMT-01:00) Azores", 'Atlantic/Cape_Verde' => "(GMT-01:00) Cape Verde Is.", 'Africa/Casablanca' => "(GMT) Casablanca", 'Europe/Dublin' => "(GMT) Dublin", 'Europe/Lisbon' => "(GMT) Lisbon", 'Europe/London' => "(GMT) London", 'Africa/Monrovia' => "(GMT) Monrovia", 'Europe/Amsterdam' => "(GMT+01:00) Amsterdam", 'Europe/Belgrade' => "(GMT+01:00) Belgrade", 'Europe/Berlin' => "(GMT+01:00) Berlin", 'Europe/Bratislava' => "(GMT+01:00) Bratislava", 'Europe/Brussels' => "(GMT+01:00) Brussels", 'Europe/Budapest' => "(GMT+01:00) Budapest", 'Europe/Copenhagen' => "(GMT+01:00) Copenhagen", 'Europe/Ljubljana' => "(GMT+01:00) Ljubljana", 'Europe/Madrid' => "(GMT+01:00) Madrid", 'Europe/Paris' => "(GMT+01:00) Paris", 'Europe/Prague' => "(GMT+01:00) Prague", 'Europe/Rome' => "(GMT+01:00) Rome", 'Europe/Sarajevo' => "(GMT+01:00) Sarajevo", 'Europe/Skopje' => "(GMT+01:00) Skopje", 'Europe/Stockholm' => "(GMT+01:00) Stockholm", 'Europe/Vienna' => "(GMT+01:00) Vienna", 'Europe/Warsaw' => "(GMT+01:00) Warsaw", 'Europe/Zagreb' => "(GMT+01:00) Zagreb", 'Europe/Athens' => "(GMT+02:00) Athens", 'Europe/Bucharest' => "(GMT+02:00) Bucharest", 'Africa/Cairo' => "(GMT+02:00) Cairo", 'Africa/Harare' => "(GMT+02:00) Harare", 'Europe/Helsinki' => "(GMT+02:00) Helsinki", 'Europe/Istanbul' => "(GMT+02:00) Istanbul", 'Asia/Jerusalem' => "(GMT+02:00) Jerusalem", 'Europe/Kiev' => "(GMT+02:00) Kyiv", 'Europe/Minsk' => "(GMT+02:00) Minsk", 'Europe/Riga' => "(GMT+02:00) Riga", 'Europe/Sofia' => "(GMT+02:00) Sofia", 'Europe/Tallinn' => "(GMT+02:00) Tallinn", 'Europe/Vilnius' => "(GMT+02:00) Vilnius", 'Asia/Baghdad' => "(GMT+03:00) Baghdad", 'Asia/Kuwait' => "(GMT+03:00) Kuwait", 'Africa/Nairobi' => "(GMT+03:00) Nairobi", 'Asia/Riyadh' => "(GMT+03:00) Riyadh", 'Europe/Moscow' => "(GMT+03:00) Moscow", 'Asia/Tehran' => "(GMT+03:30) Tehran", 'Asia/Baku' => "(GMT+04:00) Baku", 'Europe/Volgograd' => "(GMT+04:00) Volgograd", 'Asia/Muscat' => "(GMT+04:00) Muscat", 'Asia/Tbilisi' => "(GMT+04:00) Tbilisi", 'Asia/Yerevan' => "(GMT+04:00) Yerevan", 'Asia/Kabul' => "(GMT+04:30) Kabul", 'Asia/Karachi' => "(GMT+05:00) Karachi", 'Asia/Tashkent' => "(GMT+05:00) Tashkent", 'Asia/Kolkata' => "(GMT+05:30) Kolkata", 'Asia/Kathmandu' => "(GMT+05:45) Kathmandu", 'Asia/Yekaterinburg' => "(GMT+06:00) Ekaterinburg", 'Asia/Almaty' => "(GMT+06:00) Almaty", 'Asia/Dhaka' => "(GMT+06:00) Dhaka", 'Asia/Novosibirsk' => "(GMT+07:00) Novosibirsk", 'Asia/Bangkok' => "(GMT+07:00) Bangkok", 'Asia/Jakarta' => "(GMT+07:00) Jakarta", 'Asia/Krasnoyarsk' => "(GMT+08:00) Krasnoyarsk", 'Asia/Chongqing' => "(GMT+08:00) Chongqing", 'Asia/Hong_Kong' => "(GMT+08:00) Hong Kong", 'Asia/Kuala_Lumpur' => "(GMT+08:00) Kuala Lumpur", 'Australia/Perth' => "(GMT+08:00) Perth", 'Asia/Singapore' => "(GMT+08:00) Singapore", 'Asia/Taipei' => "(GMT+08:00) Taipei", 'Asia/Ulaanbaatar' => "(GMT+08:00) Ulaan Bataar", 'Asia/Urumqi' => "(GMT+08:00) Urumqi", 'Asia/Irkutsk' => "(GMT+09:00) Irkutsk", 'Asia/Seoul' => "(GMT+09:00) Seoul", 'Asia/Tokyo' => "(GMT+09:00) Tokyo", 'Australia/Adelaide' => "(GMT+09:30) Adelaide", 'Australia/Darwin' => "(GMT+09:30) Darwin", 'Asia/Yakutsk' => "(GMT+10:00) Yakutsk", 'Australia/Brisbane' => "(GMT+10:00) Brisbane", 'Australia/Canberra' => "(GMT+10:00) Canberra", 'Pacific/Guam' => "(GMT+10:00) Guam", 'Australia/Hobart' => "(GMT+10:00) Hobart", 'Australia/Melbourne' => "(GMT+10:00) Melbourne", 'Pacific/Port_Moresby' => "(GMT+10:00) Port Moresby", 'Australia/Sydney' => "(GMT+10:00) Sydney", 'Asia/Vladivostok' => "(GMT+11:00) Vladivostok", 'Asia/Magadan' => "(GMT+12:00) Magadan", 'Pacific/Auckland' => "(GMT+12:00) Auckland", 'Pacific/Fiji' => "(GMT+12:00) Fiji", );
Полный список, который я использую в своих приложениях:
(Также проверьте: https://github.com/paptamas/timezones )
<?php $timezones = array ( '(GMT-12:00) International Date Line West' => 'Pacific/Wake', '(GMT-11:00) Midway Island' => 'Pacific/Apia', '(GMT-11:00) Samoa' => 'Pacific/Apia', '(GMT-10:00) Hawaii' => 'Pacific/Honolulu', '(GMT-09:00) Alaska' => 'America/Anchorage', '(GMT-08:00) Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', '(GMT-07:00) Arizona' => 'America/Phoenix', '(GMT-07:00) Chihuahua' => 'America/Chihuahua', '(GMT-07:00) La Paz' => 'America/Chihuahua', '(GMT-07:00) Mazatlan' => 'America/Chihuahua', '(GMT-07:00) Mountain Time (US & Canada)' => 'America/Denver', '(GMT-06:00) Central America' => 'America/Managua', '(GMT-06:00) Central Time (US & Canada)' => 'America/Chicago', '(GMT-06:00) Guadalajara' => 'America/Mexico_City', '(GMT-06:00) Mexico City' => 'America/Mexico_City', '(GMT-06:00) Monterrey' => 'America/Mexico_City', '(GMT-06:00) Saskatchewan' => 'America/Regina', '(GMT-05:00) Bogota' => 'America/Bogota', '(GMT-05:00) Eastern Time (US & Canada)' => 'America/New_York', '(GMT-05:00) Indiana (East)' => 'America/Indiana/Indianapolis', '(GMT-05:00) Lima' => 'America/Bogota', '(GMT-05:00) Quito' => 'America/Bogota', '(GMT-04:00) Atlantic Time (Canada)' => 'America/Halifax', '(GMT-04:00) Caracas' => 'America/Caracas', '(GMT-04:00) La Paz' => 'America/Caracas', '(GMT-04:00) Santiago' => 'America/Santiago', '(GMT-03:30) Newfoundland' => 'America/St_Johns', '(GMT-03:00) Brasilia' => 'America/Sao_Paulo', '(GMT-03:00) Buenos Aires' => 'America/Argentina/Buenos_Aires', '(GMT-03:00) Georgetown' => 'America/Argentina/Buenos_Aires', '(GMT-03:00) Greenland' => 'America/Godthab', '(GMT-02:00) Mid-Atlantic' => 'America/Noronha', '(GMT-01:00) Azores' => 'Atlantic/Azores', '(GMT-01:00) Cape Verde Is.' => 'Atlantic/Cape_Verde', '(GMT) Casablanca' => 'Africa/Casablanca', '(GMT) Edinburgh' => 'Europe/London', '(GMT) Greenwich Mean Time : Dublin' => 'Europe/London', '(GMT) Lisbon' => 'Europe/London', '(GMT) London' => 'Europe/London', '(GMT) Monrovia' => 'Africa/Casablanca', '(GMT+01:00) Amsterdam' => 'Europe/Berlin', '(GMT+01:00) Belgrade' => 'Europe/Belgrade', '(GMT+01:00) Berlin' => 'Europe/Berlin', '(GMT+01:00) Bern' => 'Europe/Berlin', '(GMT+01:00) Bratislava' => 'Europe/Belgrade', '(GMT+01:00) Brussels' => 'Europe/Paris', '(GMT+01:00) Budapest' => 'Europe/Belgrade', '(GMT+01:00) Copenhagen' => 'Europe/Paris', '(GMT+01:00) Ljubljana' => 'Europe/Belgrade', '(GMT+01:00) Madrid' => 'Europe/Paris', '(GMT+01:00) Paris' => 'Europe/Paris', '(GMT+01:00) Prague' => 'Europe/Belgrade', '(GMT+01:00) Rome' => 'Europe/Berlin', '(GMT+01:00) Sarajevo' => 'Europe/Sarajevo', '(GMT+01:00) Skopje' => 'Europe/Sarajevo', '(GMT+01:00) Stockholm' => 'Europe/Berlin', '(GMT+01:00) Vienna' => 'Europe/Berlin', '(GMT+01:00) Warsaw' => 'Europe/Sarajevo', '(GMT+01:00) West Central Africa' => 'Africa/Lagos', '(GMT+01:00) Zagreb' => 'Europe/Sarajevo', '(GMT+02:00) Athens' => 'Europe/Istanbul', '(GMT+02:00) Bucharest' => 'Europe/Bucharest', '(GMT+02:00) Cairo' => 'Africa/Cairo', '(GMT+02:00) Harare' => 'Africa/Johannesburg', '(GMT+02:00) Helsinki' => 'Europe/Helsinki', '(GMT+02:00) Istanbul' => 'Europe/Istanbul', '(GMT+02:00) Jerusalem' => 'Asia/Jerusalem', '(GMT+02:00) Kyiv' => 'Europe/Helsinki', '(GMT+02:00) Minsk' => 'Europe/Istanbul', '(GMT+02:00) Pretoria' => 'Africa/Johannesburg', '(GMT+02:00) Riga' => 'Europe/Helsinki', '(GMT+02:00) Sofia' => 'Europe/Helsinki', '(GMT+02:00) Tallinn' => 'Europe/Helsinki', '(GMT+02:00) Vilnius' => 'Europe/Helsinki', '(GMT+03:00) Baghdad' => 'Asia/Baghdad', '(GMT+03:00) Kuwait' => 'Asia/Riyadh', '(GMT+03:00) Moscow' => 'Europe/Moscow', '(GMT+03:00) Nairobi' => 'Africa/Nairobi', '(GMT+03:00) Riyadh' => 'Asia/Riyadh', '(GMT+03:00) St. Petersburg' => 'Europe/Moscow', '(GMT+03:00) Volgograd' => 'Europe/Moscow', '(GMT+03:30) Tehran' => 'Asia/Tehran', '(GMT+04:00) Abu Dhabi' => 'Asia/Muscat', '(GMT+04:00) Baku' => 'Asia/Tbilisi', '(GMT+04:00) Muscat' => 'Asia/Muscat', '(GMT+04:00) Tbilisi' => 'Asia/Tbilisi', '(GMT+04:00) Yerevan' => 'Asia/Tbilisi', '(GMT+04:30) Kabul' => 'Asia/Kabul', '(GMT+05:00) Ekaterinburg' => 'Asia/Yekaterinburg', '(GMT+05:00) Islamabad' => 'Asia/Karachi', '(GMT+05:00) Karachi' => 'Asia/Karachi', '(GMT+05:00) Tashkent' => 'Asia/Karachi', '(GMT+05:30) Chennai' => 'Asia/Calcutta', '(GMT+05:30) Kolkata' => 'Asia/Calcutta', '(GMT+05:30) Mumbai' => 'Asia/Calcutta', '(GMT+05:30) New Delhi' => 'Asia/Calcutta', '(GMT+05:45) Kathmandu' => 'Asia/Katmandu', '(GMT+06:00) Almaty' => 'Asia/Novosibirsk', '(GMT+06:00) Astana' => 'Asia/Dhaka', '(GMT+06:00) Dhaka' => 'Asia/Dhaka', '(GMT+06:00) Novosibirsk' => 'Asia/Novosibirsk', '(GMT+06:00) Sri Jayawardenepura' => 'Asia/Colombo', '(GMT+06:30) Rangoon' => 'Asia/Rangoon', '(GMT+07:00) Bangkok' => 'Asia/Bangkok', '(GMT+07:00) Hanoi' => 'Asia/Bangkok', '(GMT+07:00) Jakarta' => 'Asia/Bangkok', '(GMT+07:00) Krasnoyarsk' => 'Asia/Krasnoyarsk', '(GMT+08:00) Beijing' => 'Asia/Hong_Kong', '(GMT+08:00) Chongqing' => 'Asia/Hong_Kong', '(GMT+08:00) Hong Kong' => 'Asia/Hong_Kong', '(GMT+08:00) Irkutsk' => 'Asia/Irkutsk', '(GMT+08:00) Kuala Lumpur' => 'Asia/Singapore', '(GMT+08:00) Perth' => 'Australia/Perth', '(GMT+08:00) Singapore' => 'Asia/Singapore', '(GMT+08:00) Taipei' => 'Asia/Taipei', '(GMT+08:00) Ulaan Bataar' => 'Asia/Irkutsk', '(GMT+08:00) Urumqi' => 'Asia/Hong_Kong', '(GMT+09:00) Osaka' => 'Asia/Tokyo', '(GMT+09:00) Sapporo' => 'Asia/Tokyo', '(GMT+09:00) Seoul' => 'Asia/Seoul', '(GMT+09:00) Tokyo' => 'Asia/Tokyo', '(GMT+09:00) Yakutsk' => 'Asia/Yakutsk', '(GMT+09:30) Adelaide' => 'Australia/Adelaide', '(GMT+09:30) Darwin' => 'Australia/Darwin', '(GMT+10:00) Brisbane' => 'Australia/Brisbane', '(GMT+10:00) Canberra' => 'Australia/Sydney', '(GMT+10:00) Guam' => 'Pacific/Guam', '(GMT+10:00) Hobart' => 'Australia/Hobart', '(GMT+10:00) Melbourne' => 'Australia/Sydney', '(GMT+10:00) Port Moresby' => 'Pacific/Guam', '(GMT+10:00) Sydney' => 'Australia/Sydney', '(GMT+10:00) Vladivostok' => 'Asia/Vladivostok', '(GMT+11:00) Magadan' => 'Asia/Magadan', '(GMT+11:00) New Caledonia' => 'Asia/Magadan', '(GMT+11:00) Solomon Is.' => 'Asia/Magadan', '(GMT+12:00) Auckland' => 'Pacific/Auckland', '(GMT+12:00) Fiji' => 'Pacific/Fiji', '(GMT+12:00) Kamchatka' => 'Pacific/Fiji', '(GMT+12:00) Marshall Is.' => 'Pacific/Fiji', '(GMT+12:00) Wellington' => 'Pacific/Auckland', '(GMT+13:00) Nuku\'alofa' => 'Pacific/Tongatapu', ); ?>
Очень важно хранить идентификаторы часовых поясов в вашей базе данных, а не только смещение часового пояса, например «GMT + 2», из-за летнего времени.
У меня была одна и та же проблема создания простого в использовании списка часовых поясов. Поэтому я использую geoip (http://freegeoip.net), чтобы получить страну пользователя, а затем используя:
$nearest_time_zones = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $country_code);
Это здорово, потому что список, как правило, очень короткий. Но в случае, если пользователь хочет указать другую зону, я добавляю весь список из DateTimeZone :: listIdentifiers (). Если вы не показываете все часовые пояса, вы обязаны иметь пользователя из часового пояса, который не указан.
В результате выпадающее изображение выглядит так (конечно, это намного больше, чем это):
<optgroup label="Nearest"> <option value="blah/blah">(+5:00) Blah/Blah</option> ... </optgroup> <optgroup label="-11:00"> <option value="Pacific/Apia">(-11:00) Pacific/Apia</option> <option value="Pacific/Midway">(-11:00) Pacific/Midway</option> <option value="Pacific/Niue">(-11:00) Pacific/Niue</option> <option value="Pacific/Pago_Pago">(-11:00) Pacific/Pago_Pago</option> </optgroup> <optgroup label="-10:00"> <option value="America/Adak">(-10:00) America/Adak</option> <option value="Pacific/Fakaofo">(-10:00) Pacific/Fakaofo</option> <option value="Pacific/Honolulu">(-10:00) Pacific/Honolulu</option> <option value="Pacific/Johnston">(-10:00) Pacific/Johnston</option> <option value="Pacific/Rarotonga">(-10:00) Pacific/Rarotonga</option> <option value="Pacific/Tahiti">(-10:00) Pacific/Tahiti</option> </optgroup>
Это приложение все еще находится в разработке и не имеет отзывов пользователей, поэтому я не могу сказать, что это был успешный подход. Но я думал, что подход геоида заслуживает упоминания.
Я использовал оба списка от Jiew Meng и Tamás Pap, каждый из которых я проверил PHP-поддержку идентификатора часового пояса (PHP поддерживает меньше, чем известно миру) и сделал составной список. Для тех часовых поясов, которые были в обоих списках и поддерживались PHP, но имели разные идентификаторы, я выбрал те, которые используются в базе данных городов Geonames. Результат ниже:
$timezones = Array( '(GMT-12:00) International Date Line West' => 'Pacific/Kwajalein', '(GMT-11:00) Midway Island' => 'Pacific/Midway', '(GMT-11:00) Samoa' => 'Pacific/Apia', '(GMT-10:00) Hawaii' => 'Pacific/Honolulu', '(GMT-09:00) Alaska' => 'America/Anchorage', '(GMT-08:00) Pacific Time (US & Canada)' => 'America/Los_Angeles', '(GMT-08:00) Tijuana' => 'America/Tijuana', '(GMT-07:00) Arizona' => 'America/Phoenix', '(GMT-07:00) Mountain Time (US & Canada)' => 'America/Denver', '(GMT-07:00) Chihuahua' => 'America/Chihuahua', '(GMT-07:00) La Paz' => 'America/Chihuahua', '(GMT-07:00) Mazatlan' => 'America/Mazatlan', '(GMT-06:00) Central Time (US & Canada)' => 'America/Chicago', '(GMT-06:00) Central America' => 'America/Managua', '(GMT-06:00) Guadalajara' => 'America/Mexico_City', '(GMT-06:00) Mexico City' => 'America/Mexico_City', '(GMT-06:00) Monterrey' => 'America/Monterrey', '(GMT-06:00) Saskatchewan' => 'America/Regina', '(GMT-05:00) Eastern Time (US & Canada)' => 'America/New_York', '(GMT-05:00) Indiana (East)' => 'America/Indiana/Indianapolis', '(GMT-05:00) Bogota' => 'America/Bogota', '(GMT-05:00) Lima' => 'America/Lima', '(GMT-05:00) Quito' => 'America/Bogota', '(GMT-04:00) Atlantic Time (Canada)' => 'America/Halifax', '(GMT-04:00) Caracas' => 'America/Caracas', '(GMT-04:00) La Paz' => 'America/La_Paz', '(GMT-04:00) Santiago' => 'America/Santiago', '(GMT-03:30) Newfoundland' => 'America/St_Johns', '(GMT-03:00) Brasilia' => 'America/Sao_Paulo', '(GMT-03:00) Buenos Aires' => 'America/Argentina/Buenos_Aires', '(GMT-03:00) Georgetown' => 'America/Argentina/Buenos_Aires', '(GMT-03:00) Greenland' => 'America/Godthab', '(GMT-02:00) Mid-Atlantic' => 'America/Noronha', '(GMT-01:00) Azores' => 'Atlantic/Azores', '(GMT-01:00) Cape Verde Is.' => 'Atlantic/Cape_Verde', '(GMT) Casablanca' => 'Africa/Casablanca', '(GMT) Dublin' => 'Europe/London', '(GMT) Edinburgh' => 'Europe/London', '(GMT) Lisbon' => 'Europe/Lisbon', '(GMT) London' => 'Europe/London', '(GMT) Monrovia' => 'Africa/Monrovia', '(GMT+01:00) Amsterdam' => 'Europe/Amsterdam', '(GMT+01:00) Belgrade' => 'Europe/Belgrade', '(GMT+01:00) Berlin' => 'Europe/Berlin', '(GMT+01:00) Bern' => 'Europe/Berlin', '(GMT+01:00) Bratislava' => 'Europe/Bratislava', '(GMT+01:00) Brussels' => 'Europe/Brussels', '(GMT+01:00) Budapest' => 'Europe/Budapest', '(GMT+01:00) Copenhagen' => 'Europe/Copenhagen', '(GMT+01:00) Ljubljana' => 'Europe/Ljubljana', '(GMT+01:00) Madrid' => 'Europe/Madrid', '(GMT+01:00) Paris' => 'Europe/Paris', '(GMT+01:00) Prague' => 'Europe/Prague', '(GMT+01:00) Rome' => 'Europe/Rome', '(GMT+01:00) Sarajevo' => 'Europe/Sarajevo', '(GMT+01:00) Skopje' => 'Europe/Skopje', '(GMT+01:00) Stockholm' => 'Europe/Stockholm', '(GMT+01:00) Vienna' => 'Europe/Vienna', '(GMT+01:00) Warsaw' => 'Europe/Warsaw', '(GMT+01:00) West Central Africa' => 'Africa/Lagos', '(GMT+01:00) Zagreb' => 'Europe/Zagreb', '(GMT+02:00) Athens' => 'Europe/Athens', '(GMT+02:00) Bucharest' => 'Europe/Bucharest', '(GMT+02:00) Cairo' => 'Africa/Cairo', '(GMT+02:00) Harare' => 'Africa/Harare', '(GMT+02:00) Helsinki' => 'Europe/Helsinki', '(GMT+02:00) Istanbul' => 'Europe/Istanbul', '(GMT+02:00) Jerusalem' => 'Asia/Jerusalem', '(GMT+02:00) Kyev' => 'Europe/Kiev', '(GMT+02:00) Minsk' => 'Europe/Minsk', '(GMT+02:00) Pretoria' => 'Africa/Johannesburg', '(GMT+02:00) Riga' => 'Europe/Riga', '(GMT+02:00) Sofia' => 'Europe/Sofia', '(GMT+02:00) Tallinn' => 'Europe/Tallinn', '(GMT+02:00) Vilnius' => 'Europe/Vilnius', '(GMT+03:00) Baghdad' => 'Asia/Baghdad', '(GMT+03:00) Kuwait' => 'Asia/Kuwait', '(GMT+03:00) Moscow' => 'Europe/Moscow', '(GMT+03:00) Nairobi' => 'Africa/Nairobi', '(GMT+03:00) Riyadh' => 'Asia/Riyadh', '(GMT+03:00) St. Petersburg' => 'Europe/Moscow', '(GMT+03:00) Volgograd' => 'Europe/Volgograd', '(GMT+03:30) Tehran' => 'Asia/Tehran', '(GMT+04:00) Abu Dhabi' => 'Asia/Muscat', '(GMT+04:00) Baku' => 'Asia/Baku', '(GMT+04:00) Muscat' => 'Asia/Muscat', '(GMT+04:00) Tbilisi' => 'Asia/Tbilisi', '(GMT+04:00) Yerevan' => 'Asia/Yerevan', '(GMT+04:30) Kabul' => 'Asia/Kabul', '(GMT+05:00) Ekaterinburg' => 'Asia/Yekaterinburg', '(GMT+05:00) Islamabad' => 'Asia/Karachi', '(GMT+05:00) Karachi' => 'Asia/Karachi', '(GMT+05:00) Tashkent' => 'Asia/Tashkent', '(GMT+05:30) Chennai' => 'Asia/Kolkata', '(GMT+05:30) Kolkata' => 'Asia/Kolkata', '(GMT+05:30) Mumbai' => 'Asia/Kolkata', '(GMT+05:30) New Delhi' => 'Asia/Kolkata', '(GMT+05:45) Kathmandu' => 'Asia/Kathmandu', '(GMT+06:00) Almaty' => 'Asia/Almaty', '(GMT+06:00) Astana' => 'Asia/Dhaka', '(GMT+06:00) Dhaka' => 'Asia/Dhaka', '(GMT+06:00) Novosibirsk' => 'Asia/Novosibirsk', '(GMT+06:00) Sri Jayawardenepura' => 'Asia/Colombo', '(GMT+06:30) Rangoon' => 'Asia/Rangoon', '(GMT+07:00) Bangkok' => 'Asia/Bangkok', '(GMT+07:00) Hanoi' => 'Asia/Bangkok', '(GMT+07:00) Jakarta' => 'Asia/Jakarta', '(GMT+07:00) Krasnoyarsk' => 'Asia/Krasnoyarsk', '(GMT+08:00) Beijing' => 'Asia/Hong_Kong', '(GMT+08:00) Chongqing' => 'Asia/Chongqing', '(GMT+08:00) Hong Kong' => 'Asia/Hong_Kong', '(GMT+08:00) Irkutsk' => 'Asia/Irkutsk', '(GMT+08:00) Kuala Lumpur' => 'Asia/Kuala_Lumpur', '(GMT+08:00) Perth' => 'Australia/Perth', '(GMT+08:00) Singapore' => 'Asia/Singapore', '(GMT+08:00) Taipei' => 'Asia/Taipei', '(GMT+08:00) Ulaan Bataar' => 'Asia/Irkutsk', '(GMT+08:00) Urumqi' => 'Asia/Urumqi', '(GMT+09:00) Osaka' => 'Asia/Tokyo', '(GMT+09:00) Sapporo' => 'Asia/Tokyo', '(GMT+09:00) Seoul' => 'Asia/Seoul', '(GMT+09:00) Tokyo' => 'Asia/Tokyo', '(GMT+09:00) Yakutsk' => 'Asia/Yakutsk', '(GMT+09:30) Adelaide' => 'Australia/Adelaide', '(GMT+09:30) Darwin' => 'Australia/Darwin', '(GMT+10:00) Brisbane' => 'Australia/Brisbane', '(GMT+10:00) Canberra' => 'Australia/Sydney', '(GMT+10:00) Guam' => 'Pacific/Guam', '(GMT+10:00) Hobart' => 'Australia/Hobart', '(GMT+10:00) Melbourne' => 'Australia/Melbourne', '(GMT+10:00) Port Moresby' => 'Pacific/Port_Moresby', '(GMT+10:00) Sydney' => 'Australia/Sydney', '(GMT+10:00) Vladivostok' => 'Asia/Vladivostok', '(GMT+11:00) Magadan' => 'Asia/Magadan', '(GMT+11:00) New Caledonia' => 'Asia/Magadan', '(GMT+11:00) Solomon Is.' => 'Asia/Magadan', '(GMT+12:00) Auckland' => 'Pacific/Auckland', '(GMT+12:00) Fiji' => 'Pacific/Fiji', '(GMT+12:00) Kamchatka' => 'Asia/Kamchatka', '(GMT+12:00) Marshall Is.' => 'Pacific/Fiji', '(GMT+12:00) Wellington' => 'Pacific/Auckland', '(GMT+13:00) Nuku\'alofa' => 'Pacific/Tongatapu' );
этот метод опирается на вашу операционную систему, чтобы она всегда работала, просто сохраняйте затухающие временные интервалы в массиве / базе данных, также вам нужно учитывать, что время ожидания (ярлыки), которое может быть довольно сложным
sourece http://en.wikipedia.org/wiki/Time_zone : PHP
Объекты DateTime и связанные с ними функции скомпилированы в ядро PHP с 5.2. Это включает в себя возможность получить и установить часовой пояс сценария по умолчанию, а DateTime знает свой собственный часовой пояс. PHP.net предоставляет обширную документацию по этому вопросу. [20] Как уже отмечалось, самая последняя база данных часовых поясов может быть реализована через PECL timezonedb.
так что либо сделайте db самостоятельно, либо используйте PECL timezonedb
Попробуйте использовать следующий код: Как получить среднее значение по Гринвичу в PHP? , Я использую его в одном из моих приложений, но вы можете изменить разметку, чтобы отображать все, что хотите:
public function tz_list() { $zones_array = array(); $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $zones_array[$key]['zone'] = $zone; $zones_array[$key]['offset'] = (int) ((int) date('O', $timestamp))/100; $zones_array[$key]['diff_from_GMT'] = 'UTC/GMT ' . date('P', $timestamp); } return $zones_array; }
Затем:
<select name="timezone" id="timezone" class="form-control"> <option value="">Select a time zone</option> <?php foreach(tz_list() as $t) { ?> <option value="<?php echo $t['offset']; ?>___<?php echo $t['zone']; ?>" <?php echo $t['diff_from_GMT'] . ' - ' . $t['zone']; ?></option> <?php } ?> </select>
попробуй это:
<?php /** * Timezones list with GMT offset * * @return array * @link http://stackoverflow.com/a/9328760 */ function tz_list() { $zones_array = array(); $timestamp = time(); foreach(timezone_identifiers_list() as $key => $zone) { date_default_timezone_set($zone); $zones_array[$key]['zone'] = $zone; $zones_array[$key]['diff_from_GMT'] = 'UTC/GMT ' . date('P', $timestamp); } return $zones_array; } ?> <div style="margin-top: 20px;"> <select style="font-family: 'Courier New', Courier, monospace; width: 450px;"> <option value="0">Please, select timezone</option> <?php foreach(tz_list() as $t) { ?> <option value="<?php print $t['zone'] ?>"> <?php print $t['diff_from_GMT'] . ' - ' . $t['zone'] ?> </option> <?php } ?> </select> </div>
Источник: http://www.pontikis.net/tip/?id=24
НТН
Это решение, которое я нахожу лучше, чем жесткий код, потому что смещения вычисляются динамически.
<?php function toGmtOffset($timezone){ $userTimeZone = new DateTimeZone($timezone); $offset = $userTimeZone->getOffset(new DateTime("now",new DateTimeZone('GMT'))); // Offset in seconds $seconds = abs($offset); $sign = $offset > 0 ? '+' : '-'; $hours = floor($seconds / 3600); $mins = floor($seconds / 60 % 60); $secs = floor($seconds % 60); return sprintf("(GMT$sign%02d:%02d)", $hours, $mins, $secs); } $timezones = array( 'Pacific/Midway' => toGmtOffset('Pacific/Midway' ). " Midway Island", 'US/Samoa' => toGmtOffset('US/Samoa' ). " Samoa", 'US/Hawaii' => toGmtOffset('US/Hawaii' ). " Hawaii", 'US/Alaska' => toGmtOffset('US/Alaska' ). " Alaska", 'US/Pacific' => toGmtOffset('US/Pacific' ). " Pacific Time (US & Canada)", 'America/Tijuana' => toGmtOffset('America/Tijuana' ). " Tijuana", 'US/Arizona' => toGmtOffset('US/Arizona' ). " Arizona", 'US/Mountain' => toGmtOffset('US/Mountain' ). " Mountain Time (US & Canada)", 'America/Chihuahua' => toGmtOffset('America/Chihuahua' ). " Chihuahua", 'America/Mazatlan' => toGmtOffset('America/Mazatlan' ). " Mazatlan", 'America/Mexico_City' => toGmtOffset('America/Mexico_City' ). " Mexico City", 'America/Monterrey' => toGmtOffset('America/Monterrey' ). " Monterrey", 'Canada/Saskatchewan' => toGmtOffset('Canada/Saskatchewan' ). " Saskatchewan", 'US/Central' => toGmtOffset('US/Central' ). " Central Time (US & Canada)", 'US/Eastern' => toGmtOffset('US/Eastern' ). " Eastern Time (US & Canada)", 'US/East-Indiana' => toGmtOffset('US/East-Indiana' ). " Indiana (East)", 'America/Bogota' => toGmtOffset('America/Bogota' ). " Bogota", 'America/Lima' => toGmtOffset('America/Lima' ). " Lima", 'America/Caracas' => toGmtOffset('America/Caracas' ). " Caracas", 'Canada/Atlantic' => toGmtOffset('Canada/Atlantic' ). " Atlantic Time (Canada)", 'America/La_Paz' => toGmtOffset('America/La_Paz' ). " La Paz", 'America/Santiago' => toGmtOffset('America/Santiago' ). " Santiago", 'Canada/Newfoundland' => toGmtOffset('Canada/Newfoundland' ). " Newfoundland", 'America/Buenos_Aires' => toGmtOffset('America/Buenos_Aires' ). " Buenos Aires", 'Atlantic/Stanley' => toGmtOffset('Atlantic/Stanley' ). " Stanley", 'Atlantic/Azores' => toGmtOffset('Atlantic/Azores' ). " Azores", 'Atlantic/Cape_Verde' => toGmtOffset('Atlantic/Cape_Verde' ). " Cape Verde Is.", 'Africa/Casablanca' => toGmtOffset('Africa/Casablanca' ). " Casablanca", 'Europe/Dublin' => toGmtOffset('Europe/Dublin' ). " Dublin", 'Europe/Lisbon' => toGmtOffset('Europe/Lisbon' ). " Lisbon", 'Europe/London' => toGmtOffset('Europe/London' ). " London", 'Africa/Monrovia' => toGmtOffset('Africa/Monrovia' ). " Monrovia", 'Europe/Amsterdam' => toGmtOffset('Europe/Amsterdam' ). " Amsterdam", 'Europe/Belgrade' => toGmtOffset('Europe/Belgrade' ). " Belgrade", 'Europe/Berlin' => toGmtOffset('Europe/Berlin' ). " Berlin", 'Europe/Bratislava' => toGmtOffset('Europe/Bratislava' ). " Bratislava", 'Europe/Brussels' => toGmtOffset('Europe/Brussels' ). " Brussels", 'Europe/Budapest' => toGmtOffset('Europe/Budapest' ). " Budapest", 'Europe/Copenhagen' => toGmtOffset('Europe/Copenhagen' ). " Copenhagen", 'Europe/Ljubljana' => toGmtOffset('Europe/Ljubljana' ). " Ljubljana", 'Europe/Madrid' => toGmtOffset('Europe/Madrid' ). " Madrid", 'Europe/Paris' => toGmtOffset('Europe/Paris' ). " Paris", 'Europe/Prague' => toGmtOffset('Europe/Prague' ). " Prague", 'Europe/Rome' => toGmtOffset('Europe/Rome' ). " Rome", 'Europe/Sarajevo' => toGmtOffset('Europe/Sarajevo' ). " Sarajevo", 'Europe/Skopje' => toGmtOffset('Europe/Skopje' ). " Skopje", 'Europe/Stockholm' => toGmtOffset('Europe/Stockholm' ). " Stockholm", 'Europe/Vienna' => toGmtOffset('Europe/Vienna' ). " Vienna", 'Europe/Warsaw' => toGmtOffset('Europe/Warsaw' ). " Warsaw", 'Europe/Zagreb' => toGmtOffset('Europe/Zagreb' ). " Zagreb", 'Europe/Athens' => toGmtOffset('Europe/Athens' ). " Athens", 'Europe/Bucharest' => toGmtOffset('Europe/Bucharest' ). " Bucharest", 'Africa/Cairo' => toGmtOffset('Africa/Cairo' ). " Cairo", 'Africa/Harare' => toGmtOffset('Africa/Harare' ). " Harare", 'Europe/Helsinki' => toGmtOffset('Europe/Helsinki' ). " Helsinki", 'Europe/Istanbul' => toGmtOffset('Europe/Istanbul' ). " Istanbul", 'Asia/Jerusalem' => toGmtOffset('Asia/Jerusalem' ). " Jerusalem", 'Europe/Kiev' => toGmtOffset('Europe/Kiev' ). " Kyiv", 'Europe/Minsk' => toGmtOffset('Europe/Minsk' ). " Minsk", 'Europe/Riga' => toGmtOffset('Europe/Riga' ). " Riga", 'Europe/Sofia' => toGmtOffset('Europe/Sofia' ). " Sofia", 'Europe/Tallinn' => toGmtOffset('Europe/Tallinn' ). " Tallinn", 'Europe/Vilnius' => toGmtOffset('Europe/Vilnius' ). " Vilnius", 'Asia/Baghdad' => toGmtOffset('Asia/Baghdad' ). " Baghdad", 'Asia/Kuwait' => toGmtOffset('Asia/Kuwait' ). " Kuwait", 'Africa/Nairobi' => toGmtOffset('Africa/Nairobi' ). " Nairobi", 'Asia/Riyadh' => toGmtOffset('Asia/Riyadh' ). " Riyadh", 'Europe/Moscow' => toGmtOffset('Europe/Moscow' ). " Moscow", 'Asia/Tehran' => toGmtOffset('Asia/Tehran' ). " Tehran", 'Asia/Baku' => toGmtOffset('Asia/Baku' ). " Baku", 'Europe/Volgograd' => toGmtOffset('Europe/Volgograd' ). " Volgograd", 'Asia/Muscat' => toGmtOffset('Asia/Muscat' ). " Muscat", 'Asia/Tbilisi' => toGmtOffset('Asia/Tbilisi' ). " Tbilisi", 'Asia/Yerevan' => toGmtOffset('Asia/Yerevan' ). " Yerevan", 'Asia/Kabul' => toGmtOffset('Asia/Kabul' ). " Kabul", 'Asia/Karachi' => toGmtOffset('Asia/Karachi' ). " Karachi", 'Asia/Tashkent' => toGmtOffset('Asia/Tashkent' ). " Tashkent", 'Asia/Kolkata' => toGmtOffset('Asia/Kolkata' ). " Kolkata", 'Asia/Kathmandu' => toGmtOffset('Asia/Kathmandu' ). " Kathmandu", 'Asia/Yekaterinburg' => toGmtOffset('Asia/Yekaterinburg' ). " Ekaterinburg", 'Asia/Almaty' => toGmtOffset('Asia/Almaty' ). " Almaty", 'Asia/Dhaka' => toGmtOffset('Asia/Dhaka' ). " Dhaka", 'Asia/Novosibirsk' => toGmtOffset('Asia/Novosibirsk' ). " Novosibirsk", 'Asia/Bangkok' => toGmtOffset('Asia/Bangkok' ). " Bangkok", 'Asia/Jakarta' => toGmtOffset('Asia/Jakarta' ). " Jakarta", 'Asia/Krasnoyarsk' => toGmtOffset('Asia/Krasnoyarsk' ). " Krasnoyarsk", 'Asia/Chongqing' => toGmtOffset('Asia/Chongqing' ). " Chongqing", 'Asia/Hong_Kong' => toGmtOffset('Asia/Hong_Kong' ). " Hong Kong", 'Asia/Kuala_Lumpur' => toGmtOffset('Asia/Kuala_Lumpur' ). " Kuala Lumpur", 'Australia/Perth' => toGmtOffset('Australia/Perth' ). " Perth", 'Asia/Singapore' => toGmtOffset('Asia/Singapore' ). " Singapore", 'Asia/Taipei' => toGmtOffset('Asia/Taipei' ). " Taipei", 'Asia/Ulaanbaatar' => toGmtOffset('Asia/Ulaanbaatar' ). " Ulaan Bataar", 'Asia/Urumqi' => toGmtOffset('Asia/Urumqi' ). " Urumqi", 'Asia/Irkutsk' => toGmtOffset('Asia/Irkutsk' ). " Irkutsk", 'Asia/Seoul' => toGmtOffset('Asia/Seoul' ). " Seoul", 'Asia/Tokyo' => toGmtOffset('Asia/Tokyo' ). " Tokyo", 'Australia/Adelaide' => toGmtOffset('Australia/Adelaide' ). " Adelaide", 'Australia/Darwin' => toGmtOffset('Australia/Darwin' ). " Darwin", 'Asia/Yakutsk' => toGmtOffset('Asia/Yakutsk' ). " Yakutsk", 'Australia/Brisbane' => toGmtOffset('Australia/Brisbane' ). " Brisbane", 'Australia/Canberra' => toGmtOffset('Australia/Canberra' ). " Canberra", 'Pacific/Guam' => toGmtOffset('Pacific/Guam' ). " Guam", 'Australia/Hobart' => toGmtOffset('Australia/Hobart' ). " Hobart", 'Australia/Melbourne' => toGmtOffset('Australia/Melbourne' ). " Melbourne", 'Pacific/Port_Moresby' => toGmtOffset('Pacific/Port_Moresby' ). " Port Moresby", 'Australia/Sydney' => toGmtOffset('Australia/Sydney' ). " Sydney", 'Asia/Vladivostok' => toGmtOffset('Asia/Vladivostok' ). " Vladivostok", 'Asia/Magadan' => toGmtOffset('Asia/Magadan' ). " Magadan", 'Pacific/Auckland' => toGmtOffset('Pacific/Auckland' ). " Auckland", 'Pacific/Fiji' => toGmtOffset('Pacific/Fiji' ). " Fiji", );