Хотя @drrcknlsn правильно утверждать, что существует несколько способов преобразовать временную строку в datatime, важно понимать, что эти разные способы не работают с часовыми поясами одинаково.
Опция 1 : DateTime('@' . $timestamp)
Рассмотрим следующий код:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
strtotime
Бит исключает информацию часового пояса, а date_create
функция принимает GMT ( Europe/Brussels
).
Таким образом, независимо от того, на каком сервере я его запускаю, вывод будет следующим:
2011-12-12T13:17:52+00:00
Вариант 2: date_create()->setTimestamp($timestamp)
Рассмотрим следующий код:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Вы можете ожидать, что это даст тот же результат. Однако, если я выполню этот код с бельгийского сервера, я получу следующий результат:
2011-12-12T14:17:52+01:00
В отличие от date_create
функции, setTimestamp
метод предполагает часовой пояс сервера ( 'Europe/Brussels'
в моем случае), а не GMT.
Явная установка вашего часового пояса
Если вы хотите убедиться, что ваш вывод соответствует часовому поясу вашего ввода, лучше установить его явно.
Рассмотрим следующий код:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Теперь также рассмотрим следующий код:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Поскольку мы явно устанавливаем часовой пояс вывода, совпадающий с часовым поясом ввода, оба будут создавать одинаковый (правильный) вывод:
2011-12-12T21:17:52+08:00