如何将Carbon时间值与其他时间字段相加?
如何将Carbon时间值与其他时间字段相加?
嘿,我来帮你搞定这个问题!首先我注意到你的TimeCast里get方法返回的是格式化后的字符串(比如14:25),而不是Carbon实例——这就是没法直接做时间相加的核心问题,毕竟字符串可没法调用Carbon的时间操作方法。下面给你两个实用的解决思路:
方案一:修改TimeCast,让它返回Carbon实例
如果你的大部分场景都需要对这个时间字段做计算,那直接调整Cast的get方法最省心:
<?php namespace App\Casts; use Carbon\Carbon; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; use Illuminate\Database\Eloquent\Model; class TimeCast implements CastsAttributes { public function get(Model $model, string $key, mixed $value, array $attributes): mixed { // 不再直接返回格式化字符串,改成返回Carbon实例 return Carbon::parse($value); } public function set(Model $model, string $key, mixed $value, array $attributes): mixed { // set方法保持原有逻辑,把输入转成数据库需要的时间格式即可 return Carbon::parse($value)->format('H:i:s'); } }
调整后,当你从模型获取这个时间属性时,拿到的就是完整的Carbon对象了,接下来和其他时间字段相加就超简单。比如你的模型还有个duration字段(存储类似02:15这样的时长),可以这么计算:
use Carbon\CarbonInterval; // 假设$model是你的模型实例 $totalTime = $model->time->add(CarbonInterval::fromString($model->duration)); // 如果需要输出格式化后的时间字符串 echo $totalTime->format('H:i');
Carbon会自动处理跨天的情况,比如23:00加2小时会自动变成01:00,完全不用你手动处理日期进位的问题。
方案二:不修改Cast,在需要计算时手动转换
如果其他业务场景还需要用格式化后的H:i字符串,不想改动现有Cast的话,就在需要做相加操作的地方,把字符串再转回Carbon实例就行:
use Carbon\Carbon; use Carbon\CarbonInterval; // 先把模型返回的时间字符串转成Carbon实例 $baseTime = Carbon::parse($model->time); // 把另一个时间字段的字符串转成可计算的CarbonInterval $duration = CarbonInterval::fromString($model->duration); // 执行时间相加 $totalTime = $baseTime->add($duration); // 输出最终格式化后的结果 echo $totalTime->format('H:i');
这种方式更灵活,只在需要计算的局部场景做转换,不会影响其他地方的使用逻辑。
另外补充个小提示:如果你的时长字段存储的是纯数字(比如分钟数),那更省事,直接用$baseTime->addMinutes($model->duration)就行,不用转CarbonInterval~
备注:内容来源于stack exchange,提问作者mstdmstd
相关产品推荐
相关产品推荐

