PHP летнее время обнаружения - PullRequest
27 голосов
/ 27 мая 2011

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

Вот пример, иллюстрирующий это:

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

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

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

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

Ответы [ 3 ]

26 голосов
/ 27 мая 2011

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

20 голосов
/ 14 июня 2012

Как указывает Джимми, вы можете использовать переходы часовых поясов, но это не доступно в 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 (), если вы хотите указать дату и время, отличное от текущего времени сервера.

13 голосов
/ 27 мая 2011

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

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

...