PHP导入Excel日期至MySQL数据库的格式异常问题求助
解决Excel日期导入MySQL的格式异常问题
这个问题我碰到过好多次了,核心原因就是strtotime的自动日期解析太依赖系统区域设置,很容易搞混月和日,甚至直接解析失败返回false——这就是为什么你看到1/1/2018变成了1970-01-01(date函数处理false就会输出这个默认值),而2/1/2018被错误识别成2018-02-02的原因。
给你一个简单可靠的解决方案:不要用strtotime自动解析,而是用DateTime::createFromFormat强制指定日期格式,这样就不会有歧义了。
修改你的代码如下:
// 先清理输入的日期字符串 $rawDate = trim($data['cells'][$i][25]); // 明确按照m/d/Y格式解析Excel里的日期 $dateInstance = DateTime::createFromFormat('m/d/Y', $rawDate); if ($dateInstance) { // 格式化为MySQL DATE字段要求的Y-m-d格式 $dataexcel[$i-3]['date_edit'] = $dateInstance->format('Y-m-d'); } else { // 处理解析失败的情况,比如设为null或者记录错误日志 $dataexcel[$i-3]['date_edit'] = null; // 可选:记录错误,方便排查问题 error_log("无法解析日期:{$rawDate}"); }
为什么这样能解决问题?
createFromFormat会严格按照你指定的m/d/Y(月/日/年)规则解析字符串,不管系统区域设置是什么,1/1/2018肯定会被识别成2018年1月1日,2/1/2018就是2018年2月1日,彻底避免了月日混淆的问题。- 我们把最终格式改成了
Y-m-d,这是MySQL DATE类型的标准格式,数据库能直接准确识别,不会再出现解析错误。
额外提醒
- 如果你的Excel日期其实是数值(比如Excel内部存储的日期序列号,比如43101对应2018-01-01),那上面的方法不适用,你需要这样处理:
$serialNumber = (float)$rawDate; $dateInstance = new DateTime('1899-12-30'); // Excel的日期起始点 $dateInstance->add(new DateInterval("P{$serialNumber}D")); $dataexcel[$i-3]['date_edit'] = $dateInstance->format('Y-m-d'); - 一定要加解析失败的判断逻辑,不然遇到格式错误的日期,还是会存入1970-01-01这种无效值,设为null或者记录日志能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Tyas
相关产品推荐
相关产品推荐

