检查时区是否有 DST

Check if timezone has 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;
}

它只是显示不同时间的时区

谢谢

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

    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 />';
    }

这将带和不带 DST 的不同时区从大约 1500 个减少到 68 个。

干杯,感谢大家。

这个解决方案怎么样?它根据实际时区生成 timezones/cities 的列表和从初始 $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 />';
}