PHP Carbon DateTime 增加了两个月并完全跳过了 11 月

Jet*_*rst 2 php time datetime php-carbon

我需要显示三个日历,一个用于当前月份,另外两个用于接下来的两个月。

我正在使用 Carbon 进行这些计算。

今天是10月31日。

如果我写以下

$carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016
echo $carbon->format('F') . '<br>';
echo $carbon->addMonths(1)->format('F');
Run Code Online (Sandbox Code Playgroud)

我得到这个输出

十月

十二月

我完全错过了 11 月……所以我如何在 10 月加上一个月才能得到 11 月。

Jet*_*rst 6

默认情况下addMonths(1),一个月正好增加 30 天。

要精确添加一个月(例如,从 10 月到 11 月,无论是否为 29/30/31 天),您需要取消addMonth()并使用addMonthsNoOverflow(n).

例如:

$carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016
echo $carbon->format('F') . '<br>';
echo $carbon->addMonths(1)->format('F');
Run Code Online (Sandbox Code Playgroud)

意外输出:

十月 十二月

然而

$carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016
echo $carbon->format('F') . '<br>';
echo $carbon->addMonthsNoOverflow(1)->format('F');
Run Code Online (Sandbox Code Playgroud)

正确输出:

十月 十一月

这种行为不是由于 Carbon 而是由于它所基于的 PHP datetime 类。

原因addMonthsNoOverflow()不是默认行为,因为这将是一个“破坏性更改”。

你可以在这个 Github 对话中阅读更多关于它的信息:https : //github.com/briannesbitt/Carbon/issues/627