PHP летнее время обнаружения

Мне нужно отправить электронное письмо пользователям из любой точки мира в 9:00 по местному времени. Сервер находится в Великобритании. Что я могу сделать, так это установить разницу во времени между каждым пользователем и временем сервера, которая в таком случае прекрасно работала бы, если бы летнее время не существовало.

Вот пример, чтобы проиллюстрировать это:

  • Джон работает в Нью-Йорке, -5 часов с сервера (Великобритания) время
  • Ричард работает в Лондоне, Великобритания, поэтому разница с сервером составляет 0 часов.

Когда сервер переходит из GMT в GMT +1 (BST) в 2:00 утра в определенное воскресенье, это означает, что у Джона теперь разница во времени -6H.

Этот сценарий я все еще могу обработать, обновляя всех пользователей за пределами локального времени сервера, но как только я переместил время вперед / назад времени всех других пользователей, мне все еще нужен способ определить, когда (время и дата) пользователей живут за пределами Великобритании будет (или не будет) менять местное время на вероятное летнее время.

Мне нужен метод PHP, чтобы знать / определять, когда другие части мира будут входить / выходить из DST.

4 ответа

Решение

Вам нужно знать все детали перехода DST самостоятельно? или вам просто нужно знать, когда 9:00 утра в заданном часовом поясе?

Если это последнее, PHP может использовать базу данных часовых поясов вашей операционной системы, чтобы сделать это для вас. Функция strtotime() замечательно хороша в "выяснении" того, что вы имеете в виду:

echo strtotime("today 9:00 am America/New_York");  // prints "1306501200"
echo strtotime("today 9:00 am Europe/London");     // prints "1306483200"

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

Как указывает Джимми, вы можете использовать переходы часовых поясов, но это не доступно в PHP <5.3. так как dateTimeZone() - это PHP>=5.2.2, но getTransitions() с аргументами - нет! В этом случае здесь есть функция, которая может дать вам данные часового пояса, в том числе в летнее время или нет.

function timezonez($timezone = 'Europe/London'){
    $tz = new DateTimeZone($timezone);
    $transitions = $tz->getTransitions();
    if (is_array($transitions)){
        foreach ($transitions as $k => $t){
            // look for current year
            if (substr($t['time'],0,4) == date('Y')){
                $trans = $t;
                break;
            }
        }
    }
    return (isset($trans)) ? $trans : false;
}

Сказав это, есть более простой метод, использующий функцию date(), если вам просто нужно знать, находится ли часовой пояс в летнее время. Например, если вы хотите знать, находится ли Великобритания в DST, вы можете сделать это:

date_default_timezone_set('Europe/London');
$bool = date('I'); // this will be 1 in DST or else 0

... или укажите метку времени в качестве второго аргумента для date(), если вы хотите указать дату и время, отличное от текущего времени сервера.

Немного изменив мой ответ: DateTimeZone:: getTransitions выглядит так, как будто он будет делать то, что вам нужно, при условии, что у вас PHP >= 5.2.

Из комментария в документации:

<?php 
$theTime = time(); // specific date/time we're checking, in epoch seconds. 

$tz = new DateTimeZone('America/Los_Angeles'); 
$transition = $tz->getTransitions($theTime, $theTime); 

// only one array should be returned into $transition. Now get the data: 
$offset = $transition[0]['offset']; 
$abbr = $transition[0]['abbr']; 
?>

Итак, все, что нам нужно сделать, это передать часовой пояс, который мы хотим проверить, и мы можем узнать, находится ли этот часовой пояс в летнее время / каково смещение. Затем вам нужно будет проверить смещение по Гринвичу, чтобы увидеть, хотите ли вы отправить свою электронную почту сейчас или нет сейчас.

Я создал эту функцию PHP, чтобы узнать, является ли значение времени BST или нет:

      <?php
function isBST($timestamp)
{
    $baseDate = date("m/d/Y H:i:s", $timestamp);
    $clocktime=strtotime($baseDate." Europe/London")."\n";
    $utctime=strtotime($baseDate." UTC")."\n";
    //echo "$a \n$b \n";
    if ($clocktime!=$utctime)
    {
        return true;
    }
    else
    {
        return false;
    }
}

?>
Другие вопросы по тегам