php переход на зимнее время
Эта тема затронула меня именно в день перехода на зимнее время, таймштампы странно чудили и парадокс для меня заключался в следующем:
1162076399 > 1162076400
то есть:
1162076399 — 02:59:59 29.10.2006
1162076400 — 02:00:00 29.10.2006
Небольшой анализ показал следующее:
1162072799 — 01:59:59 29.10.2006
1162072800 — 02:00:00 29.10.2006
1162072801 — 02:00:01 29.10.20061162076399 — 02:59:59 29.10.2006
1162076400 — 02:00:00 29.10.2006
1162076401 — 02:00:01 29.10.2006
Вывод: не стоит полагаться на определение времени например вчера, способом вычета 86400 секунд из таймштампа, т.к. в день перевода на зимнее время мы получим дату на час позже.
Работа с датой и временем в часовых поясах
Задачка: найти текущий offset (разницу) часового пояса Europe/Moscow от GMT-0
$dateTimeZoneGMT_0 = new DateTimeZone(‘GMT’);
$dateGMT_0 = new DateTime(«now», $dateTimeZoneGMT_0);
$dateTimeZone = new DateTimeZone(‘Europe/Moscow’);
echo $timeOffset = $dateTimeZone->getOffset($dateGMT_0);
получаю 14400 секунд / 3600 секунд = 4 часа
или в процедурном стиле:
echo timezone_offset_get($dateTimeZone, $dateGMT_0);
Интересно
С датой времени можно играть и подставляя минусы или плюсы, например:
$t3 = new DateTime( ‘-3 day’ );
$t2 = new DateTime( ‘-2 day’ );
$dateTime = max( $t3, $t2 );// можно даже сравнивать даты функцией max
echo $dateTime->format(‘Y-m-d’);
выводит дату $t2 т.к. она больше.
Недопонимание
Не удается найти таймзону по дате времени:
$date = new DateTime(’2013-09-30 15:36:00+04′);
$timezone = $date->getTimezone();
echo $timezone->getName();
выводит +04:00 а казалось должно выводить Europe/Moscow, но все работает правильно, т.к. в GTM+4 есть множество временных зон:
Europe/Moscow, Europe/Samara, Europe/Simferopol, Europe/Volgograd
Если хочется получить весь список таймзон, то сделать это можно так:
$array = DateTimeZone::listIdentifiers();// эквивалентно DateTimeZone::listIdentifiers(DateTimeZone::ALL);
print_r($array);
для европы
$array = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
или по буквенному алиасу, например для америки:
$array = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, ‘US’);
Пример выбора всех таймзон-имен для GMT-4:
$dateTimeZoneGMT_0 = new DateTimeZone('GMT'); $dateGMT_0 = new DateTime("now", $dateTimeZoneGMT_0); $array = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE); $listGMT4 = array(); foreach($array as $timeZoneName){ $dateTimeZone = new DateTimeZone($timeZoneName); if( $dateTimeZone->getOffset($dateGMT_0)/ 3600 == 4){ $listGMT4[] = $timeZoneName; } } print_r($listGMT4);
И в завершении статьи — отличный
Источник: yapro.ru