Определение летнего времени PHP
Мне нужно отправить электронное письмо пользователям, расположенным в любом месте в мире, в 9:00 по местному времени. Сервер находится в Великобритании. Я могу настроить разницу во времени между каждым пользователем и временем сервера, что тогда отлично работало бы, если бы DST не существовало.
Вот пример, чтобы проиллюстрировать это:
- Джон работает в Нью-Йорке, через 5 часов с сервера (Великобритания).
- Ричард работает в Лондоне, Великобритания, поэтому разница в 0 часах с сервером.
Когда сервер переходит с GMT на GMT +1 (BST) в 2 часа ночи в определенное воскресенье, это означает, что сейчас у пользователя теперь есть разница в -6H.
Этот сценарий я все еще могу обработать, обновив все пользователи за пределами локального времени сервера, но как только я переместил вперед/назад время всех остальных пользователей, мне все же нужен способ определить, когда (время и дата) пользователи, живущие за пределами Великобритании, изменят свое местное время (или не изменят) на вероятный DST.
Мне нужен PHP-метод, чтобы знать/обнаруживать, когда другие части мира войдут/выйдут из DST.
Ответы
Ответ 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, чтобы узнать, хотите ли вы отправить свое электронное письмо сейчас или нет.