Временная метка 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