PHP DateTime格式转换异常:为何两个时间值差异巨大?
问题原因分析
你的问题核心在于**strtotime()无法正确识别你用连字符-分隔的时间格式**,导致时间戳解析失败,最终返回了Unix纪元时间(01-Jan-1970 01:00:00是时区偏移后的显示结果)。
具体拆解来看:
- 你的原始时间字符串是
31-May-2018 19-15-28,其中时间部分用-代替了标准的:分隔符。strtotime()对这种非标准时间格式的兼容性很差,它没法把19-15-28识别为有效的时分秒,因此第一次调用strtotime($Record['DateTime'])会返回false。 - 当
date()函数收到false作为时间戳参数时,会自动把它当作0(Unix纪元的起始时间)处理,所以$DateTime实际上是纪元时间转成d-M-Y H-i-s格式的字符串。 - 第二次调用
strtotime($DateTime)依然无法解析这个无效的时间字符串,再次返回false,最终Send_Time就变成了纪元时间。
解决方案:使用DateTime类解析自定义格式
相比依赖strtotime()的自动解析,PHP的DateTime类支持手动指定格式来解析非标准时间字符串,可靠性高得多。修改你的代码如下:
<?php $Record['DateTime']='31-May-2018 19-15-28'; // 用指定格式解析原始时间字符串 $dt = DateTime::createFromFormat('d-M-Y H-i-s', $Record['DateTime']); // 转换为你需要的格式 $Record['Send_Time'] = $dt->format('d-M-Y H:i:s'); print_r($Record); ?>
运行这段代码后,Send_Time会正确输出31-May-2018 19:15:28。
额外提示
- 尽量避免用
strtotime()处理非标准时间格式,它的解析规则依赖系统环境,很容易出现不可预期的结果。 - 如果需要在不同时间格式间转换,
DateTime::createFromFormat()+format()是更稳定的组合。
内容的提问来源于stack exchange,提问作者Rajib Hossain Pavel
相关产品推荐
相关产品推荐

