Проблема с датой PHP - PullRequest
       27

Проблема с датой PHP

4 голосов
/ 06 июля 2010

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

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

Я получаю дату "07.04.2010", которая на день раньше. Почему?

Спасибо

Ответы [ 3 ]

8 голосов
/ 06 июля 2010

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

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

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

  1. Попросите / скажите исходному серверу вернуть дату и время в формате 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 предполагает, что формат даты и времени никогда не изменится.

3 голосов
/ 06 июля 2010

Поскольку смещение вашего часового пояса составляет менее +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
1 голос
/ 06 июля 2010

PHP использует (злой) глобальный часовой пояс при форматировании строк date. Вы можете использовать часовой пояс $oDate, позвонив 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;
...