使用 carbon laravel 获取上月和上年

get last month and year using carbon laravel

这可能很简单,我有 $month$year,但我正在尝试获取 lastMonthYearlastToLastMonthYear

    $date = Carbon::create($year, $month)->startOfMonth();

    $sameMonthLastYear = $date->subYear()->format('Ym');
    $lastMonthYear =  $date->subMonth()->format('Ym');
    $LastToLastMonthYear = $date->subMonth()->format('Ym');

考虑到 $month=9 和 $year=2021,我想得到

sameMonthLastYear = 202009
lastMonthYear = 202108
lastToLastMonthYear = 202107

但我得到

sameMonthLastYear = 202009
lastMonthYear = 202008
lastToLastMonthYear = 202008

因为 $date 值在每一行都在不断更新。有什么办法可以得到预期的结果吗?

您可以使用copy()方法:

$date = Carbon::create($year, $month)->startOfMonth();

$sameMonthLastYear = $date->copy()->subYear()->format('Ym');
$lastMonthYear =  $date->copy()->subMonth()->format('Ym');
$LastToLastMonthYear = $date->copy()->subMonths(2)->format('Ym');

正确的方法是使用CarbonImmutable:

$date = CarbonImmutable::create($year, $month);

$sameMonthLastYear = $date->subYear()->format('Ym'); //202009
$lastMonthYear =  $date->subMonth()->format('Ym'); //202108
$LastToLastMonthYear = $date->subMonths(2)->format('Ym'); //202107

使用 CarbonImmutable,您对 $date 所做的更改不会保留。

我还删除了 startOfMonth 方法,它没有用,因为默认情况下,Carbon 实例将是:

Carbon\CarbonImmutable @1630454400 {#5430
    date: 2021-09-01 00:00:00.0 UTC (+00:00),
}