Временная метка PHP в DateTime
Знаете ли вы, как я могу преобразовать это в strtotime или аналогичный тип значения в объект DateTime?
Дата, которую у меня есть:
Mon, 12 Dec 2011 21:17:52 +0000
Что я пробовал:
$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');
Вышеуказанное неверно. Если я прохожу через множество разных дат, все это будет на ту же дату.
Ответы
Ответ 1
Вам не нужно превращать строку в метку времени, чтобы создать объект DateTime
(на самом деле его конструктор даже не позволяет вам делать это, как вы можете сказать). Вы можете просто передать строку даты в конструктор DateTime
as-is:
// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);
Если у вас есть метка времени, которую вы хотите использовать вместо строки, вы можете сделать это, используя DateTime::setTimestamp()
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);
Изменить (2014-05-07):
В то время я не знал об этом, но конструктор DateTime
поддерживает создание экземпляров непосредственно из временных меток. Согласно этой документации, все, что вам нужно сделать, это добавить метку времени с символом @
:
$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
Ответ 2
В то время как @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
Ответ 3
Возможно, самое простое решение:
DateTime::createFromFormat('U', $timeStamp);
Где "U" означает эпоху Unix. См. Документы: http://php.net/manual/en/datetime.createfromformat.php