Вы знаете, как я могу преобразовать это в 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');
Вышеуказанное неверно. Если я прохожу через множество разных дат, то все это время.
Вам не нужно превращать строку в метку времени, чтобы создать объект DateTime
(на самом деле его конструктор даже не позволяет вам это делать, как вы можете сказать). Вы можете просто передать строку даты в конструктор DateTime
как есть:
// 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);
В то время как @drrcknlsn правильно утверждать, существует несколько способов преобразования временной строки в период времени, важно понять, что эти разные способы не имеют дело с часовыми поясами таким же образом.
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
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
В отличие от функции setTimestamp
метод 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
Вероятно, самое простое решение:
DateTime::createFromFormat('U', $timeStamp);
Где «U» означает эпоху Unix. См. Документы: http://php.net/manual/en/datetime.createfromformat.php