Laravel使用Maatwebsite导入Excel文本日期时Carbon解析失败报错
Laravel Maatwebsite Excel导入文本日期报错解决方案
报错原因
你遇到的错误提示如下:
Could not parse '13/06/2021 19:00': DateTime::__construct(): Failed to parse time string (13/06/2021 19:00) at position 0 (1): Unexpected character
触发错误的核心原因有两个:
- Carbon默认对
/分隔的日期字符串采用月/日/年的美式格式解析,你使用的日期是日/月/年的欧式格式,当日期中的日数值大于12时,Carbon会将其识别为无效月份直接抛出异常,所谓的“随机停止”只是刚好遇到了日>12的日期行。 - 你之前尝试调用
Carbon::createFromFormat($row[7])报错,是因为该方法要求第一个参数必须传入明确的日期格式规则,仅传日期值属于参数调用错误。
修复方案
直接通过createFromFormat明确指定日期格式即可,可额外加字符串清理和异常兼容逻辑,避免脏数据导致整个导入任务中断。
基础修复代码
public function model(array $row) { // 先清除日期字符串中的不可见空格、特殊字符 $pickupRaw = trim($row[7]); $dropRaw = trim($row[8]); // 明确指定格式为 日/月/年 时:分 $pickup_date = Carbon::createFromFormat('d/m/Y H:i', $pickupRaw); $drop_date = Carbon::createFromFormat('d/m/Y H:i', $dropRaw); return new Driveme([ 'targa' => $row[14], 'modello' => $row[13], 'driver' => $row[10], 'pickup_date' => $pickup_date, 'drop_date' => $drop_date, ]); }
兼容异常行的优化代码
如果允许跳过格式异常的行、不中断整个导入流程,可以加异常捕获处理:
public function model(array $row) { try { $pickupRaw = trim($row[7]); $dropRaw = trim($row[8]); $pickup_date = Carbon::createFromFormat('d/m/Y H:i', $pickupRaw); $drop_date = Carbon::createFromFormat('d/m/Y H:i', $dropRaw); } catch (\Carbon\Exceptions\InvalidFormatException $e) { // 记录异常行日志方便后续排查 \Log::error('日期解析失败', ['行数据' => $row, '错误信息' => $e->getMessage()]); // Maatwebsite Excel中返回null会自动跳过当前行 return null; } return new Driveme([ 'targa' => $row[14], 'modello' => $row[13], 'driver' => $row[10], 'pickup_date' => $pickup_date, 'drop_date' => $drop_date, ]); }
补充说明
如果仍有解析失败的情况,可先将原始$row[7]、$row[8]写入日志,确认是否存在隐形字符、分隔符不一致、或者缺少年/月/时间部分的异常数据。
内容的提问来源于stack exchange,提问作者Marco Bozzola
相关产品推荐
相关产品推荐

