Carbon 按数字逐月返回 3 月排名第二

S_R*_*S_R 1 php php-carbon

有没有人以前遇到过这个错误,或者知道解决方法?

我想在数组中获取今年所有月份的列表(开始日期和结束日期),所以我这样做(接受更清晰更简单的方法的建议)

//Create a months array
$months = [];
//Get start and end of all months
for($i = 1; $i <= 12; $i++){
   $array = [];
   $array['start'] = Carbon::create()->month($i)->startOfMonth()->format('d/m/y');
   $array['end'] = Carbon::create()->month($i)->endOfMonth()->format('d/m/y');
   array_push($months, $array);
}
Run Code Online (Sandbox Code Playgroud)

哪个产生这个结果

在此输入图像描述

正如您所看到的,它循环并检索了月份,但请注意,它完全跳过了二月并添加了三月两次。

如果我手动运行并返回此代码

return Carbon::create()->month(2)->startOfMonth()->format('d/m/y');
Run Code Online (Sandbox Code Playgroud)

它返回01/03/2018

为什么 Carbon 会打印出 March 2 月份?有没有人以前遇到过这个问题或知道解决方法?

iai*_*inn 6

Carbon::create()->month(2)将首先创建今天的日期,然后将月份设置为2,但保留其他值。因为今天的日期是 8 月 29 日,所以该日期最终指的是 2 月 29 日,而这个日期(至少今年)不存在。PHP 将这些“假”日期滚动到下个月,因此2 月 29 日变成3 月 1 日

如果您首先明确设置月份中的某一天,则应按预期工作:

Carbon::create()->day(1)->month($i);
Run Code Online (Sandbox Code Playgroud)

(另外,如果你昨天尝试过,它会工作得很好,你可能永远不会注意到这个错误。如果你明天尝试过,你会在 3 月 2 日结束,并且可能会更快地注意到它。日期很棒乐趣。)