Незважаючи на те, що @drrcknlsn правильно стверджувати, що існує кілька способів перетворити рядок часу в час даних, важливо усвідомити, що ці різні способи не мають однакової роботи з часовими поясами.
Варіант 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