diff — интервал php и часовой пояс

Я хотел бы получить интервал дат между двумя датами в часовом поясе, который использует летнее время.

Следующий фрагмент показывает проблему.

$timezone = new DateTimeZone('UTC');
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone);
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone);
$interval = $from_date_obj->diff($to_date_obj, TRUE);
print_r($interval);

Для часового пояса UTC это показывает:

DateInterval Object
(
[y] => 0
[m] => 0
[d] => 19
[h] => 23
[i] => 47
[s] => 3
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 19
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

Теперь этот:

$timezone = new DateTimeZone('America/Los_Angeles');
$from_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-10-31 23:59:59',$timezone);
$to_date_obj = DateTime::createFromFormat('Y-m-d H:i:s', '2014-11-20 23:47:02',$timezone);
$interval = $from_date_obj->diff($to_date_obj, TRUE);
print_r($interval);

показывает:

DateInterval Object
(
[y] => 0
[m] => 0
[d] => 20
[h] => -1
[i] => 47
[s] => 3
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 19
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

один в UTC показывает 19 дней / 23 часа / 47 минут и 3 секунды. Один для PT показывает 20 дней / -1 часов / 47 минут и 3 секунды. Я думаю, что правильный ответ для PT должен быть 20 дней / 0 часов / 47 минут и 3 секунды.

Есть ли способ провести различие в тихом часовом поясе и не закончить отрицательным часом? Является ли -1 час индикацией желаемого результата и что он означает точно?


Обновление: я обнаружил, что на самом деле PHP, похоже, не обрабатывает различия в отношении DST, которые обсуждаются здесь:

PHP DateTime :: Diff ошибается?

Что касается результатов, которые я получаю, то это ошибка PHP, как указано в приведенной выше ссылке.

1

Решение

Какую версию php вы используете? Я получаю этот результат для 2-го блока кода —

DateInterval Object (
[y] => 0
[m] => 0
[d] => 19
[h] => 23
[i] => 47
[s] => 3
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 0
[days] => 19
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)

оба кода должны отображать один и тот же результат, как если бы вы сравнивали одну и ту же дату с разным часовым поясом каждый раз

0

Другие решения

Здесь есть две проблемы:
Одна из них связана с разницей между двумя датами и временем, когда происходит смена часов из-за перехода на летнее время (DST). В действительности разница между двумя датами и временем должна учитывать смену часов, но, видимо, это не так.

Это хорошо описано в следующей ссылке:

PHP DateTime :: Diff ошибается?

Далее я выявляю проблему -1 как ошибку php. Так как PHP все равно не обрабатывает изменения DST между двумя датами, и в моем случае разница без применения DST в любом случае достаточно близка, я просто сделаю вычисление различий в UTC.

0

По вопросам рекламы [email protected]