19 августа 2011
Пересчет часового пояса с учетом летнего времени на 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 <- правильно
На последок два момента:
- не забывайте, что не во всех странах есть переход на летнее/зимнее время;
- часовой пояс с минутами нужно сначала перевести в десятичное число, т.е. например для вычисления GMT+5:45 передавать в функцию нужно число 5.75, а не 5.45.
Похожие материалы: Работа со временем в PHP/MySQL
Понравилась статья? Расскажите о ней друзьям:
На главную :
Раньше : Позже