PHP 时区列表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4755704/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 14:16:02  来源:igfitidea点击:

PHP Timezone List

phptimetimezone

提问by Jiew Meng

I am looking for a way to generate a list of timezones for display in a <select>Generating a drop down list of timezones with PHP

我正在寻找一种方法来生成时区列表以在使用 PHP 生成时区下拉列表中显示<select>

    $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');

}

When I checked my country, the offset was wrong, I am in Asia/Singapore, it should be UTC/GMT +8 http://www.timeanddate.com/worldclock/city.html?n=236but according to the generated list its +9. Is there some kind of logic error? The time was correct tho

当我检查我的国家时,偏移量是错误的,我在亚洲/新加坡,应该是 UTC/GMT +8 http://www.timeanddate.com/worldclock/city.html?n=236但根据生成的列出它的+9。是否存在某种逻辑错误?时间是对的

Is there a better way to generate this list? from the same question in the link above,

有没有更好的方法来生成这个列表?从上面链接中的同一问题,

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);
}

This just gets the identifiers I want a friendly display name eg. UTC+8 Asia/Singapore or something similar. How can I get that?

这只是获取我想要一个友好显示名称的标识符,例如。UTC+8 亚洲/新加坡或类似的地方。我怎么能得到那个?

回答by Eugene Manuilov

Take my array of time zones, which I made specially for select element. It is associated array where key is PHP time zone and value is human representation. This is it:

以我专门为 select 元素制作的时区数组为例。它是关联数组,其中键是 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 &amp; Canada)",
    'America/Tijuana'      => "(GMT-08:00) Tijuana",
    'US/Arizona'           => "(GMT-07:00) Arizona",
    'US/Mountain'          => "(GMT-07:00) Mountain Time (US &amp; 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 &amp; Canada)",
    'US/Eastern'           => "(GMT-05:00) Eastern Time (US &amp; 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",
);

回答by Tamás Pap

A completed list, I use in my apps:

一个完整的列表,我在我的应用程序中使用:

(Also check out: https://github.com/paptamas/timezones)

(另请查看: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 &amp; 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 &amp; Canada)' => 'America/Denver',
  '(GMT-06:00) Central America' => 'America/Managua',
  '(GMT-06:00) Central Time (US &amp; 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 &amp; 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',
);
?>

It is very importantto store timezone identifiers in your database and not just the timezone offset like "GMT+2", because of Daylight Saving Times.

这是非常重要的在你的数据库来存储时区标识符,而不仅仅是区偏移,因为夏令时报像“GMT + 2”。

回答by kami

I used both lists from Jiew Meng and Tamás Pap, for each I checked PHP support of timezone identifier (PHP supports less than world knows), and made a composite list. For those Timezones which were in both lists and had support by PHP but had different identifiers I selected ones that are used in Geonames cities DB. Result is below:

我使用了 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'
);

回答by mike

I have just had the same problem of making an easy to use time zone list. So I am using geoip (http://freegeoip.net) to get the user's country and then using:

我刚刚遇到了制作易于使用的时区列表的相同问题。所以我使用 geoip (http://freegeoip.net) 来获取用户的国家,然后使用:

$nearest_time_zones = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $country_code);

This is great because the list is generally very short. But in case the user wants to specify a different zone I append the entire list from DateTimeZone::listIdentifiers(). If you don't show all time zones, you're bound to have a user from a time zone that isn't listed.

这很好,因为列表通常很短。但如果用户想要指定不同的区域,我会从 DateTimeZone::listIdentifiers() 附加整个列表。如果您不显示所有时区,那么您肯定会有来自未列出时区的用户。

The resulting drop down looks like this (of course it's a lot longer than this):

结果下拉看起来像这样(当然比这长得多):

<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>

This application is still in development and hasn't had user feedback yet so I can't say that this has been a successful approach. But I thought that the geoip approach was worth mentioning.

此应用程序仍在开发中,尚未收到用户反馈,因此我不能说这是一种成功的方法。但我认为 geoip 方法值得一提。

回答by Meezaan-ud-Din

Try the following code from How do I get Greenwich Mean Time in PHP?. I use it on one of my apps, but you can change the markup to display whatever you want:

尝试从如何在 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;
}

Then:

然后:

<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>

回答by Faiyaz Alam

try this:

尝试这个:

<?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>

Source: http://www.pontikis.net/tip/?id=24

来源:http: //www.pontikis.net/tip/?id=24

HTH

HTH

回答by Milan Markovic

This is the solution that I find better than a hardcoded array, because offsets are calculated dynamically.

这是我发现比硬编码数组更好的解决方案,因为偏移量是动态计算的。

<?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 &amp; Canada)",
            'America/Tijuana'      => toGmtOffset('America/Tijuana'      ). " Tijuana",
            'US/Arizona'           => toGmtOffset('US/Arizona'           ). " Arizona",
            'US/Mountain'          => toGmtOffset('US/Mountain'          ). " Mountain Time (US &amp; 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 &amp; Canada)",
            'US/Eastern'           => toGmtOffset('US/Eastern'           ). " Eastern Time (US &amp; 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",
            );

回答by Joel Joseph

if you are looking to generate a similar timezone list as give in the image below

如果您希望生成如下图所示的类似时区列表

Timezone Dropdown list

时区下拉列表

You can use the following php code to generate the dropdown list using the DateTimeZone::listIdentifiers-- timezone_identifiers_list — Returns a numerically indexed array containing all defined timezone identifiers.If you want a list of ALL possible values (including backwards compatible aliases), use DateTimeZone::ALL_WITH_BCin place of DateTimeZone::ALL

您可以使用以下 php 代码生成下拉列表,使用DateTimeZone::listIdentifiers-- timezone_identifiers_list — 返回一个包含所有定义时区标识符的数字索引数组。如果您想要所有可能值的列表(包括向后兼容的别名),请使用DateTimeZone::ALL_WITH_BC代替DateTimeZone::ALL

echo "<select>";
$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
foreach($tzlist as $value)
{
  echo "<option value=". $value .">". $value ."</option>";
}
echo "<select>";

回答by Paul Scheltema

this method relies on your operating system, to make it so that it always works, just store the excisting timezones in an array/database, also you need to take into account the daylightsavingstime(s) wich can be quite some work

此方法依赖于您的操作系统,以使其始终有效,只需将 excisting 时区存储在数组/数据库中,您还需要考虑夏令时,这可能是相当多的工作

sourece http://en.wikipedia.org/wiki/Time_zone: PHP

来源http://en.wikipedia.org/wiki/Time_zone: PHP

The DateTime objects and related functions have been compiled into the PHP core since 5.2. This includes the ability to get and set the default script timezone, and DateTime is aware of its own timezone internally. PHP.net provides extensive documentation on this.[20] As noted there, the most current timezone database can be implemented via the PECL timezonedb.

从 5.2 开始,DateTime 对象和相关函数已被编译到 PHP 核心中。这包括获取和设置默认脚本时区的能力,并且 DateTime 在内部知道它自己的时区。PHP.net 为此提供了大量文档。[20] 如上所述,最新的时区数据库可以通过 PECL timezonedb 实现。

so either make the db yourself, or use the PECL timezonedb

所以要么自己制作数据库,要么使用PECL timezonedb

回答by Peter Pan

I would like to leave here this idea:

我想在这里留下这个想法:

/*----------TIME ZONE LIST---------*/
function TZList($data_type = false){
    $_all_timezone_identifiers = DateTimeZone::listIdentifiers(DateTimeZone::ALL);
    $TIMEZONE_LIST = array();
    foreach($_all_timezone_identifiers as $k => $v){
        $_tzone_group = explode("/", $_all_timezone_identifiers[$k])[0];

        $_tzone_new = new DateTimeZone($_all_timezone_identifiers[$k]);
        $_tzone_new_date = new DateTime("now", $_tzone_new);

        $tzone_arr = array(
                            'timezone' => $_all_timezone_identifiers[$k],
                            'timediff' => $_tzone_new_date->format('P'),
                            'timezone_offset' => $_tzone_new_date->format('Z')/60, //minutes
                            'text' => "(GMT" .$_tzone_new_date->format('P') .") " .$_all_timezone_identifiers[$k]
                            );

        //BY CONTINENT
        if($data_type === true) $TIMEZONE_LIST[$_tzone_group][] = $tzone_arr; else $TIMEZONE_LIST[] = $tzone_arr;
    }

    //BY TIMEZONE: "America/New_York"
    if(is_string($data_type)){
        $key = array_search($data_type, array_column($TIMEZONE_LIST, 'timezone'));
        $TIMEZONE_LIST = $key !== false ? $TIMEZONE_LIST[$key] : null;
    }

    return $TIMEZONE_LIST;
}
/*--------------------------------*/

Thank you.

谢谢你。