
本文介绍在 laravel blade 模板中将整数分钟值(如 1510)转换为易读的时长格式(如 “25h10min”)的多种可靠方法,涵盖 php 原生函数、类型安全处理及 blade 内联写法。
本文介绍在 laravel blade 模板中将整数分钟值(如 1510)转换为易读的时长格式(如 “25h10min”)的多种可靠方法,涵盖 php 原生函数、类型安全处理及 blade 内联写法。
在 Laravel 开发中,常需将数据库或业务逻辑中存储的总分钟数(如视频时长、任务耗时等)以更直观的 XhYmin 格式展示给用户。直接输出 80min 不够友好,而 1h20min 更符合阅读习惯。以下是几种推荐实践,兼顾兼容性、可读性与健壮性。
✅ 推荐方案:Blade 中使用 intdiv()(PHP ≥ 7.3)
intdiv() 是 PHP 7.3+ 引入的安全整除函数,避免浮点误差,语义清晰:
@php
$totalMinutes = $task->duration; // 假设为 1510
$totalMinutes = (int) $totalMinutes; // 强制转整型,防字符串输入
$hours = intdiv($totalMinutes, 60);
$mins = $totalMinutes % 60;
@endphp
{{ $hours }}h{{ $mins }}min
输出:25h10min
⚠️ 注意:若 $task->duration 来自表单或 API,可能为字符串(如 "1510"),务必先 (int) 类型转换,否则 % 运算可能触发警告或意外结果。
✅ 兼容方案:使用 floor()(支持 PHP 5.3+)
对低版本 PHP 或需最大兼容性的项目,可用 floor() 替代:
@php
$totalMinutes = (int) $task->duration;
$hours = floor($totalMinutes / 60);
$mins = $totalMinutes % 60;
@endphp
{{ $hours }}h{{ $mins }}min
该写法在所有现代 Laravel 支持的 PHP 版本中均稳定运行。
✅ 进阶封装:复用性强的 Blade 指令(推荐)
为避免重复逻辑,建议注册自定义 Blade 指令,在 AppServiceProvider::boot() 中添加:
Blade::directive('formatDuration', function ($expression) {
return "<?php echo (function(\$m) { \$m = (int)\$m; return intdiv(\$m, 60).'h'.(\$m % 60).'min'; })($expression); ?>";
});
然后在 Blade 中简洁调用:
@formatDuration($task->duration)
? 注意事项总结
- 永远做类型校验:分钟值来源不可信时,强制 (int) 转换是必须步骤;
- 避免负数输入:生产环境建议加校验(如 if ($totalMinutes
- 零值处理:0min → 0h0min,如需显示为 0min,可额外判断;
- 国际化考虑:若需多语言支持(如中文“小时”“分钟”),应结合 trans() 函数,而非硬编码 h/min。
通过以上方法,你可在 Blade 模板中高效、安全地实现分钟到 XhYmin 的格式化,兼顾代码可维护性与用户体验。











