Преобразование даты из xml в читаемый формат

У меня есть файл xml, содержащий несколько дат, в этом format: 2016-07-23T07:00:00.000Z. Я использую функцию php, чтобы преобразовать это в формат для публикации на веб-сайте. На самом деле это должно привести к чему-то вроде Saturday, 24th of July (24-е, а не 23-е, из-за смещения времени. Моя функция каким-то образом игнорирует часть T07:00:00.000Z и, таким образом, возвращает Friday, 23rd of July. Может ли кто-нибудь помочь мне с правильным способом преобразования этой даты?

Спасибо, Питер


person user3760395    schedule 20.06.2014    source источник
comment
Какова ваша функция? PHP имеет надежную встроенную поддержку форматирования даты. us3.php.net/manual/en/book.datetime.php   -  person Michael Berkowski    schedule 20.06.2014
comment
И правильно ли вы установили часовой пояс в своем php.ini?   -  person Michael Berkowski    schedule 20.06.2014


Ответы (1)


Строка, о которой идет речь

2016-07-23T07:00:00.000Z

формат даты и времени W3C (W3C DTF) (Полная дата плюс часы, минуты, секунды и десятичные доли секунды), которые могут быть правильно проанализированы, в т.ч. доли секунды с помощью функции date_create_from_format](http://php.net/date_create_from_format):

$originalDate = "2016-07-23T07:00:00.000Z";
date_create_from_format('Y-m-d\TH:i:s.uO', $originalDate);

Он создает новый DateTime, который затем можно отформатировать с помощью PHP стандартные коды, напр.

date_create_from_format('Y-m-d\TH:i:s.uO', $originalDate)
    ->format('Y-m-d H:i:s'); # 2016-07-23 07:00:00

Поскольку этот формат W3C уже содержит часовой пояс, и это UTC, и вы написали, что хотите другой, вам нужно указать его:

date_create_from_format('Y-m-d\TH:i:s.uO', $originalDate)
    ->setTimezone(new DateTimeZone('Asia/Tokyo'))
    ->format('Y-m-d H:i:s');

Причина, по которой это не видно (и не контролируется с помощью данного кода) в предыдущем ответе, заключается в том, что date в соответствии с набором по умолчанию часовой пояс в PHP, где каждый DateTime имеет свой часовой пояс.

Тогда эквивалент с правильным разбором (включая десятичную долю секунды) с другими ответами:

$dateTime = date_create_from_format('Y-m-d\TH:i:s.uO', $originalDate);
date('Y-m-d H:i:s', $dateTime->getTimestamp());

Надеюсь, это объясняет это немного лучше, если вам нужно полное значение даты и/или больше контроля над часовым поясом.

См. также формат: В каком формате находится эта строка даты?

person hakre    schedule 21.06.2014