Пересчет часового пояса с учетом летнего времени на PHP

версия для печати

Понесло меня по теме времени :). Не нашел, где разместить эту php-функцию, поэтому оформляю, как новую запись. Применение функции: передаем ей UTC-значение времени (timestamp) и нужный часовой пояс (число), получаем timestamp-время в указанном поясе с учетом летнего/зимнего времени.

Исходный код нашел здесь, автор - Matthew Waygood. Переписал под свою логику, вот что получилось:

function time_shift($timestamp=0,$GMT_shift=0)
{
  //Если функция вызвана без указания времени, берем текущее UTC-время
  if ($timestamp==0) $timestamp=time();

  $this_year=gmdate("Y", $timestamp);//Получаем номер года

  //Последнее воскресенье в марте указанного года в час ночи по UTC
  $last_day_of_march=gmmktime(1,0,0,3,31,$this_year);
  $last_sunday_of_march=strtotime("-".gmdate("w", $last_day_of_march)." day", $last_day_of_march);

  //Последнее воскресенье в октябре указанного года в час ночи по UTC
  $last_day_of_october=gmmktime(1,0,0,10,31,$this_year);
  $last_sunday_of_october=strtotime("-".gmdate("w", $last_day_of_october)." day", $last_day_of_october);

  if(($timestamp > $last_sunday_of_march) && ($timestamp < $last_sunday_of_october))
    $timestamp=$timestamp+3600;      //поправка на час вперед
 
  $timestamp=$timestamp+3600*$GMT_shift;
  return $timestamp;
}

Чтобы почувствовать разницу, берем пример. Часовой пояс скрипта специально ставим в GMT. После чего пытаемся получить текущее время на машине, часовой пояс которой GMT+8:00.

date_default_timezone_set('GMT');
$t=time();
echo 'direct '. strftime("%H:%M:%S",$t + 3600*8)."\n";    //+8:00 часов прямым расчетом 
echo 'function '. strftime("%H:%M:%S",time_shift($t, 8)); //с учетом летнего/зимнего времени.

Реальная дата/время на машине в момент выполнения скрипта была "19 августа 2011 14:21:49 (GMT+8:00)". Результат выполнения такой:

direct 13:21:49 <- не правильно
function 14:21:49 <- правильно

На последок два момента:

  1. не забывайте, что не во всех странах есть переход на летнее/зимнее время;
  2. часовой пояс с минутами нужно сначала перевести в десятичное число, т.е. например для вычисления GMT+5:45 передавать в функцию нужно число 5.75, а не 5.45.

[1oo%, EoF]


Похожие материалы: Работа со временем в PHP/MySQL
Понравилась статья? Расскажите о ней друзьям:

Метки: PHP, кодинг

Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки