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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:17