php - 时间 - 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');



}



有什么逻辑错误? 时间是对的

是否有更好的方法来生成这个列表?


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亚洲/新加坡或类似地点,我怎么能得到?

时间:

我的时区数组,我专门为select元素制作的,它关联数组,其中key是php时区,value是人类表示,就是这样:


$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 &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',


);


?>



结果如下:


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


);



我只是在制作一个易于使用的时区列表时遇到了同样的问题,所以我正在使用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>



这个应用程序仍在开发中,还没有用户反馈,因此我不能说这是个成功的方法,但是我认为,geoip方法值得一提。

尝试以下代码来自如何在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>



来源:

HTH

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


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


 );




/*----------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;


 }



 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;


}


/*--------------------------------*/



谢谢

...