Java中LocalDate解析CSV日期字符串报解析错误如何解决
问题原因
你的解析报错核心是两点:
- 初始定义的格式化模式
dd-MM-yyyy使用横杠-作为分隔符,但CSV中存储的日期是斜杠/分隔,从第一个字符位置就无法匹配规则,因此抛出索引0位置解析失败的错误。 - 后续尝试的
MM/dd/yyyy模式仍然无法解析4/6/1986这类值:模式中MM、dd要求月份、日期必须为固定2位数字,个位数的月、日需要补前导零(例如04/06/1986)才能匹配,但你的CSV中1-9月、1-9日的日期都是直接输出1位数字,没有前导零。
你测试时发现1986/6/1格式可以正常解析,是因为该格式的年月日顺序、数字长度刚好命中了无自定义格式化器时的默认解析兼容逻辑,不需要特意把所有日期先转成这个格式再二次转换。
另外你不需要怀疑返回类型的问题:LocalDate.parse()方法本身就直接返回LocalDate类型,完全匹配你实体类的字段类型要求,不需要先转成String再做处理。
修复方案
直接定义和CSV实际日期格式匹配的格式化器即可:
// 模式M/d/yyyy可兼容斜杠分隔、月/日为1位或2位数字的4位年份日期 // 支持解析5/14/1974、4/6/1986、12/1/1999等所有你提到的日期格式 private static final DateTimeFormatter BIRTH_DATE_FORMATTER = DateTimeFormatter.ofPattern("M/d/yyyy"); // 直接解析即可得到LocalDate类型结果 LocalDate birthDate = LocalDate.parse(csvRecord.get(Headers.BirthDate), BIRTH_DATE_FORMATTER);
补充说明:日期模式中单个
M、单个d可以自动识别1位、2位长度的月份和日期值,只有写成MM、dd时才会强制要求数值为2位、不足补前导零。如果后续CSV中存在多种日期格式混用的场景,可以通过DateTimeFormatterBuilder配置多套可选解析规则做兼容。
内容的提问来源于stack exchange,提问作者user19522422
相关产品推荐
相关产品推荐

