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'),
];
}
有没有人以前遇到过这个错误,或者知道修复它的方法?
我想在一个数组中获取当年所有月份的列表(开始日期和结束日期),所以我这样做(接受更简洁的方法的建议)
//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'),
];
}