Carbon get month by number returns 为 number 2 游行

Carbon get month by number returns march for number 2

有没有人以前遇到过这个错误,或者知道修复它的方法?

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

//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);
}

产生这个结果

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

如果我手动运行和return这个代码

return Carbon::create()->month(2)->startOfMonth()->format('d/m/y');

它 returns 01/03/2018.

为什么 carbon 在第 2 个月打印出 March?有没有人以前遇到过这个问题或知道解决它的方法?

从外观上看是0。所以 month(0) 将是一月,1 = 二月,等等。 将循环更改为

for($i = 0; $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);
}

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

如果您首先明确设置每月的第几天,这应该会按预期工作:

Carbon::create()->day(1)->month($i);

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

在评论建议的答案时弄清楚了这一点。

因为今天是2018年8月29日,二月份没有29天

基本上,Carbon 是用 Carbon::create() 从今天的日期创建一个实例,但是当使用 ->month(2) 时,将尝试获取 2 月 29 日和错误。它需要从本月的第一天开始工作,因此将其更改为

 Carbon::create()->startOfMonth()->month($i)->startOfMonth()->format('d/m/y');

所以它从当月 1 日开始引用,它将按预期工作。

纯PHP就够了:

$datePeriod = new \DatePeriod(
    new \DateTimeImmutable(date('01-01-Y')),
    new \DateInterval('P1M'),
    new \DateTimeImmutable(date('31-12-Y'))
);

$dates = [];
foreach ($datePeriod as $date) {
     $dates[] = [
         'start' => $date->modify('first day of this month')->format('d/m/y'),
         'end' => $date->modify('last day of this month')->format('d/m/y'),
     ];   
}