从年初获取前几个月的列表

Get list of previous months from start of the year

我正在尝试使用 Carbon.

获取前几个月的列表

预期结果:

January, February, March, April

到目前为止我做了什么:

$now = Carbon::now();
$startMonth = $now->startOfMonth()->subMonth($now->month);
$currentMonth = $now->startOfMonth();
$diff = $currentMonth->diffInMonths($startMonth);

我用 Carbon::now() 得到一年的第一个月,然后我试图计算日期之间的差异,但我得到 0

我也找不到任何方法 returns 月份列表作为预期输出。

您将原始变量设置为上一年的 12 月 1 日,因为您一直在修改原始变量而不是复制它。相反,从 now() 创建两个变量,然后您可以使用它来创建 CarbonPeriod 来迭代。

$firstOfYear = Carbon::now()->firstOfYear();
$firstOfLastMonth = Carbon::now()->firstOfMonth()->subMonth(); // If you want to include the current month, drop ->subMonth()
$period = CarbonPeriod::create($firstOfYear, '1 month', $firstOfLastMonth);
foreach($period as $p) echo $p->format('F')."\n";

为什么不是简单的 while 循环?

use Carbon\Carbon;

$previousMonths = [];

$currentDate = Carbon::now()->startOfMonth();
while ($currentDate->year == Carbon::now()->year) {
  $previousMonths[] = $currentDate->format('F');
  $currentDate->subMonth();
} 

$previousMonths 现在是:

[
  "April",
  "March",
  "February",
  "January",
]

编辑


如果您需要它们的顺序相反,则:

$previousMonths = array_reverse($previousMonths);

那么 $previousMonths 将是:

[
  "January",
  "February",
  "March",
  "April",
]

另一种使用 PHP 范围的方法:

$now = Carbon::now();
$months = collect( range(1, $now->month) )->map( function($month) use ($now) {
    return Carbon::createFromDate($now->year, $month)->format('F');
})->toArray();

这应该return从一月到当前月份的月份集合(如果使用 toArray() 则为数组)(类似于预期结果)