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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:19:51