php - 用 TimeZones 填充 <SELECT> 框的最佳方法

标签 php

我需要将时区选择器显示为用户控件,这似乎总是比实际上更容易。在内部,我使用 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/

相关文章:

php - 获得插入数据库的正确结果 - Laravel

php - 如何转换给定格式的日期

javascript - jQuery 菜单不加载 PHP 子类别

php - 如何递归迭代字母表?

php - 本地化 .po 文件格式

php - 将多个 PHP 变量放入 Javascript 数组中

javascript - AJAX - 如何在弹出菜单中运行脚本

php - YouTube API无法在Codeigniter中使用

php - 正则表达式:用不在单引号中的逗号分隔,允许转义引号

php - PHP 操作码与实际执行的二进制代码有何关系?