解析日期时如何修正格式?SQL表数据转txt出现日期解析异常如何处理
问题修复方案
1. 解决java.text.ParseException: Unparseable date日期解析异常
- 先提取转换失败行的日期字段原始值,确认SQL侧的日期格式差异:多数报错原因是同一张表的日期字段存在多种存储格式,比如部分行是
yyyy-MM-dd HH:mm:ss,部分行是dd/MM/yyyy、空字符串、N/A这类非法占位值 - 修改Java日期解析逻辑,添加多格式兼容与异常容错:
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; public class DateParser { // 按实际业务中出现的日期格式调整列表 private static final DateTimeFormatter[] SUPPORTED_FORMATS = { DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"), DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"), DateTimeFormatter.ofPattern("dd-MM-yyyy"), DateTimeFormatter.ofPattern("MM/dd/yyyy") }; public static String parseDateToString(String rawDate) { // 先清理原始值前后空格 String cleanDate = rawDate == null ? "" : rawDate.trim(); // 空值/非法占位值直接返回预设默认值,可按需修改 if (cleanDate.isEmpty() || "N/A".equals(cleanDate) || "null".equals(cleanDate)) { return "1970-01-01 00:00:00"; } // 逐个尝试兼容格式 for (DateTimeFormatter formatter : SUPPORTED_FORMATS) { try { LocalDateTime dateTime = LocalDateTime.parse(cleanDate, formatter); // 统一输出为txt需要的标准日期格式 return dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); } catch (DateTimeParseException ignored) { } } // 所有格式都匹配失败时返回异常标记,后续单独处理 return "INVALID_DATE:" + cleanDate; } }
- 从源头统一SQL日期输出:部分JDBC驱动会自动转换日期输出格式,可在查询SQL中强制格式化,比如MySQL用
DATE_FORMAT(日期字段, '%Y-%m-%d %H:%i:%s') as 日期字段,Oracle用TO_CHAR(日期字段, 'YYYY-MM-DD HH24:MI:SS') as 日期字段,避免格式差异。
2. 解决Document not found错误
- 排查转换失败行对应的关联文档路径:该错误通常是转换逻辑需要读取和SQL行绑定的外部文档,路径配置错误导致
- 如果SQL中存储的是相对路径,转换时补全完整的绝对路径前缀,或者提前将所有关联文档放到统一的资源目录下
- 增加路径存在性校验逻辑,不存在时打印行ID和缺失路径,避免中断全量转换
验证步骤
- 先捞出所有转换失败的行做小批量测试,确认上述逻辑修复有效后再执行全量转换
- 转换过程中输出错误日志,记录所有转换异常的行ID和错误原因,方便后续处理极端异常数据
内容的提问来源于stack exchange,提问作者SANJAY
相关产品推荐
相关产品推荐

