检查时区是否有DST

时间:2017-08-04 09:25:21

标签: php datetime timezone dst

目前我正在尝试检测时区是否完全是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;
}

它只显示不同时间的时区

由于

2 个答案:

答案 0 :(得分:0)

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

    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。

干杯并感谢所有人。

答案 1 :(得分:0)

这个解决方案怎么样?如果DST现在处于活动状态,它会根据实际时区生成从初始$mytime计算的时区/城市和时间列表。我认为你不必为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 />';
}