2017-08-04 104 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 />'; 
}