Разница PHP DateTime возвращает неправильное количество дней - PullRequest
0 голосов
/ 07 ноября 2018

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

print_r((new DateTime('2018-01-01'))->diff(new DateTime('2018-11-01')));

print_r((new DateTime('2018-10-01'))->diff(new DateTime('2018-11-01')));

Выход:

DateInterval Object
(
    [y] => 0
    [m] => 10
    [d] => 0
    [h] => 0
    [i] => 0
    [s] => 0
    [f] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 304
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)
DateInterval Object
(
    [y] => 0
    [m] => 1
    [d] => 1
    [h] => 0
    [i] => 0
    [s] => 0
    [f] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 31
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)

Как видите, первая разница в датах корректно возвращается через 10 месяцев и 0 дней. Второй, однако, вместо того, чтобы возвращать 1 месяц и 0 дней, некорректно возвращает 1 месяц и 1 день.

Что вызывает это?

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

Мой собственный сервер и https://wtools.io/php-sandbox возвращает неправильное количество дней для второй даты. Но, например, http://sandbox.onlinephpfunctions.com/ возвращает 0 дней с разницей во второй дате.

1 Ответ

0 голосов
/ 07 ноября 2018

Это из-за часовых поясов сервера. Просто установите все как UTC, и все будет в порядке.

print_r((new DateTime('2018-10-01', new DateTimeZone('UTC')))->diff(new DateTime('2018-11-01', new DateTimeZone('UTC'))));

https://3v4l.org/PWKiD

Без часового пояса это действительно неожиданное значение. https://3v4l.org/6v0XI

...