Отметка времени PHP в DateTime

94

Вы знаете, как я могу преобразовать это в 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');

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

JREAM
источник

Ответы:

163

Вам не нужно превращать строку в метку времени, чтобы создать 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);
FtDRbwLXw6
источник
Это прекрасно работает. Я пробовал это раньше, но, должно быть, не дал достаточно шанса !!! спасибо :))
JREAM
18
Обратите внимание на это new DateTime('@' . $timestamp) и $dt = new DateTime(); $dt->setTimestamp($timestamp)не относитесь к часовым поясам таким же образом. См. Мой ответ @ stackoverflow.com/questions/12038558/… для получения более подробной информации.
Джон Слегерс
42

Хотя @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
Джон Слегерс
источник
27

Наверное, самое простое решение:

DateTime::createFromFormat('U', $timeStamp);

Где «U» означает эпоху Unix. См. Документы: http://php.net/manual/en/datetime.createfromformat.php

Forsberg
источник
2
Этот метод также игнорирует часовой пояс
Bouke Versteegh
2
@BoukeVersteegh, а какой нет?
forsberg
2
@BoukeVersteegh Это временная метка Unix !, она избавляет вас от проблем с часовыми поясами при создании объекта . просто используйте, ->setTimezoneчтобы установить предпочтительный часовой пояс перед ->format()
Бухгалтер م
1
@BoukeVersteegh Проверьте это большое примечание из руководства по PHP: «Параметр $ timezone и текущий часовой пояс игнорируются, если параметр $ time либо является меткой времени UNIX (например, @ 946684800), либо указывает часовой пояс (например, 2010-01-28T15: 00: 00 + 02: 00). »
Бухгалтер
1
Временные метки Unix не имеют часовых
поясов
0

это мое решение:

    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);
    }
гениальный
источник