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

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

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

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

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

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

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

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

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

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