php переход на зимнее время

Автор: Aport Пятница, Январь 30th, 2015 Нет комментариев

Рубрика: Разное

Эта тема затронула меня именно в день перехода на зимнее время, таймштампы странно чудили и парадокс для меня заключался в следующем:

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.2006

1162076399 — 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

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты