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

