Intereting Posts
Предупреждение: Неизвестно: не удалось открыть поток: нет такого файла или каталога в Unknown в строке 0 Laravel 5.1 – Данные формы хранения ошибок, Как я могу пометить шаблон для редактирования или добавить узел для определенного типа контента? Как получить IP-адрес клиента в Laravel 5.1? Как написать функцию wordpress «is_front_page ()» в ветке кода дерева? $ _SERVER безопасен? Подтверждение электронной почты не отправлено PHP: Как получить URL-адрес реферера? Как использовать php restful api-centric design internal вместо HTTP-запроса Как получить доступ к «ключу» и «значению» из массива, переданного в цикл for? Pluck id (целое число), переданное в строку Laravel Библиотека CodeIgniter и Javascript / JQuery Laravel Многие для многих ссылок на справочные таблицы работают только в одном направлении Тестирование, если сеть в записи cidr перекрывает другую сеть Форма электронной почты более 20 значений

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

Вышеуказанное неверно. Если я прохожу через множество разных дат, то все это время.

Вам не нужно превращать строку в метку времени, чтобы создать объект 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 правильно утверждать, существует несколько способов преобразования временной строки в период времени, важно понять, что эти разные способы не имеют дело с часовыми поясами таким же образом.


Вариант 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 

В отличие от функции 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