Laravel使用Carbon调用addYears时起止日期相同异常问题
问题原因
Carbon 实例默认是可变对象,调用addYears()这类时间修改方法时,会直接修改当前实例本身的时间值,而非返回新的独立实例。
代码执行$start->addYears($request->planDetails['duration'])时,首先会把$start本身的时间修改为加完指定年数后的结果,再把修改后的$start引用赋值给$end,最终$start和$end指向同一个Carbon实例,因此接口返回的两个时间完全一致。结合给出的测试数据也能验证:原plan_end是2022-05-09,加2年正好得到返回结果里的2024-05-09。
解决方法
只需在调用修改时间的方法前,复制一份原始的$start实例即可,推荐两种写法:
- 用Carbon自带的
copy()方法(可读性更高,官方推荐)
$start = Carbon::parse($client->plan_end) ?: Carbon::now(); // 先复制实例再修改,不会影响原$start的值 $end = $start->copy()->addYears($request->planDetails['duration']); return response([ 'start' => $start, 'end' => $end, ]);
- 用PHP原生
clone关键字复制对象
$end = (clone $start)->addYears($request->planDetails['duration']);
如果项目整体需要避免修改原时间实例的问题,可以直接改用CarbonImmutable类,该类的所有时间修改方法默认返回新实例,无需手动复制。
内容的提问来源于stack exchange,提问作者Jakyy B
相关产品推荐
相关产品推荐

