Вот тестовый код:
<?php ini_set('date.timezone', 'Europe/London'); $dt = new \DateTime('0000-00-00 00:00:00'); var_dump($dt);
Это обеспечивает:
object(DateTime)[1] public 'date' => string '-0001-11-30 00:00:00' (length=20) public 'timezone_type' => int 3 public 'timezone' => string 'Europe/London' (length=13)
Принимая во внимание, что это не действительная дата. Я не понимаю возвращаемого значения, особенно месяц … вы можете объяснить?
Здесь вы видите два эффекта. Первый заключается в том, что вы используете способ записи для даты, которая может быть записана в нескольких формах:
0000-01-01 same as 0000-01-01 0000-01-00 same as -0001-12-31 0000-00-01 same as -0001-12-01 0000-00-00 same as -0001-11-30
Таким образом, по самой дате вы уже указываете 30 ноября -1.
Теперь есть смещение по времени, которое отличается от 9 минут и 21 секунды. Это связано с изменением часов по сравнению с UTC в Париже / Франции, которое произошло 10 марта 1911 года 23: 51: 38/39 по местному времени.
Я немного изменил ваш пример кода и представил настройки Европы / Парижа, как у вас есть, что играет определенную роль. Этот код сообщает также смещение в секундах от UTC ( Z
), которое вы ищете:
$dt = new DateTime('0000-00-00 00:00:00', new DateTimeZone('Europe/Paris')); printf("%s secs offset from UTC\n", $dt->format('r T (e) Z'));
Я немного изменил даты
Fri, 10 Mar 1911 23:51:38 +0009 PMT (Europe/Paris) 561 secs offset from UTC ^^^
Через секунду:
Fri, 10 Mar 1911 23:51:39 +0000 WET (Europe/Paris) 0 secs offset from UTC
Когда местное стандартное время доходило до субботы, 11 марта 1911 года, 00:01:00 часы были повернуты назад 0:09:21 часов до пятницы, 10 марта 1911 года, 23:51:39 вместо местного времени.
Это 561 сек. Справка: изменения часов в Париже – даты смены времени в 1911 году и изменения часовых поясов и даты начала и окончания летнего времени между 1900 и 1924 годами .
Похоже, обработка ошибок в DateTime
является неполной. Обычно другие функции PHP обрабатывают «0000-00-00» как ошибку (неверная дата).
DateTime должен следовать тем же рекомендациям, но это не так. Этот код не генерирует исключение, даже если он должен :
try { $dt = new \DateTime('0000-00-00 00:00:00'); } catch (Exception $e) { var_dump($e); } var_dump($dt); /* result: object(DateTime)#1 (3) { ["date"]=> string(20) "-0001-11-30 00:00:00" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" */
Другие функции обрабатывают этот ввод как ошибку:
var_dump(strtotime('0000-00-00 00:00:00')); // returns: bool(false)
Кажется, что у PHP всегда были проблемы с обработкой этого случая. Примеры: Ошибка # 30190 , Ошибка # 60288
Cite из комментариев в PHP-трекер ошибок:
0000-00-00 – это несуществующая дата (за день до 01-01-0001 была 31/12 / -0001)