使用yyyyMMddHHmmssSSS格式解析LocalDateTime为何抛出DateTimeParseException
问题原因
- 核心问题是
DateTimeFormatter的ofPattern方法处理无分隔符的相邻数值字段时的默认匹配规则导致的:- 模式字符串中的
ss代表秒字段,默认是最小长度为2位的可变长度匹配,而非强制固定2位;SSS代表毫秒字段,默认最小长度为3位。 - 第二段代码没有任何分隔符拆分秒和毫秒字段,解析连续数字串
20211211134321221时,解析器无法自动区分秒和毫秒的边界,会将秒字段后的连续数字全部匹配给秒字段,导致解析出的秒值远大于合法范围(0~59),最终抛出DateTimeParseException。
- 模式字符串中的
- 第一段代码可以正常执行的原因是小数点作为明确的分隔符,清晰划分了秒和毫秒的边界,解析器可以准确识别两个字段的范围,不会出现匹配歧义。
修复方案
如果需要解析无分隔符的时间串,可以使用DateTimeFormatterBuilder显式指定每个字段的固定宽度,避免匹配歧义:
DateTimeFormatter formatter = new DateTimeFormatterBuilder() .appendValue(ChronoField.YEAR, 4) .appendValue(ChronoField.MONTH_OF_YEAR, 2) .appendValue(ChronoField.DAY_OF_MONTH, 2) .appendValue(ChronoField.HOUR_OF_DAY, 2) .appendValue(ChronoField.MINUTE_OF_HOUR, 2) .appendValue(ChronoField.SECOND_OF_MINUTE, 2) .appendValue(ChronoField.MILLI_OF_SECOND, 3) .toFormatter(); LocalDateTime dt = LocalDateTime.parse("20211211134321221", formatter);
内容的提问来源于stack exchange,提问作者Linda Lee
相关产品推荐
相关产品推荐

