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

PHP中解决API返回24小时制时间转12小时制日期偏移问题

解决12小时制时间转换的日期偏移问题

我太懂这个坑了!你遇到的问题根源其实是原始时间字符串本身的格式矛盾——23:59:00 PM混合了24小时制小时和12小时制的AM/PM标识,这种冲突让DateTime解析时直接搞混了时间逻辑,把23:59 PM错误地往后偏移了12小时,才出现了第二天的11:59 AM结果。

下面给你两个高效可靠的解决方法:

方法一:先清理矛盾的时间标识,再正常解析

既然原始字符串里的PM是冗余的(23点本身就属于PM时段),我们可以先去掉它,用标准24小时制解析后再转成需要的12小时制格式:

$startdate = '17/05/2018 23:59:00 PM';
// 移除字符串末尾的AM/PM(不区分大小写)
$cleanedDate = preg_replace('/\s(AM|PM)$/i', '', $startdate);
// 用24小时制格式解析清理后的时间
$dateTime = DateTime::createFromFormat('d/m/Y H:i:s', $cleanedDate);
// 格式化为目标12小时制样式
$formattedDate = $dateTime->format('d/m/Y h:i:s A');

echo $formattedDate; // 输出:17/05/2018 11:59:00 PM

方法二:直接用忽略冗余字符的格式解析

如果你不想修改原始字符串,可以利用DateTime::createFromFormat的特殊格式符,直接忽略掉多余的AM/PM部分,同时避免默认时间填充的干扰:

$startdate = '17/05/2018 23:59:00 PM';
// ! 强制重置解析上下文,避免用当前时间填充;* 匹配任意多余字符(即PM)
$dateTime = DateTime::createFromFormat('!d/m/Y H:i:s *', $startdate);
$formattedDate = $dateTime->format('d/m/Y h:i:s A');

echo $formattedDate; // 输出:17/05/2018 11:59:00 PM

为什么之前的代码会出错?

你之前用的d/m/Y H:i A格式存在逻辑冲突:H是24小时制小时,A是12小时制的AM/PM标识,这两个参数同时存在时,DateTime会把23:59 PM理解为“23点加上PM对应的12小时偏移”,相当于把时间往后推了12小时,自然就变成了第二天的11:59 AM。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:24