Подтвердить что ты не робот

Определение летнего времени PHP

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

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

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

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

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

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

4b9b3361

Ответ 1

Вам нужно знать все детали перехода 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 часовых поясов.

Ответ 2

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

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. Например, если вы хотите узнать, есть ли Великобритания в DST, вы можете это сделать:

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

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

Ответ 3

Я немного изменил свой ответ: 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']; 
?>

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