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

