Я разрабатываю приложение 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.
Кстати, мой вывод взят из laravel 8, просто чтобы подтвердить, что это может быть ошибка, связанная с версией, или ваш пример написан неправильно.
Если вы попробуете это, вы можете найти аналогичную проблему:
$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
]);
Если я запущу этот пример таким образом, мой вывод будет правильным:
Carbon\Carbon::create('2022-11-01')->diffInMonths(Carbon\Carbon::create('2023-04-01'))
вывод: 5Carbon\Carbon::create('2022-11-01')->diffInMonths(Carbon\Carbon::create('2023-03-01'))
вывод: 4