PHP中12小时制用h/g加A/a,24小时制用H/G;strtotime()解析12小时制必须含AM/PM,否则默认按24小时制处理;DateTime::createFromFormat()可精确控制格式解析,且需校验返回值。

PHP 用 date() 输出 12 小时制和 24 小时制的区别
关键在格式字符:h 是 12 小时制(带前导零,01–12),H 是 24 小时制(00–23);g 和 G 是对应不带前导零的版本(1–12 / 0–23)。别混用大小写——h 和 H 表示完全不同的时间系统。
常见错误是写成 date('h:i:s') 却没加 AM/PM 标识,导致看不出是上午还是下午;或者误用 H 去匹配中文语境下的“下午3点”这种表述。
-
date('h:i:s A')→03:45:22 PM(12 小时制 + 大写 AM/PM) -
date('g:i:s a')→3:45:22 pm(无前导零 + 小写 am/pm) -
date('H:i:s')→15:45:22(标准 24 小时制) -
date('G:i:s')→15:45:22(同H,但 0–23 不补零,实际显示一样)
strtotime() 解析 12 小时制字符串要加 AM/PM
PHP 的 strtotime() 默认按 24 小时制解析时间字符串。如果传入 "3:30",它会当作凌晨 3:30;而 "3:30 PM" 才能正确转成 15:30。漏掉 AM/PM 是最常踩的坑。
-
strtotime('3:30 PM')→ 正确返回 15:30 对应的时间戳 -
strtotime('3:30')→ 默认解析为03:30(不是 15:30) -
strtotime('3:30 pm')→ 大小写不敏感,也能识别 - 中文字符串如
"下午3:30"不被原生支持,需先替换或改用DateTime::createFromFormat()
用 DateTime::createFromFormat() 精确控制 12/24 小时制输入
当你要从用户输入、API 或日志中解析固定格式的时间(比如 "02:15 PM" 或 "14:15"),DateTime::createFromFormat() 比 strtotime() 更可靠,因为它强制按指定格式匹配。
立即学习“PHP免费学习笔记(深入)”;
- 解析 12 小时制:
DateTime::createFromFormat('h:i A', '02:15 PM') - 解析 24 小时制:
DateTime::createFromFormat('H:i', '14:15') - 注意:
h要求输入是 01–12,若传入"13:15 PM"会返回false - 解析失败时返回
false,务必检查:if (!$dt) { /* 处理错误 */ }
时区和 locale 不影响 12/24 小时制逻辑,但影响显示语义
date() 和 DateTime 的 12/24 制切换完全由格式字符决定,和当前时区无关;setlocale() 也不会让 A 变成中文的“上午”,PHP 原生不支持本地化 AM/PM 文本。
- 想输出“下午3:30”,得自己映射:
$ampm = $hour >= 12 ? '下午' : '上午'; $hour12 = $hour % 12 ?: 12; -
date_default_timezone_set('Asia/Shanghai')只影响时间戳对应的本地时刻,不影响h/H的行为 - 国际化场景建议统一用 24 小时制存储和传输,前端或展示层再按 locale 转换格式
真正容易被忽略的是:12 小时制必须和 AM/PM 同时存在才有意义,单独用 h 格式输出却不带 A,或者解析时不校验输入是否含 AM/PM,都会导致逻辑错位——尤其在跨时区调度或定时任务里,这种错位可能几个小时都发现不了。



















