不存在 php-duration 官方包,推荐用 spatie/duration 或手动计算;其 Duration 类需传 DateInterval 而非整数秒,且须 use 命名空间;超 24 小时应手动拆解天/时/分/秒,避免 gmdate() 循环缺陷。

Composer 安装 php-duration 库失败?先确认包名是否正确
根本不存在名为 php-duration 的官方 Composer 包。你搜到的可能是拼写错误、已废弃项目,或非 Packagist 托管的私有库。实际可用且维护良好的替代方案是 league/date-time 或更轻量的 nesbot/carbon(自带人类可读格式),但若坚持用“duration”语义,spatie/duration 是目前最接近的活跃包——它提供 Duration 类,支持秒转 1h 23m 45s 这类字符串。
用 spatie/duration 正确安装和初始化
这个包不处理“秒 → 文本”的直译逻辑,而是基于 DateInterval 构建,所以必须传入一个时间间隔对象,不能直接传整数秒。常见错误是运行 composer require spatie/duration 后直接调用 Duration::forSeconds(3661),结果报错:Class Duration not found —— 因为它没自动注册 autoload,且类名带命名空间。
- 执行
composer require spatie/duration - 在 PHP 文件中显式引入:
use Spatie\Duration\Duration; - 传参必须是
DateInterval:先用\DateInterval::createFromDateString('3661 seconds'),再传给Duration::forDateInterval() - 若只想快速把秒转成
1h 23m 45s,不如用原生gmdate()拼接:gmdate('H\h i\m s\s', $seconds)(注意超过 24 小时会重置)
秒数超 24 小时时 gmdate() 失效?改用 floor + 模运算手动拆解
gmdate() 把 90000 秒(25 小时)渲染成 01h 00m 00s,因为它只处理时分秒循环。真实业务中常需 25h 0m 0s 这种线性表达。
- 安全做法是手动计算:
$days = floor($seconds / 86400); $hours = floor(($seconds % 86400) / 3600); $minutes = floor(($seconds % 3600) / 60); $secs = $seconds % 60; - 组合字符串时注意单位省略:若
$days === 0就不拼"{$days}d ",避免出现"0d 1h 2m" - 别依赖第三方库做这种简单算术——多数
duration包底层也是这么算的,还多一层抽象开销
Carbon 的 formatForHumans() 不适合精确秒级转换
Carbon::now()->subSeconds(3661)->diffForHumans() 返回的是类似 "about 1 hour ago" 的模糊描述,不是精确的 "1h 23m 45s"。它面向相对时间感知,而非格式化固定时长。如果你要显示视频时长、任务耗时、API 响应延迟等确定值,diffForHumans() 会误导用户。
立即学习“PHP免费学习笔记(深入)”;
真正需要“秒→可读字符串”时,优先写几行手工计算逻辑,比引入整个 Carbon 或 spatie/duration 更轻、更可控、更少隐式行为。复杂点在于边界处理(比如 0 秒、负数秒、小数秒),而不是核心转换逻辑本身。



















