Как правильно использовать DateTime и DateTimeZone? - PullRequest
0 голосов
/ 18 марта 2011

Любая идея, почему следующее:

$objTimeZone = new DateTimezone("Europe/London");

$objDateFrom = new DateTime(null);
$objDateFrom->setTimezone($objTimeZone); 
$date_from = $objDateFrom->format('c');

$objDateTo = new DateTime(strtotime("2011-05-04 19:30:00 - 24 hour"));
$objDateTo->setTimezone($objTimeZone); 
$date_to = $objDateTo->format('c');

даст мне следующее для $ date_from:

2011-03-18T14: 34: 19 + 00: 00

, что выглядит нормально, и следующее для $ date_to - что явно неправильно:

1000-03-18T13: 04: 45 + 00: 00

1 Ответ

3 голосов
/ 18 марта 2011

DateTime не принимает метку времени UNIX в качестве первого аргумента конструктора.Вместо этого он ожидает строку, подобную той, которая вставлена ​​в strtotime().Таким образом, ваш код должен выглядеть следующим образом:

$objTimeZone = new DateTimezone("Europe/London");

// ...

$objDateTo = new DateTime("2011-05-04 19:30:00 - 24 hour");
$objDateTo->setTimezone($objTimeZone); 
$date_to = $objDateTo->format('c');

Чтобы использовать DateTime с отметкой времени, вы должны предшествовать отметке времени с @:

$ts = time();
$dt = new DateTime('@'.$ts);

Кстати: Вы должны быть осторожны с тем, как вы создаете объект DateTime и применяете часовой пояс.Вы создаете объект DateTime в часовом поясе по умолчанию (который устанавливается с помощью php.ini или date_default_timezone_set(). Затем вы применяете часовой пояс Europe/London к этомуDateTime объект, который на самом деле: принимает момент времени 2011-05-04 19:30:00 - 24 hour в моем сконфигурированном часовом поясе по умолчанию, и мы затем хотим узнать, во сколько этот момент времени находится в Europe/London часовом поясе. Естьнет разницы, если вы настроили часовой пояс на самом деле Europe/London, но это может быть разница, если часовые пояса отличаются.

РЕДАКТИРОВАТЬ (для примера)

Ваша системанастроен с часовым поясом по умолчанию UTC.

$date1 = new DateTime(); // the null doesn't matter
// $date1 now contains approx. 2011-03-18T15:03:58+00:00
$date1->setTimezone(new DateTimezone('Europe/London');
// $date1 doesn't change because UTC is the same as Europe/London for the given date
$date1->setTimezone(new DateTimezone('Europe/Berlin');
// in Germany the same point in time is 2011-03-18T16:03:58+01:00

Пока проблем нет. Давайте возьмем ваше второе свидание.

$date2 = new DateTime("2011-05-04 19:30:00 - 24 hour");    
// $date2 now contains 2011-05-03T19:30:00+00:00
$date2->setTimezone(new DateTimezone('Europe/London');
// $date2 now changes to 2011-05-03T20:30:00+01:00 because Europe/London moves to DST on March 27th
$date2->setTimezone(new DateTimezone('Europe/Berlin');
// that's 2011-05-03T21:30:00+02:00 in Germany

Мотыга, которая немного его очищает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...