Отображение фактического времени с использованием iso 8601

Я имею в виду это: Преобразование ISO 8601 в формате d M Y в PHP

Я пробовал так же, как это: echo date("d M Y H:i:s", strtotime($time));

Но время не отображается как сохраненное в базе данных. Он показывает разницу в несколько часов.

В базе есть: 2016-03-20T23:30:51+00:00

С приведенным выше эхом php я получаю: 21 марта 2016 г. 00:30:51 Где, как должно быть, 20 марта 2016 г. 23:30:51

В приведенном выше примере показан дополнительный 1 час y? Я пытался использовать этот формат для отображения часов и минут, но отображаемое время неверно. Отображение времени имеет разницу в несколько часов. Почему это так?


person Mohammed Kumel    schedule 20.03.2016    source источник
comment
Вы можете показать исходную строку из базы данных?   -  person fusion3k    schedule 21.03.2016
comment
Похоже, что strtotime и date каким-то образом используют разные часовые пояса. Можем ли мы увидеть пример содержимого переменной $time?   -  person Андрей Беньковский    schedule 21.03.2016
comment
Подробности обновлены в вопросе. да часовые пояса разные.   -  person Mohammed Kumel    schedule 21.03.2016
comment
@fusion3k База данных имеет: 2016-03-20T23:30:51+00:00 С приведенным выше эхом php я получаю: 21 марта 2016 г. 00:30:51 Где, как должно быть, 20 марта 2016 г. 23:30:51   -  person Mohammed Kumel    schedule 21.03.2016
comment
Дата указана по Гринвичу. Таким образом, если разница между GMT и вашим часовым поясом составляет 5 часов, ваш результат все же правильный.   -  person fusion3k    schedule 21.03.2016
comment
Или вы хотите получить исходную дату по Гринвичу.   -  person fusion3k    schedule 21.03.2016
comment
Это правильно? Вы имеете в виду, что он показывает меня в соответствии с моим часовым поясом? Как насчет оригинала? @fusion3k   -  person Mohammed Kumel    schedule 21.03.2016
comment
Дублин (Ирландия) Sunday, 20 March 2016, 23:30:00 Бангалор (Индия – Карнатака) Monday, 21 March 2016, 05:00:00, но отображается: 21 Mar 2016 00:30:51   -  person Mohammed Kumel    schedule 21.03.2016


Ответы (2)


Ваш формат даты 2016-03-20T23:30:51+00:00 показывает дату и время по Гринвичу (примечание: тот же часовой пояс, который используется временными метками php/unix).

Итак, когда вы пишете:

echo date( "d M Y H:i:s", strtotime( $time ) );

Вы получаете еще правильную дату, преобразованную в вашей системе TimeZone.

Вы можете использовать класс DateTime для выполнения дополнительных операций с датами:

$date = new DateTime( $time );
echo $date->format("d M Y H:i:s");

напечатает дату в исходном формате (GMT).

$date->setTimezone( new DateTimeZone('Europe/Berlin') );
echo $date->format("d M Y H:i:s");

напечатает дату в часовом поясе «Европа/Берлин».


Примечание: сохранение дат в формате ISO 8601 UTC/GMT на самом деле является лучшим выбором.


person fusion3k    schedule 21.03.2016
comment
Часовой пояс на локальном сервере: UTC+05:30 (Индия). Значение базы данных (GMT-3) (чили). Если значение чили в БД равно 2016-03-20T23:30:51+00:00, то в Индии оно будет около 2016-03-21T05:00:51, которое еще не возвращается должным образом! - person Mohammed Kumel; 21.03.2016
comment
+00:00 означает UTC/GMT. Основываясь на моем примере выше, создайте $date = new DateTime( $time );, а затем echo $date->getTimezone->getName();, чтобы увидеть его. Дата указана в формате UTC/GMT 100% См. здесь - person fusion3k; 21.03.2016
comment
Мои данные находятся на $row_MultipleLOPStatus["TimeUpdated"], можете ли вы помочь мне с полным кодом для них. @ fusion3k извините, да, время сохранено по Гринвичу. - Дублинское время - person Mohammed Kumel; 21.03.2016
comment
Если вам нужна дата в вашей локальной системе часовых поясов, она у вас уже есть, потому что функция php date печатает даты в вашем локальном default_timezone. Если вы никогда не устанавливали эту переменную, вы можете поместить вверху своего скрипта date_default_timezone_set ( string 'Ireland/Dublin' ) или изменить в файле php.ini строку с date.timezone. В противном случае используйте мой пример выше: просто замените $time строкой/переменной времени по Гринвичу. - person fusion3k; 21.03.2016
comment
Дублин (Ирландия) Sunday, 20 March 2016, 23:30:00 Бангалор (Индия – Карнатака) Monday, 21 March 2016, 05:00:00, но отображается: 21 Mar 2016 00:30:51 - person Mohammed Kumel; 21.03.2016
comment
ты читал мой ответ? без изменения часового пояса в формате ISO установите дату по Гринвичу. - person fusion3k; 21.03.2016
comment
получение ошибки как: Неустранимая ошибка Вызов функции-члена setTimezone() для не-объекта в ... Я использовал следующее: <?php $date->setTimezone( new DateTimeZone('Europe/Berlin') ); echo $date->format("d M Y H:i:s");?> @fusion3k Мне нужно значение из этого: $row_MultipleLOPStatus[TimeUpdated] - person Mohammed Kumel; 21.03.2016
comment
Мохаммед, когда вы видите такую ​​ошибку, проверьте свой код, пожалуйста. Это не служба бесплатного кода. См. эту демонстрацию: пример правильный. Сравните его со своим кодом и найдите синтаксическую ошибку. Это не имеет никакого отношения к вашему вопросу. - person fusion3k; 21.03.2016
comment
большое спасибо. это правильно. еще раз, спасибо. - person Mohammed Kumel; 21.03.2016
comment
Окончательно! Ответ, который на самом деле объясняет это правильно. Сошли с ума, как получить правильную дату/время из формата ISO. Спасибо чувак! - person adamj; 10.02.2017

Ваша система использует местный часовой пояс вместо UTC, тогда как база данных находится в формате UTC. Если вы хотите отображать в формате UTC, вы можете использовать http://php.net/manual/en/function.date-default-timezone-set.php, чтобы установить часовой пояс в UTC перед вызовом strtotime и date.

person Xaraxia    schedule 21.03.2016