Carbon diffInMonth() возвращает неверные значения

Я разрабатываю приложение Laravel и наткнулся на проблему с библиотекой Carbon, поэтому я проверил некоторые вещи и обнаружил, что этот код:

// Date Diff 1
$st1 = Carbon::parse("2022-11-01");
$fi1 = Carbon::parse("2023-04-01");
$diff1 = $st1->diffInMonths($fi1);

// Date Diff 2
$st2 = Carbon::parse("2022-11-01");
$fi2 = Carbon::parse("2023-03-01");
$diff2 = $st2->diffInMonths($fi2);

dd([
    'Diff 1' => "2022-11-01  ->  2023-04-01  =  $diff1",
    'Diff 2' => "2022-11-01  ->  2023-03-01  =  $diff2",
]);

возвращает это:

"Diff 1" => "2022-11-01  ->  2023-04-01  =  5"
"Diff 2" => "2022-11-01  ->  2023-03-01  =  3"

Может ли кто-нибудь объяснить мне, почему это работает таким образом, или даже предложение о том, как я могу это исправить.

Что касается версий, я использую Laravel 5.7 и PHP 7.2.5.

Если я запущу этот пример таким образом, мой вывод будет правильным: Carbon\Carbon::create('2022-11-01')->diffInMonths(Carbon\Car‌​bon::create('2023-04‌​-01')) вывод: 5 Carbon\Carbon::create('2022-11-01')->diffInMonths(Carbon\Car‌​bon::create('2023-03‌​-01')) вывод: 4

Techno 09.01.2023 13:54

Кстати, мой вывод взят из laravel 8, просто чтобы подтвердить, что это может быть ошибка, связанная с версией, или ваш пример написан неправильно.

Techno 09.01.2023 13:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы попробуете это, вы можете найти аналогичную проблему:

$d1 = new \DateTime('2023-02-01');
$d2 = new \DateTime('2023-03-01');
$diff = date_diff($d1,$d2);
dump($diff->m); // months: 0
dump($diff->d); // days: 28
die;

Проблема связана с PHP, а не с Laravel, и связана с месяцем «февраль» (потому что в феврале всего 28 дней).

Решением может быть использование этого:

// Date Diff 1
$st1 = Carbon::parse("2022-11-01"); 
$fi1 = Carbon::parse("2023-04-01");
$diff1 = (int)$st1->floatDiffInMonths($fi1);

// Date Diff 2
$st2 = Carbon::parse("2022-11-01");
$fi2 = Carbon::parse("2023-03-03");
$diff2 = (int)$st2->floatDiffInMonths($fi2);

dd([
    'Diff 1' => "2022-11-01  ->  2023-04-01  =  $diff1", // 5
    'Diff 2' => "2022-11-01  ->  2023-03-01  =  $diff2", // 4
]);

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