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