当我使用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。
您提供的代码应该有效。虽然你可以尝试替代碳。试试DateTime
$d1 = new DateTime('2018-02-01');
$d2 = new DateTime('2018-03-01');
$diff = date_diff($d1,$d2);
dd($diff->m);
你应该在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));
我认为将时区设置为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