2017-08-04 106 views
0

此刻,我正在尝试检测时区是否具有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; 
} 

这只是显示我有不同的时间的时区

感谢

+0

不知道我明白你想要做什么。你想重新发明日期(“我”)功能吗? https://3v4l.org/WCIV4和http://php.net/manual/en/function.date.php – Andreas

+0

那么期望的结果是什么?你想要一个使用DST的时区列表吗? –

+0

@Andreas如果我正确的时候DST正在影响时间,那么日期(“l”)函数就会返回。但是我想整年生成这份清单,结果相同。所以日期(“l”)函数不适用于我 –

回答

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的时区。

干杯和感谢所有。

+0

我发现,我发布的第一个代码向我展示了所有带DST和不带DST的时区,数量为1500.这已经是正确的了(我没有注意到)。现在我已经用相同的时间和相同的DST删除了重复的时区。所以现在只有68。 –

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