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;
}
}
?>