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
相关产品推荐
相关产品推荐

