Разница PHP DateTime возвращает неправильное количество дней

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

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 дней при второй разнице дат.

Ислам нет, здесь не работает 3v4l.org/6v0XI, а здесь работает sandbox.onlinephpfunctions.com/code/…

delboy1978uk 07.11.2018 14:00

@ delboy1978uk Я удалил свой комментарий, потому что заметил проблему, да :)

Alexandre Elshobokshy 07.11.2018 14:01

Одна вещь, которая может постоянно отличаться на разных серверах, - это их часовой пояс, который может повлиять на такие функции, как DateTime('now'), что может повлиять на общее измерение.

DeDee 07.11.2018 14:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
3
767
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это из-за часовых поясов сервера. Просто установите все как 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

Я считать это из-за перехода на летнее время ... часы возвращаются к октябрю, что означает, что полночь 1 октября на час раньше, чем полночь первого ноября, и поскольку время не был указан в этих объектах DateTime .. .. вот почему исправление UTC работает. Установка времени на полдень (2018-11-01 12:00:00) также решает проблему.

CD001 07.11.2018 14:11

Другие вопросы по теме