You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中使用Carbon获取去年同月、上月、上上月值错误怎么解决

解决方案

你遇到的问题根源是Carbon默认是可变对象,所有时间修改方法(subXxx/addXxx)都会直接修改原实例的时间值,不会自动生成副本。可以用以下三种方案解决:

方案1:调用copy()方法生成副本操作

每次修改时间前先调用copy()复制原对象,所有修改只会作用于副本,不会改动原始$date的值:

$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');

方案2:使用CarbonImmutable不可变类

把实例创建类替换为CarbonImmutable,该类所有时间修改操作都会返回新的实例,完全不会改动原对象,原有链式调用逻辑不用改:

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

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

方案3:直接基于原始参数创建目标时间

不需要提前创建公共$date实例,每次计算都直接传入原始年月生成对应时间,Carbon会自动处理跨年月的边界问题(比如1月减1月自动转为去年12月):

$sameMonthLastYear = Carbon::create($year - 1, $month)->format('Ym');
$lastMonthYear = Carbon::create($year, $month - 1)->format('Ym');
$lastToLastMonthYear = Carbon::create($year, $month - 2)->format('Ym');

三种方案都可以输出你预期的结果,优先推荐前两种,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者aristotle11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:54:03