2月1日到3月1日之间不正确的diffInMonths laravel Carbon

时间:2018-01-06 04:06:16

标签: php laravel php-carbon

当我使用laravel Carbon的diffInMonths时,我发现了一个奇怪的结果。任何人都可以解释为什么它这样工作。这是一个错误吗?以及如何使其正确。

$d1 = new Carbon('2018-02-01');
$d2 = new Carbon('2018-03-01');
dd($d1->diffInMonths($d2));

输出为:0(预期:1)

BUT

$d1 = new Carbon('2018-02-02');
$d2 = new Carbon('2018-03-02');
dd($d1->diffInMonths($d2));

输出为:1

My setting timezone is "Asia/Ho_Chi_Minh" (GMT +7). PHP Version 7.0.22. OS: Ubuntu Server 16.04

这个奇怪的结果只发生在2月1日到3月1日之间,其他月份的结果如预期的那样。

我也尝试date_diff而不是Carbon

$d1 = new \DateTime('2018-02-01');
$d2 = new \DateTime('2018-03-01');
$diff = date_diff($d1,$d2);
dump($diff->m);
dump($diff->d);
die;

它返回月份:0和天数:28(不是月份:1,天数:0符合预期)

所以问题可能来自PHP,而不是来自Carbon。

5 个答案:

答案 0 :(得分:2)

您提供的代码应该有效。虽然你可以尝试替代碳。试试DateTime



$d1 = new DateTime('2018-02-01');
$d2 = new DateTime('2018-03-01');
$diff = date_diff($d1,$d2);
dd($diff->m);




答案 1 :(得分:0)

你应该在Carbon中设置时区,  现在它起作用了:

   Carbon::now(new \DateTimeZone('Asia/Ho_Chi_Minh'));
    $d1 = new Carbon('2018-02-01');
    $d2 = new Carbon('2018-03-01');
    dd($d1->diffInMonths($d2));

答案 2 :(得分:0)

我认为将时区设置为UTC应该可以解决此问题。将时区设置为Europe/Zurich时,我遇到了同样的问题:

>>> $last = new \Carbon\Carbon('2019-02-01');
=> Carbon\Carbon @1548975600 {#2381
     date: 2019-02-01 00:00:00.0 Europe/Zurich (+01:00),
   }
>>> $now = (\Carbon\Carbon::now())->day(1)->setTime(0, 0, 0);
=> Carbon\Carbon @1551394800 {#2371
     date: 2019-03-01 00:00:00.0 Europe/Zurich (+01:00),
   }
>>> $now->diffInMonths($last)
=> 0

将时区更改为UTC后:

>>> $last = new \Carbon\Carbon('2019-02-01', 'UTC');
=> Carbon\Carbon @1548979200 {#2380
     date: 2019-02-01 00:00:00.0 UTC (+00:00),
   }
>>> $now = (\Carbon\Carbon::now('UTC'))->day(1)->setTime(0, 0, 0);
=> Carbon\Carbon @1551398400 {#2394
     date: 2019-03-01 00:00:00.0 UTC (+00:00),
   }
>>> $now->diffInMonths($last)
=> 1

答案 3 :(得分:0)

我遇到了同样的事情,但是上述方法对我不起作用。所以我写了这个,它工作得很好。

$prevMonth = Carbon::parse("01-02-2019");
$thisMonth = Carbon::parse("01-03-2019");
$part1 = ($prevMonth->format('Y') * 12) + $prevMonth->format('m');
$part2 = ($thisMonth->format('Y') * 12) + $thisMonth->format('m');
$diff = abs($part1 - $part2); // To make the result always positive abs()

结果:-

1 // with abs()
-1 // without abs()

答案 4 :(得分:0)

同一个故事,终于写出了自己的月差计算函数:

AllowAny

这里也要注意月份中的天数,也可以考虑时间。