У меня есть следующий код, который распечатывает различия между двумя датами:
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 дней при второй разнице дат.
@ delboy1978uk Я удалил свой комментарий, потому что заметил проблему, да :)
Одна вещь, которая может постоянно отличаться на разных серверах, - это их часовой пояс, который может повлиять на такие функции, как DateTime('now'), что может повлиять на общее измерение.






Это из-за часовых поясов сервера. Просто установите все как UTC, и все будет в порядке.
print_r((new DateTime('2018-10-01', new DateTimeZone('UTC')))->diff(new DateTime('2018-11-01', new DateTimeZone('UTC'))));
Без часового пояса это действительно неожиданное значение. https://3v4l.org/6v0XI
Я считать это из-за перехода на летнее время ... часы возвращаются к октябрю, что означает, что полночь 1 октября на час раньше, чем полночь первого ноября, и поскольку время не был указан в этих объектах DateTime .. .. вот почему исправление UTC работает. Установка времени на полдень (2018-11-01 12:00:00) также решает проблему.
Ислам нет, здесь не работает 3v4l.org/6v0XI, а здесь работает sandbox.onlinephpfunctions.com/code/…