Если мы введем такой код
date_default_timezone_set('Europe/Moscow');
echo DateTime::createFromFormat('U', strtotime('2017-09-26 12:00:00'))->format('Y-m-d H:i:s');
echo "\n" . (new DateTime)->setTimestamp(strtotime('2017-09-26 12:00:00'))->format('Y-m-d H:i:s');
То получим такой результат
2017-09-26 09:00:00
2017-09-26 12:00:00
Кто может объяснить такое поведение? И как здесь будет правильно работать с датами?
U - означает "количество секунд с начала Эпохи Unix (January 1 1970 00:00:00 GMT)" (см. тут)
А UNIX основное время всегда считает в UTC.
Москва - это UTC+3
Поэтому первая функция выдает тебе ответ, исходя из того, что время задано в UTC, а вторая, исходя из того, что время задано местное.
Все правильно
Пока писал вопрос, разобрался с ответом.
Дело в том, что DateTime::createFromFormat('U', strtotime('2017-09-26 12:00:00')) это статичный метод, который не видит наш часовой пояс.
А когда мы пишим (new DateTime())->setTimestamp(strtotime('2017-09-26 12:00:00')) то в конструкторе объекта (new DateTime()) часовая зона проставляется.
Для себя решил использовать такой код
DateTime::createFromFormat('U', $time)
->setTimeZone(new DateTimeZone(date_default_timezone_get()))
->format("Y-m-d H:i:s");
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники