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
相关产品推荐
相关产品推荐

