datetime — Как работает летнее время в php (разница между php и hhvm)?

Мне нужно определить, когда временная метка находится в летнее время или нет.

Я использую этот код для проверки функциональности:

<?php
date_default_timezone_set('Europe/Berlin');

$timestamp = $baseTimestamp = 1509234900; // Sunday, 29 October of 2017 1:55:00 GMT+02:00 DST
$date = (new DateTime)->setTimestamp($baseTimestamp);

echo "DateTime\t\t| Is in summer \t| Minutes passed\n";

for($i = 0; $i < 70; $i++) {
$date = (new DateTime)->setTimestamp($timestamp);
echo $date->format("Y-m-d H:i:s \t|I") . "\t\t| " . ($timestamp - $baseTimestamp)/60 . "\n";
$timestamp = $timestamp + 60;
}

https://3v4l.org/dqNlK

Работать с Европа / Берлин, Я видел, что в марте, когда в 2.00 мы переходим от зимы к лету, php решает это правильно, но затем в октябре, когда он должен вернуться с лета на зиму в 3.00, он не работает так, как ожидалось.

В этом случае у нас есть две метки времени, соответствующие одному и тому же часу (при 3 снова 2), но метка времени уникальна, поэтому для 2.00 одна метка времени должна быть летом, а другая — зимой.

Используя hhvm, он показывает правильное значение, но обычные интерпретаторы php показывают, что это не летом для обоих 2.00 (первый, который в 2 часа ночи, и второй, когда в 3 часа ночи снова 2 часа ночи. Это тот, который должен сказать уже не летом)

0

Решение

Да, в PHP есть несколько долговременных, неразрешенных ошибок, связанных с DST.

Вы, кажется, ударил по этому:
https://bugs.php.net/bug.php?id=68549

0

Другие решения

function isSummer($timestamp) {
$date = (new DateTime)->setTimestamp($timestamp);

if ($date->format('I') == 1) {
return true;
}

return ($date->getTimestamp() > $timestamp);
}

Я думаю, что это поможет

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector