已编辑(原答案完全废弃)
一种方法是创建一个偏移小时字符串(例如+0800)到 PHP 识别的时区名称的映射。它不是一对一的,因为每个偏移量都有多个名称。但是由于您关心的是偏移量而不是名称,因此您的映射可以为任何给定的偏移量选择任何可用的时区名称。
由于没有成百上千的时区,因此您最终只会得到大约 35 个条目的数组(在 30 分钟甚至 45 分钟标记处有几个时区)。
这是一个几乎可以满足您需要的代码示例:
$timezones = array(
'-1100' => 'Pacific/Midway',
'-1000' => 'US/Hawaii',
'-0900' => 'US/Alaska',
'-0800' => 'US/Pacific',
'-0700' => 'US/Arizona',
'-0600' => 'America/Mexico_City',
'-0500' => 'US/Eastern',
'-0430' => 'America/Caracas',
'-0400' => 'Canada/Atlantic',
'-0330' => 'Canada/Newfoundland',
'-0300' => 'America/Buenos_Aires',
'-0200' => 'Atlantic/Stanley',
'-0100' => 'Atlantic/Azores',
'-0100' => 'Atlantic/Cape_Verde',
'+0000' => 'Europe/London',
'+0100' => 'Europe/Amsterdam',
'+0200' => 'Europe/Athens',
'+0300' => 'Asia/Baghdad',
'+0330' => 'Asia/Tehran',
'+0400' => 'Europe/Moscow',
'+0430' => 'Asia/Kabul',
'+0500' => 'Asia/Karachi',
'+0530' => 'Asia/Kolkata',
'+0545' => 'Asia/Kathmandu',
'+0600' => 'Asia/Yekaterinburg',
'+0700' => 'Asia/Novosibirsk',
'+0800' => 'Asia/Krasnoyarsk',
'+0800' => 'Asia/Urumqi',
'+0900' => 'Asia/Irkutsk',
'+0930' => 'Australia/Adelaide',
'+1000' => 'Asia/Yakutsk',
'+1000' => 'Australia/Sydney',
'+1100' => 'Asia/Vladivostok',
'+1200' => 'Asia/Magadan'
);
for ($offset_hours = -11; $offset_hours <= 12; $offset_hours++) {
// Convert to a timezone string. For example, 8 => +0800
$offset_string = sprintf("%+03d", $offset_hours) . "00";
date_default_timezone_set($timezones[$offset_string]);
$dt = new DateTime();
print "OFFSET: $offset_hours hours ($offset_string)\n";
print $dt->format(DATE_RFC822) . "\n";
print "\n";
}
for 循环只是演示了几乎基于迭代偏移量的所有不同时区的设置(为简单起见,我排除了 30 分钟和 45 分钟标记时区)。 p>
以下是运行上述代码的输出摘录:
OFFSET: -11 hours (-1100)
Tue, 25 Feb 14 04:24:13 -1100
OFFSET: -10 hours (-1000)
Tue, 25 Feb 14 05:24:13 -1000
OFFSET: -9 hours (-0900)
Tue, 25 Feb 14 06:24:13 -0900
...
...
...
OFFSET: -1 hours (-0100)
Tue, 25 Feb 14 14:24:13 -0100
OFFSET: 0 hours (+0000)
Tue, 25 Feb 14 15:24:13 +0000
OFFSET: 1 hours (+0100)
Tue, 25 Feb 14 16:24:13 +0100
...
...
...
OFFSET: 10 hours (+1000)
Wed, 26 Feb 14 02:24:13 +1100
OFFSET: 11 hours (+1100)
Wed, 26 Feb 14 02:24:13 +1100
OFFSET: 12 hours (+1200)
Wed, 26 Feb 14 03:24:13 +1200
感谢@Eugene Manuilov his StackOverflow answer 关于 PHP 时区,因为这意味着我不必完全从头开始编写数组。