DateTime:: Diff должен рассчитывать правильный интервал и учитывать летнее время (DST) и високосные годы. Хотя, видимо, это не так. Код ужаса:
$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));
echo $d1->getOffset() / (60 * 60);
Печатает '2'! Имейте в виду, что время UTC = 1 час - 2 часа = 23:05:00 днем раньше.
echo $d2->getOffset() / (60 * 60);
Печатает '1'. Прошло DST. UTC time = 3h - 1h = 02:05:00.
$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Печатает '2'! Неправильно?
$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60;
echo "Calculated difference in hours: $hoursofdiff";
Печатает '3'! Правильно?
Когда часы были установлены в 03:00:00 по заданной дате, все шведы повернули свои часы на один час до 02:00:00. Это означает, что общая сумма, пройденная между 01:05 и 03:05, составляет три часа, так же, как и ручной расчет, эхо-сигнал при использовании UNIX TimeStamp. И, как мы рассчитываем на наших пальцах, если мы используем аналоговые часы. Более того, когда мы вычисляем разницу между двумя временными метками UTC, я получил PHP собственную логику смещений (!).
Это PHP или мой мозг перестает работать правильно? Выговор любого из вас всех богов, которые существуют на этом сайте, сделает меня такой счастливой!
Я использую PHP 5.4 (VC9) на Apache-сервере. К сожалению, я использую Windows 7 x64 в качестве ОС. Я тестировал свою настройку против всех утверждений об ошибках в PHP-классах Date/Time (есть пара, связанная с Windows) и может подтвердить, что в моей системе нет ни одного из них. За исключением вышеуказанного кода, я не обнаружил никаких других ошибок. Я в значительной степени подтвердил весь код и вывел книгу "Руководство по PHP Architect для даты и времени". Поэтому я должен заключить, что моя мозговая ведьма дефолтна, но я подумал, что сначала отдам ее первой.