我需要将时区选择器显示为用户控件,这似乎总是比实际上更容易。在内部,我使用 DateTimeZone 标识符存储所有内容,因为这似乎是获得所需准确度水平的最明智的方式,因为该项目连接了与地面媒体相关的现实世界时间。
我不想做的是显示一个包含 300 多个时区的选择框,我也不想使用“UTC-8”之类的东西创建伪造的时区偏移量(它不仅会丢失 DST 信息,还会丢失实际的DST 所在的日期)。
最后,我需要一个选项,其中包含正确的 TZD 标识符,类似这样(括号中的 #s 不是必需的,仅用于潜在的最终用户说明):
<select>
<option value="America/Los_Angeles">Los Angeles [UTC-7 | DST]</option>
...
</select>
有没有人对建立这个列表有任何建议?我用谷歌搜索的所有解决方案都以某种方式存在问题。
我添加了一个赏金,以防可能诱使某人与我们分享更好的答案。 :)
最佳答案
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 $sign . str_pad($hour, 2, '0', STR_PAD_LEFT) .':'. str_pad($minutes,2, '0');
}
$utc = new DateTimeZone('UTC');
$dt = new DateTime('now', $utc);
echo '<select name="userTimeZone">';
foreach(DateTimeZone::listIdentifiers() as $tz) {
$current_tz = new DateTimeZone($tz);
$offset = $current_tz->getOffset($dt);
$transition = $current_tz->getTransitions($dt->getTimestamp(), $dt->getTimestamp());
$abbr = $transition[0]['abbr'];
echo '<option value="' .$tz. '">' .$tz. ' [' .$abbr. ' '. formatOffset($offset). ']</option>';
}
echo '</select>';
上面将输出选择菜单中的所有时区,格式如下:
<select name="userTimeZone">
<option value="America/Los_Angeles">America/Los_Angeles [PDT -7]</option>
</select>
关于php - 用 TimeZones 填充 <SELECT> 框的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921827/