如何移除时间字符串冗余零?PHP自定义时间格式化方案
关于PHP移除时间字符串冗余前导零的解决方案
首先直接给你结论:PHP并没有专门针对这种HH:MM:SS格式移除冗余前导零的内置函数,我也查过官方文档确认了这一点,所以确实需要通过自定义逻辑来实现你的需求。
先明确你的需求场景:将从数据库获取的形如HH:MM:SS的时间字符串,移除所有不必要的前导零,只保留时分秒的有效数字,示例如下:
00:03:56→3:5601:45:11→1:45:1100:00:24→0:24
你提供的自定义函数分析
你自己写的这个get_duration函数已经能实现需求,不过可以稍微优化一下逻辑,让代码更简洁健壮:
原代码:
function get_duration($time){ list($h, $m, $s) = explode(':', $time); if ($h==00){ $h = ''; if (substr($m, 0, 1)==0){ $m = substr($m, 1, 1).':'; }else{ $m.= ':'; } }else{ if (substr($h, 0, 1)==0){ $h = substr($h, 1, 1).':'; } $m.=':'; } return $h.$m.$s; } echo get_duration('00:03:56'); //return 3:56
优化后的版本
可以用ltrim()来替代手动截取子串的方式,更高效也能处理极端情况(比如意外出现多个前导零的情况):
function get_duration($time) { list($hours, $minutes, $seconds) = explode(':', $time); // 处理小时部分:如果是00则舍去,否则移除前导零 $formattedHours = $hours === '00' ? '' : ltrim($hours, '0') . ':'; // 处理分钟部分:如果小时舍去且分钟是00,保留0;否则移除前导零 if ($formattedHours === '') { $formattedMinutes = $minutes === '00' ? '0:' : ltrim($minutes, '0') . ':'; } else { $formattedMinutes = $minutes . ':'; } // 拼接结果并去除末尾多余的冒号 $result = rtrim($formattedHours . $formattedMinutes, ':') . ':' . $seconds; return $result; } // 测试所有示例 echo get_duration('00:03:56') . PHP_EOL; // 输出 3:56 echo get_duration('01:45:11') . PHP_EOL; // 输出 1:45:11 echo get_duration('00:00:24') . PHP_EOL; // 输出 0:24
优化点说明
- 用
ltrim($str, '0')直接移除前导零,比手动判断第一个字符更简洁,也能处理比如000:05:10这种异常格式(虽然你的场景里是两位,但代码更健壮) - 对变量名进行了更清晰的命名(
hours替代h),提升代码可读性 - 增加了对
00:00:24这种分钟也为00的场景的明确处理,避免出现:24的错误格式 - 用
rtrim()统一处理多余的冒号,逻辑更清晰
内容的提问来源于stack exchange,提问作者urbmake
相关产品推荐
相关产品推荐

