Вы знаете, как я могу преобразовать это в 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');
Сказанное выше неверно. Если я прокручиваю много разных дат, это одна и та же дата.
new DateTime('@' . $timestamp)
и$dt = new DateTime(); $dt->setTimestamp($timestamp)
не относитесь к часовым поясам таким же образом. См. Мой ответ @ stackoverflow.com/questions/12038558/… для получения более подробной информации.Хотя @drrcknlsn правильно утверждать, что существует несколько способов преобразовать временную строку в datatime, важно понимать, что эти разные способы не работают с часовыми поясами одинаково.
Опция 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
источник
Наверное, самое простое решение:
DateTime::createFromFormat('U', $timeStamp);
Где «U» означает эпоху Unix. См. Документы: http://php.net/manual/en/datetime.createfromformat.php
источник
->setTimezone
чтобы установить предпочтительный часовой пояс перед->format()
это мое решение:
function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") { $date = new DateTime($date, new DateTimeZone($from)); $date->setTimeZone(new DateTimeZone($to)); return $date->format($targetFormat); }
источник