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

PHP导入CSV时如何将多格式日期统一为MariaDB支持格式

问题解决方法

错误原因

你之前使用date_format()转换失败是因为该函数要求传入的第一个参数为DateTime实例,不能直接传入CSV读取到的原始字符串。同时你上传的日期存在两种格式、多余空格、p.m.这类非标准上下午标识,需要先预处理再转换。

修改后的控制器代码

static public function ctrImportExcel()
{
    if(isset($_POST["import_file"])) 
    { 
        $file = $_FILES["file"]["tmp_name"]; 
        $file_open = fopen($file,"r"); 
        $answer = "error"; // 初始化返回状态

        // 如果CSV有表头,取消注释下面这行跳过表头
        // fgetcsv($file_open, 1000, ",");

        while(($data = fgetcsv($file_open, 1000, ",")) !== false)
        {
            $no_empleado = $data[0];
            $rawDate = trim($data[1]);
            
            // 预处理日期字符串:合并多余空格、替换非标准上下午标识
            $rawDate = preg_replace('/\s+/', ' ', $rawDate);
            $rawDate = str_replace(['.', 'p m', 'a m'], ['', 'PM', 'AM'], $rawDate);
            
            // 依次尝试匹配两种日期格式
            $dateObj = DateTime::createFromFormat('d/m/Y h:i A', $rawDate);
            if (!$dateObj) {
                $dateObj = DateTime::createFromFormat('d/m/Y H:i', $rawDate);
            }
            
            // 格式匹配失败直接终止导入并报错
            if (!$dateObj) {
                echo"<script>
                    Swal.fire({ 
                        title: '日期格式错误',
                        text: '不合法的日期:".$rawDate."',
                        icon: 'error',
                        confirmButtonText:'Ok'
                        });
                 </script>";
                 fclose($file_open);
                 return;
            }
            
            // 转换为MariaDB支持的格式
            $data[1] = $dateObj->format('Y-m-d H:i:s');

            $table = "events";
            $answer  = ModelEvents::mdlImportExcel($table, $data);
        }
        fclose($file_open);

        if($answer=="ok")
        {
            echo"<script>
                Swal.fire({ 
                    title: 'Success!',
                    icon: 'success',
                    confirmButtonText:'Ok'
                    }).then((result)=>{
                        if(result.value){
                            window.location = 'index';
                        }
                    });
            </script>";
                
        }
        else
        {
            echo"<script>
                    Swal.fire({ 
                        title: 'Error!',
                        icon: 'error',
                        confirmButtonText:'Ok'
                        });
                 </script>";
        }
    }
}

验证说明

你示例中的两个测试日期转换结果如下:

  • 原始值:01/01/2021 1:00 p.m. → 转换后:2021-01-01 13:00:00
  • 原始值:01/01/2021 14:00 → 转换后:2021-01-01 14:00:00
    完全符合MariaDB的日期格式要求。

内容的提问来源于stack exchange,提问作者Andrea Duran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:57:00