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

PHP:不使用Datetime类实现毫秒到时长单位的按需转换

解决方案:不依赖DateTime类的毫秒转人性化时长

我明白你想要的是把毫秒转换成更易读的时长格式,还要自动处理单复数,并且只显示有意义的非零单位(不用硬输出所有年/月/周/日/时/分/秒)。下面是一个完全不依赖DateTime类的实现,完美匹配你的需求:

<?php
function formatMillisecondsToDuration($milliseconds) {
    // 定义时长单位:单数名称、复数名称、对应秒数(年/月用近似值,因时长无精确标准)
    $units = [
        ['singular' => '年', 'plural' => '年', 'seconds' => 31536000], // 按365天计算
        ['singular' => '月', 'plural' => '月', 'seconds' => 2592000], // 按30天计算
        ['singular' => '周', 'plural' => '周', 'seconds' => 604800],
        ['singular' => '天', 'plural' => '天', 'seconds' => 86400],
        ['singular' => '小时', 'plural' => '小时', 'seconds' => 3600],
        ['singular' => '分钟', 'plural' => '分钟', 'seconds' => 60],
        ['singular' => '秒', 'plural' => '秒', 'seconds' => 1],
    ];

    $totalSeconds = floor((int)$milliseconds / 1000);
    $remaining = $totalSeconds;
    $durationParts = [];

    foreach ($units as $unit) {
        $count = floor($remaining / $unit['seconds']);
        if ($count > 0) {
            // 处理单复数:1个用单数,多个用复数
            $label = $count === 1 ? $unit['singular'] : $unit['plural'];
            $durationParts[] = "{$count} {$label}";
            $remaining = $remaining % $unit['seconds'];

            // 按需显示:最多保留2个非零单位(匹配你给出的示例)
            if (count($durationParts) >= 2) {
                break;
            }
        }
    }

    // 处理0毫秒的特殊情况
    if (empty($durationParts)) {
        return '0秒';
    }

    // 用中文逗号拼接各个部分
    return implode(',', $durationParts);
}

// 测试示例
echo formatMillisecondsToDuration('14800000'); // 输出:4小时,6分钟
echo '<br>';
echo formatMillisecondsToDuration('21000');    // 输出:21秒
echo '<br>';
echo formatMillisecondsToDuration('183547165'); // 输出:2天,3小时
?>

代码说明:

  • 单位定义:年和月采用近似值(因为时长概念里的年/月没有统一精确值,不同年份月份天数不同),如果你的场景不需要年/月,直接从数组里删掉对应项即可。
  • 单复数处理:通过判断单位数量是否为1,自动切换单数/复数标签,符合中文表达习惯。
  • 按需显示逻辑:遍历单位时从大到小,收集非零单位后最多保留2个(就是你示例里的效果),如果想显示所有非零单位,只需要删掉if (count($durationParts) >= 2) { break; }这一行即可。
  • 边界处理:考虑了0毫秒的情况,返回“0秒”避免空输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:10:56