2010-07-05 4 views
4

У меня есть веб-сервис на PHP, который получает объект DateTime (от asp). Я хочу проанализировать эту дату в моем пользовательском формате. Дата первоначально находится в формате «2010-07-05T00: 00: 00 + 02: 00». Когда я пытаюсь это сделать:Проблема с датой PHP

$oDate = strtotime($date_from_webservice); 
$sDate = date("d.m.Y",$oDate); 
echo $sDate; 

Я получаю дату «07.04.2010», которая была на день раньше. Зачем?

Благодаря

ответ

8

Глядя на него, первоначальная дата ($ date_from_webservice) находится в часовом поясе GMT ​​+ 2, а время в полночь.

Я предполагаю, что временная зона, на которой настроен PHP, отличается (UTC), поэтому дата «появляется» на день раньше. Однако преобразование совершенно корректно.

Чтобы решить эту проблему у вас есть несколько вариантов:

  1. Ask/сообщить серверу происхождения вернуть DateTime в формате UTC (который является то, что он должен делать на самом деле), убедитесь, что PHP использует UTC также.

  2. Настройка PHP на тот же часовой пояс исходного сервер, используя date_default_timezone_set или в php.ini. Обратите внимание, что вы не можете просто добавлять/вычитать часы из-за летнего времени.

  3. Если вы уверены, что формат даты и времени согласован, используйте substr. Например:

    $ sDate = substr ($ oDate, 8, 2). '.'. Substr ($ oDate, 5, 2). '.'. Substr ($ oDate, 0, 4);

Вариант 1 является лучшим. Вариант 2 является рискованным, если исходный сервер изменил часовой пояс. Вариант 3 предполагает, что формат datetime никогда не изменится.

+0

Зачем серверу происхождения возвращать datetime как UTC? Вы считаете, что часовой пояс вообще не имеет значения? – Artefacto

+0

Если вы используете datetime как веб-сервис, лучше всего использовать UTC по вполне очевидным причинам, в примере исходный сервер должен выводить '2010-07-04T22: 00: 00 + 00: 00'. Я никогда не говорил, что часовой пояс не имеет значения ... – Pete

3

Поскольку смещение вашего часового пояса меньше +2 часов. Предположим, вы находитесь в Лиссабоне, где текущее смещение часового пояса - UTC + 1 час. Тогда это время будет «2010-07-04T23: 00: 00 + 01: 00», что было за день до этого.

Вы можете использовать DateTime вместо:

$date = new DateTime("2010-07-05T00:00:00+02:00"); 
echo $date->format("d.m.Y"); //echoes 05.07.2010 

Это автоматически связывает часовой пояс «+02: 00» до даты, гарантируя, что форматирование правильно.

С другой стороны:

$date = new DateTime("2010-07-05T00:00:00+02:00"); 
$date->setTimeZone(new DateTimezone("Europe/Lisbon")); 
echo $date->format("d.m.Y"); //echoes 04.07.2010 
+0

Любая идея, как решить эту проблему? – user345602

1

PHP использует (злой) глобальный часовой пояс при форматировании строк date. Вы можете использовать $oDate «s часовой пояс по телефону date_default_timezone_set:

$oDate = strtotime($date_from_webservice); 

$oldTimezone = date_default_timezone_get(); 
date_default_timezone_set(date('e', $oDate)); 

$sDate = date('d.m.Y', $oDate); 

date_default_timezone_set($oldTimezone); 

echo $sDate; 
Смежные вопросы