我正在寻找一种方法来生成一个时区列表,以便在<select>
Generating a drop down list of timezones with 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亚洲/新加坡或类似的东西。我怎么能得到它?
拿我的时区数组,这是我专门为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 & 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”等时区偏移。
我使用了Jiew Meng和TamásPap的两个列表,每次我检查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'
);
我刚刚遇到了制作易于使用的时区列表的问题。所以我使用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方法值得一提。
请尝试使用How do I get Greenwich Mean Time in 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>
这种方法依赖于你的操作系统,使其始终有效,只需将激动的时区存储在一个数组/数据库中,你也需要考虑到可能相当一些工作的白天时间。
来源http://en.wikipedia.org/wiki/Time_zone:PHP
自5.2以来,DateTime对象和相关函数已编译到PHP核心中。这包括获取和设置默认脚本时区的功能,DateTime在内部知道自己的时区。 PHP.net提供了大量的文档。[20]如上所述,最新的时区数据库可以通过PECL timezonedb实现。
所以要么自己制作数据库,要么使用PECL timezonedb
试试这个:
<?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
HTH
如果您要生成类似的时区列表,如下图所示
您可以使用以下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>";
这是我发现比硬编码阵列更好的解决方案,因为偏移是动态计算的。
<?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",
);