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

Laravel Carbon:将秒数转换为XXh XXm格式的实现疑问

问题解答

一、格式化逻辑应该放在Model还是Blade?

应该放在Model中,原因如下:

  • 遵循MVC职责分离原则:视图(Blade)仅负责数据展示,数据格式化属于业务逻辑范畴,放在Model更合理
  • 代码复用:多个视图或业务场景需要该格式时,无需重复编写格式化代码,直接调用Model方法即可
  • 便于维护:后续需要修改格式规则时,仅需修改Model中的对应方法,无需改动所有使用该格式的视图

二、如何搜索相关Model格式化函数示例?

可以使用以下关键词搜索:

  • 中文关键词:Laravel 模型 访问器 时间格式化、Laravel 模型 属性格式化方法
  • 英文关键词:Laravel model accessor time format、Laravel model format attribute example

重点关注**Laravel访问器(Accessor)**的示例,这是Laravel官方推荐的模型属性格式化方案。

三、具体实现方案

方案1:手动计算小时和分钟(简单直接)

在你的Task模型中添加方法:

// 方式A:使用访问器(推荐,可直接作为属性调用)
public function getTimeTrackedForHumansAttribute()
{
    $seconds = $this->time_tracked;
    // 计算总小时数(包含天数转换的小时)
    $hours = floor($seconds / 3600);
    // 计算剩余分钟数
    $minutes = floor(($seconds % 3600) / 60);
    
    return "{$hours}h {$minutes}m";
}

// 方式B:普通方法(需通过方法调用)
public function timeTrackedForHumans()
{
    $seconds = $this->time_tracked;
    $hours = floor($seconds / 3600);
    $minutes = floor(($seconds % 3600) / 60);
    
    return "{$hours}h {$minutes}m";
}

在Blade视图中的调用方式:

  • 访问器方式:{{ $task->time_tracked_for_humans }}
  • 普通方法方式:{{ $task->timeTrackedForHumans() }}

方案2:使用CarbonInterval处理(更优雅)

借助CarbonInterval自动处理时间单位转换,避免手动计算:

use Carbon\CarbonInterval;

public function getTimeTrackedForHumansAttribute()
{
    $interval = CarbonInterval::seconds($this->time_tracked)->cascade();
    // 将天数转换为小时,加上原有小时数得到总小时
    $totalHours = $interval->days * 24 + $interval->hours;
    $minutes = $interval->minutes;
    
    return "{$totalHours}h {$minutes}m";
}

四、你之前尝试方案的问题说明

  • forHumans():该方法默认会输出完整的时间单位(天、小时、分钟、秒),无法直接得到仅小时+分钟的精简格式
  • gmdate("H:i:s", $seconds):H格式仅表示0-23小时,超过24小时会重置,无法累计总小时数
  • ->format('H:i:s'):CarbonInterval的format方法不支持H格式(该格式属于Carbon实例,而非CarbonInterval),因此会报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:35:15