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

如何移除时间字符串冗余零?PHP自定义时间格式化方案

关于PHP移除时间字符串冗余前导零的解决方案

首先直接给你结论:PHP并没有专门针对这种HH:MM:SS格式移除冗余前导零的内置函数,我也查过官方文档确认了这一点,所以确实需要通过自定义逻辑来实现你的需求。

先明确你的需求场景:将从数据库获取的形如HH:MM:SS的时间字符串,移除所有不必要的前导零,只保留时分秒的有效数字,示例如下:

  • 00:03:56 → 3:56
  • 01:45:11 → 1:45:11
  • 00: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

优化点说明

  1. 用ltrim($str, '0')直接移除前导零,比手动判断第一个字符更简洁,也能处理比如000:05:10这种异常格式(虽然你的场景里是两位,但代码更健壮)
  2. 对变量名进行了更清晰的命名(hours替代h),提升代码可读性
  3. 增加了对00:00:24这种分钟也为00的场景的明确处理,避免出现:24的错误格式
  4. 用rtrim()统一处理多余的冒号,逻辑更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:03:38