Сколько часов между этими датами?
Возможный дубликат:
Как вы обрабатываете разницу часовых поясов в PHP?
Во время вчерашнего перехода на летнее время в Швеции у меня возникла проблема с некоторым кодом, который я сделал. Я использую PHP DateTime, DateTimeZone, DateTimePeriod и т. Д., И не согласен с результатами.
Каково ваше мнение о количестве дней между этими датами и количестве часов?
"Sun, 28 Oct 2012 01:00:00 +0200"
"Mon, 29 Oct 2012 00:00:00 +0100"
PHP говорит мне, что это 0 дней и 23 часа. Я бы сказал, что это 0 дней, но 24 часа.
Обновление: часовой пояс "Европа / Стокгольм", поэтому он одинаков для обеих дат.
Воспроизвести:
$timezone = new DateTimeZone("Europe/Stockholm");
$date1 = new DateTime("Sun, 28 Oct 2012 01:00:00", $timezone);
$date2 = new DateTime("Mon, 29 Oct 2012 00:00:00", $timezone);
$date1->setTimezone($timezone);
$date2->setTimezone($timezone);
$diff = $date1->diff($date2);
var_dump($diff);
Обновление 2:
Используя классы Java и JodaTime, он дает мне 24 часа. Так что, по-видимому, правильный ответ не очевиден:)
2 ответа
Вы имеете дело с летним временем.
Как вы знаете, в октябре у нас на час вставляется дополнительный час на ночь. В конце летнего времени час между полуночью 1 час ночи повторяется. Это означает, что в воскресенье 28 октября время "1 час ночи" неоднозначно. Их было двое. 1 час случилось дважды.
Это означает, что там просто нет точного ответа на вопрос "сколько часов было между 1 часом ночи в воскресенье и любым другим данным временем". Есть два правильных ответа. PHP дает вам одно, а вы ожидаете другого.
Пока вы используете локальные часовые пояса для расчета времени, эта проблема не решаема. Единственное решение состоит в том, чтобы всегда использовать UCT для всех вычислений даты и хранения даты, и переключаться на местный часовой пояс только тогда, когда вы фактически отображаете время для пользователя.
$time = strtotime("Mon, 29 Oct 2012 00:00:00 +0100")-strtotime("Sun, 28 Oct 2012 01:00:00 +0200");
$days=$time/(24*60*60);
echo $days;