DateTimeParseException异常排查:同格式时间戳解析一成功一失败原因求解
问题根因
你配置的DateTimeFormatter要求时间的时分秒部分必须按照HH:mm:ss格式用冒号分隔,秒之后的小数部分才允许用点号分隔,两个时间戳的差异刚好出现在秒的前缀分隔符上:
- 解析成功的
2021-08-29 03:52:45.67890:索引16位置为冒号:,符合mm:ss的格式要求 - 解析失败的
2021-08-29 03:53.44.56738:索引16位置为点号.,与预期的冒号不匹配,因此触发解析异常。
修复方案
方案一:修正异常数据源
如果是时间生成逻辑异常,直接将错误字符串中分隔分和秒的点号替换为冒号即可,修改后的值为2021-08-29 03:53:44.56738,可直接被现有解析器正常解析。
方案二:调整解析规则兼容多格式
如果数据源确实存在分和秒用点号分隔的场景,可以调整DateTimeFormatter的构造逻辑,兼容两种分隔符:
private final static DateTimeFormatter DEFAULT_TIMESTAMP_FORMATTER = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd HH:mm") // 兼容分与秒之间的冒号、点号两种分隔符 .appendOptional(DateTimeFormatter.ofPattern(":")) .appendOptional(DateTimeFormatter.ofPattern(".")) .appendValue(ChronoField.SECOND_OF_MINUTE, 2) .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true) .toFormatter();
调整后两种格式的时间戳都可以正常解析。
内容的提问来源于stack exchange,提问作者Serge
相关产品推荐
相关产品推荐

