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

问题描述 投票:0回答:3

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

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

输出为:0(预期:1)

$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。

php laravel php-carbon
3个回答
2
投票

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

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

1
投票

你应该在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));

1
投票

我认为将时区设置为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
© www.soinside.com 2019 - 2024. All rights reserved.