Почему написано 5 и почему это технически правильно
В Сиднее переход на летнее время начинается в 02:00 06.10.2013: 00 - так что вы теряете час на свиданиях, охватывающих это.
Когда вы вызываете функцию strtime, она интерпретирует время как время в Сиднее, но возвращает временную метку Unix. Если вы преобразуете второй набор меток времени в UTC, вы получите диапазон от 2013-09-30 14:00:00 до 2013-10-06 13:00:00, что не совсем 6 дней, поэтому округлить до 5.
Как получить разницу во времени, игнорируя переходы на летнее время
Вместо этого попробуйте использовать объекты DateTime, например
$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-01', $tz);
$end=new DateTime('2013-10-07', $tz);
$diff=$end->diff($start);
//displays 6
echo "difference in days is ".$diff->d."\n";
Почему DateTime::diff работает по-другому?
Вы можете спросить: «Почему это работает?» - ведь между этими временами действительно не 6 дней, а 5 дней и 23 часа.
Причина в том, что DateTime::diff фактически корректирует переходы на летнее время. Мне пришлось прочитать исходный код, чтобы понять это - исправление происходит внутри внутреннего timelib_diff. Эта коррекция происходит, если верно все следующее
- каждый DateTime использует один и тот же часовой пояс
- часовой пояс должен быть географическим идентификатором, а не аббревиатурой, такой как GMT
- каждый DateTime должен иметь разные смещения DST (т.е. один в DST и один нет)
Чтобы проиллюстрировать этот момент, вот что произойдет, если мы используем два раза всего несколько часов по обе стороны от переключения на летнее время.
$tz=new DateTimeZone('Australia/Sydney');
$start=new DateTime('2013-10-06 00:00:00', $tz);
$end=new DateTime('2013-10-06 04:00:00', $tz);
//diff will correct for the DST transition
$diffApparent=$end->diff($start);
//but timestamps represent the reality
$diffActual=($end->getTimestamp() - $start->getTimestamp()) / 3600;
echo "Apparent difference is {$diffApparent->h} hours\n";
echo "Actual difference is {$diffActual} hours\n";
Это выводит
Apparent difference is 4 hours
Actual difference is 3 hours
person
Paul Dixon
schedule
19.06.2013