Laravel Blade中如何将整数分钟转为带小时分钟的格式化时长
Laravel Blade 分钟转「小时+分钟」格式化实现
核心逻辑非常简单:对总分钟数做除以60的整数除法得到小时值,对60取余得到剩余分钟值,按规则拼接字符串即可,无需依赖额外扩展包。
单处使用直接写计算逻辑
如果只需要在单个模板位置做格式化,直接在Blade里嵌入简单计算即可,示例:
{{-- 总分钟数存在$totalMinutes变量中 --}} @php $hours = intdiv($totalMinutes, 60); $remainingMins = $totalMinutes % 60; @endphp {{ $hours }}h{{ $remainingMins }}min
如果需要适配边界场景(不足1小时只显示分钟、整小时不显示多余的0分钟),加简单判断就行:
@php $hours = intdiv($totalMinutes, 60); $remainingMins = $totalMinutes % 60; $output = ''; if ($hours > 0) $output .= $hours . 'h'; if ($remainingMins > 0 || $hours === 0) $output .= $remainingMins . 'min'; @endphp {{ $output }}
对应输出效果:
- 传入80 →
1h20min - 传入45 →
45min - 传入120 →
2h
提示:
intdiv是PHP7+内置的整数除法函数,若使用PHP7以下版本,替换为(int)($totalMinutes / 60)即可实现相同效果。
多处复用注册Blade自定义指令
如果项目里很多位置需要做这个格式化,直接在AppServiceProvider的boot方法里注册自定义指令,一次定义全局可用:
- 编辑
app/Providers/AppServiceProvider.php,添加指令注册代码:
use Illuminate\Support\Facades\Blade; public function boot() { Blade::directive('formatDuration', function ($totalMinutes) { return "<?php \$h = intdiv($totalMinutes, 60); \$m = $totalMinutes % 60; \$res = ''; if (\$h > 0) \$res .= \$h.'h'; if (\$m > 0 || \$h === 0) \$res .= \$m.'min'; echo \$res; ?>"; }); }
- 之后在任意Blade模板里直接调用即可:
@formatDuration(80) {{-- 输出1h20min --}} @formatDuration(120) {{-- 输出2h --}}
模型固定字段用访问器
如果分钟数是Eloquent模型的固定字段(比如视频时长、课程时长),可以在模型里定义访问器,不管是模板渲染还是接口返回,都能直接拿到格式化后的内容:
// 在对应模型文件中添加 public function getFormattedDurationAttribute() { $hours = intdiv($this->duration, 60); $mins = $this->duration % 60; $res = ''; if ($hours > 0) $res .= $hours.'h'; if ($mins > 0 || $hours === 0) $res .= $mins.'min'; return $res; }
模板中直接调用属性即可:
{{ $video->formatted_duration }}
内容的提问来源于stack exchange,提问作者iliyass
相关产品推荐
相关产品推荐

