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
相关产品推荐
相关产品推荐

