Почему в PHP `new DateTime('2012')` дает мне сегодняшнюю дату?

Я столкнулся с несколько необычным поведением 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 ведет себя именно так.)

Совет: при устранении проблем с DateTime вы можете просто распечатать объект: 3v4l.org/LP5EX . Если вы отформатируете его как Y-m-d, вы потеряете много информации, например время и часовой пояс.

Álvaro González 16.08.2024 14:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно примечаниям в документации по формату даты и времени обозначение только года работает только в том случае, если присутствует строка времени, в противном случае строка из 4 цифр обрабатывается как HH MM. Соответствующее примечание находится примерно на середине страницы.

Ах, ладно, теперь это имеет смысл. Также проверил это экспериментально; на самом деле он рассматривает его как час и минуту.

DMJ 15.08.2024 21:28

Другие вопросы по теме