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

PHP实现单位数小时补零:将9:00am转为09:00am及场景处理

PHP 给单数字小时补前导零的时间格式化方案

嘿,这俩问题核心都是给12小时制里的单个数字小时补个前导零,我给你分享几个实用的解决思路,直接就能用:

问题1:把 9:00am 转成 09:00am

最稳妥的方式是用PHP的DateTime类,它能精准处理各种时间格式,代码也清晰易懂:

$originalTime = '9:00am';
// 按「不带前导零的12小时制:分钟am/pm」的格式解析时间
$dt = DateTime::createFromFormat('g:ia', $originalTime);
// 按「带前导零的12小时制:分钟am/pm」格式输出
echo $dt->format('h:ia'); // 输出 09:00am

这里的格式符简单说明下:

  • g:12小时制,不带前导零(比如9、12)
  • h:12小时制,带前导零(比如09、12)
  • i:两位分钟数(比如00、30)
  • a:小写的am/pm后缀

问题2:把 9:30 am - 12:00 pm 转成 09:30 am - 12:00pm

这个是处理带时间段的字符串,我们可以拆分后分别格式化,再拼接回去,同时处理掉结束时间里pm前面的空格:

方法一:用DateTime拆分处理

$val = '9:30 am - 12:00 pm';
// 拆分出开始和结束时间片段
list($startStr, $endStr) = explode(' - ', $val);

// 格式化开始时间(保留am前面的空格)
$startDt = DateTime::createFromFormat('g:i a', $startStr);
$formattedStart = $startDt->format('h:i a');

// 格式化结束时间并去掉pm前面的空格
$endDt = DateTime::createFromFormat('g:i a', $endStr);
$formattedEnd = str_replace(' ', '', $endDt->format('h:i a'));

// 拼接成最终结果
$formattedVal = "$formattedStart - $formattedEnd";
echo $formattedVal; // 输出 09:30 am - 12:00pm

方法二:用正则批量替换

如果你的时间段格式比较固定,用正则可以一步到位,不用拆分字符串:

$val = '9:30 am - 12:00 pm';
// 匹配单个数字开头的时间片段,补零后替换
$formattedVal = preg_replace_callback('/(\d{1}:\d{2}) (\w{2})/', function($matches) {
    // 拆分小时和分钟,给单个数字的小时补前导零
    list($hour, $minute) = explode(':', $matches[1]);
    return sprintf('%02d:%s', $hour, $minute) . ' ' . $matches[2];
}, $val);
// 去掉结束时间里pm前面的空格
$formattedVal = str_replace(' pm', 'pm', $formattedVal);
echo $formattedVal; // 输出 09:30 am - 12:00pm

这两种方法都能搞定需求,DateTime类更适合复杂的时间场景,正则则更简洁,看你具体需求选就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:12