PHP读取Excel时的日期格式处理:如何统一转为Y-m-d H:i:s
解决PHP中Excel日期格式转换错误的问题
这个问题的核心在于strtotime()对日期格式的默认解析逻辑——它会优先把带斜杠的日期识别为**美式的月/日/年(mm/dd/yyyy)**格式。当你的日期是17/03/2018时,17作为月份显然不符合逻辑,所以strtotime()会返回false,而date()函数处理时间戳0(也就是Unix纪元起始点)时,就会输出1970-01-01 05:30:00(这个时区偏移是因为你的PHP环境用的是东八区)。
而第二个日期3/1/2018 0:37能被正确解析,是因为3作为月份、1作为日期符合美式格式的规则,所以strtotime()能识别。
可靠的解决方案:使用DateTime::createFromFormat()
既然你不确定Excel里的日期格式是日/月/年还是月/日/年,我们可以通过尝试多种格式解析的方式来覆盖所有情况,这比依赖strtotime()的自动识别要可靠得多。
这里提供一个通用的转换函数,能处理你给出的两种日期格式:
function convertExcelDate($dateStr, $targetFormat = 'Y-m-d H:i:s') { // 优先尝试日/月/年格式(带前导零) $date = DateTime::createFromFormat('d/m/Y H:i', $dateStr); if (!$date) { // 失败则尝试月/日/年格式(带前导零) $date = DateTime::createFromFormat('m/d/Y H:i', $dateStr); } // 处理不带前导零的情况(比如3/1/2018 0:37) if (!$date) { $date = DateTime::createFromFormat('j/n/Y G:i', $dateStr); if (!$date) { $date = DateTime::createFromFormat('n/j/Y G:i', $dateStr); } } return $date ? $date->format($targetFormat) : false; } // 测试你的示例日期 echo convertExcelDate('17/03/2018 00:00'); // 输出:2018-03-17 00:00:00 echo convertExcelDate('3/1/2018 0:37'); // 输出:2018-03-01 00:37:00
函数逻辑说明
d/m/Y H:i:匹配带前导零的日/月/年格式(比如17/03/2018 00:00)m/d/Y H:i:匹配带前导零的月/日/年格式j/n/Y G:i:匹配不带前导零的日/月/年格式(j是无零日,n是无零月,G是无零24小时制小时)n/j/Y G:i:匹配不带前导零的月/日/年格式
如果所有格式都匹配失败,函数会返回false,你可以根据业务需求添加错误处理逻辑。
为什么不推荐继续用strtotime()?
strtotime()的自动识别虽然方便,但对于非标准或混合格式的日期,很容易出现解析错误,尤其是当日期中的日大于12时,几乎一定会出错。而DateTime::createFromFormat()让你明确指定输入格式,解析结果更可控、更可靠。
内容的提问来源于stack exchange,提问作者Ankit Jain
相关产品推荐
相关产品推荐

