Проверьте, есть ли у часового пояса летнее время

в данный момент я пытаюсь определить, имеет ли 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 />';
}

Дело в том, что я не буду отображать все разные часовые пояса с разными часовыми поясами, у которых вообще есть летнее время.

Но на данный момент он отображает все часовые пояса, и если я уберу это:

if(timezoneDoesDST($val['timezone_id']))
{
$found = 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 и без него.

Приветствия и спасибо всем.

0

Другие решения

Как насчет этого решения? Создает список часовых поясов / городов и времени, рассчитанных из начального $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 />';
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector