Я столкнулся с несколько необычным поведением PHP, которое заставило меня почесать голову. Я искренне не уверен, намеренное ли это поведение или ошибка. Я надеялся, что кто-нибудь объяснит, почему он ведет себя именно так.
Итак, конечно, класс PHP DateTime в целом довольно хорош для анализа строк даты в различных форматах:
echo (new DateTime('today'))->format('Y-m-d'); // Gives 2024-08-15
echo (new DateTime('2012-02-18'))->format('Y-m-d'); // Gives 2012-02-18
echo (new DateTime('2012-02'))->format('Y-m-d'); // Gives 2012-02-01
echo (new DateTime('5 may'))->format('Y-m-d'); // Gives 2024-05-05
echo (new DateTime('6 days ago'))->format('Y-m-d'); // Gives 2024-08-09
Однако, когда прошел всего год, почему-то отображается сегодняшняя дата:
echo (new DateTime('2012'))->format('Y-m-d'); // Gives 2024-08-15
Сначала я подумал, что, возможно, по умолчанию используется значение «сейчас», когда передается неверная дата или дата в неожиданном формате, но, похоже, это не так. Все следующие ошибки выдачи:
echo (new DateTime('fart'))->format('Y-m-d');
echo (new DateTime('1'))->format('Y-m-d');
echo (new DateTime('last may'))->format('Y-m-d');
echo (new DateTime('2012-02-48'))->format('Y-m-d');
Итак, почему прожитый год дает сегодняшнюю дату? Основываясь на поведении PHP в других случаях, я ожидаю, что он либо вернет 1 января рассматриваемого года, либо выдаст ошибку. Но возврат сегодняшней даты кажется очень странным выбором.
(Примечание: я не ищу способ получить 1 января для произвольного года; мне просто интересно, почему PHP ведет себя именно так.)
Согласно примечаниям в документации по формату даты и времени обозначение только года работает только в том случае, если присутствует строка времени, в противном случае строка из 4 цифр обрабатывается как HH MM
. Соответствующее примечание находится примерно на середине страницы.
Ах, ладно, теперь это имеет смысл. Также проверил это экспериментально; на самом деле он рассматривает его как час и минуту.
Совет: при устранении проблем с DateTime вы можете просто распечатать объект: 3v4l.org/LP5EX . Если вы отформатируете его как
Y-m-d
, вы потеряете много информации, например время и часовой пояс.