【问题标题】:Check if timezone has DST检查时区是否有夏令时
【发布时间】:2018-01-12 04:07:09
【问题描述】:

目前我正在尝试检测一个时区是否有 DST,而不是 DST 是否影响当前的时区。

我的代码现在是这样的:

function timezoneDoesDST($tzId) {
    $tz = new DateTimeZone($tzId);
    return count($tz->getTransitions(time())) > 0;
}
$tz = new DateTimeZone('UTC');
$termin = new DateTime('2017-08-04 12:00:00',$tz);
$mytimezone=array();
foreach(timezone_abbreviations_list() as $abbr => $timezone){
    foreach($timezone as $val){
        if(isset($val['timezone_id'])){
            $found = 0;
            $tz2 = new DateTimeZone($val['timezone_id']);
            $termin->setTimezone($tz2);
            foreach($mytimezone as $mytz)
            {
                if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
                {
                    $found = 1;
                    if(timezoneDoesDST($val['timezone_id']))
                    {
                        $found = 0;
                    }
                }
            }
            if($found == 0)
            {
                $mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id']);
            }
        }
    }
}
foreach($mytimezone as $mytz)
{
    echo $mytz['time'].' - '.$mytz['timezone_id'].'<br />';
}

问题是,我不会显示具有不同时间的所有不同时区以及具有 DST 的时区。

但目前它会显示所有时区,如果我删除它:

if(timezoneDoesDST($val['timezone_id']))
{
    $found = 0;
}

它只显示不同时间的时区

谢谢

【问题讨论】:

  • 不确定我是否理解您要执行的操作。您是否正在尝试重新发明 date("I") 函数? 3v4l.org/WCIV4php.net/manual/en/function.date.php
  • 那么想要的结果是什么?您想要使用 DST 的时区列表吗?
  • @Andreas Tht date("l") 如果我是正确的,如果 DST 当前正在影响时间,则函数只会返回。但我想全年生成这个列表,结果相同。所以 date("l") 函数对我不起作用
  • @JanRydrych 我想显示所有使用 DST 的不同时间和时区的时区,而不仅仅是目前。因此,如果有人不改变他的时区,他可以选择一个与他的时间和 DST 相匹配的时区。
  • 如果您现在运行它并保存列表,您将获得全年工作列表或其他内容。请记住 date() 将考虑到并非所有国家/地区都在 DST 和非 DST 之间切换相同的日期。

标签: php datetime timezone dst


【解决方案1】:

好的,如果有人需要,我已经稍微更新了我的代码以减少所选时区的数量:

    function timezoneDoesDST($tzId) {
        $tz = new DateTimeZone($tzId);
        return count($tz->getTransitions(time())) > 0;
    }
    $tz = new DateTimeZone('UTC');
    $termin = new DateTime('2017-08-04 12:00:00',$tz);
    $mytimezone=array();
    $y = 0;
    foreach(timezone_abbreviations_list() as $abbr => $timezone){

        foreach($timezone as $val){
            if(isset($val['timezone_id'])){
                $y++;
                $found = 0;
                $found2 = 0;
                $tz2 = new DateTimeZone($val['timezone_id']);
                $termin->setTimezone($tz2);
                foreach($mytimezone as $mytz)
                {
                    if($mytz['time'] == $termin->format('Y-m-d H:i:s'))
                    {
                        $found = 1;
                    }
                    if(timezoneDoesDST($val['timezone_id']))
                    {
                        if($mytz['time'] == $termin->format('Y-m-d H:i:s') and $mytz['timezone_id'] != $val['timezone_id'] and $mytz['DST'] == 0)
                        {
                            $found2 = 1;
                            $found = 0;
                        }
                    }
                }
                if($found == 0)
                {
                    $mytimezone[] = array('time' => $termin->format('Y-m-d H:i:s'),'timezone_id' => $val['timezone_id'],'DST' => $found2);
                }
            }
        }
    }
    $mylist = count($mytimezone);
    echo $mylist.' - '.$y.'<br /><br />';
    foreach($mytimezone as $mytz)
    {
        echo $mytz['time'].' - '.$mytz['DST'].' - '.$mytz['timezone_id'].'<br />';
    }

这将它从大约 1500 个减少到 68 个不同的时区(有和没有 DST)。

干杯并感谢大家。

【讨论】:

  • 我发现,我发布的第一个代码向我显示了包含和不包含 DST 的所有时区,数量为 1500。这已经是正确的(我没有注意到)。现在我已经删除了具有相同时间和相同 DST 的重复时区。所以现在只有 68 岁。
【解决方案2】:

这个解决方案怎么样?它根据实际时区生成从初始$mytime 计算的时区/城市列表和时间列表,如果 DST 现在处于活动状态。我认为您不必为 DST 烦恼(恕我直言,用户不在乎,他想知道他的时区的时间......)

$tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);

$mytz = new DateTimeZone('UTC');
$mytermin = new DateTime('2017-08-04 12:00:00',$mytz);

foreach($tzlist as $tzStr){
    $tz = new DateTimeZone($tzStr);
    $mytermin->setTimezone($tz);
    echo $mytermin->format('Y-m-d H:i:s').' - '.$tzStr.'<br />';
}

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 2015-02-26
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多