DateTimeFormatter多模式组合解析失效,请求技术指导
问题原因分析
当你把两个可选模式用[]组合时,DateTimeFormatter会按从左到右的顺序尝试匹配模式。对于输入2023-08-15T12:34:56.789123,第一个模式[yyyy-MM-dd'T'HH:mm:ss.SSS]会先匹配到前23个字符(即2023-08-15T12:34:56.789),此时解析器认为已匹配成功,但输入字符串还剩123未被处理,触发了DateTimeParseException(默认要求完全解析整个输入文本)。
而单独测试时,每个模式都能完全匹配对应输入,因此不会报错。
解决方案
方法1:调整可选模式的顺序
把匹配更长小数位的模式放在前面,让解析器优先尝试匹配完整的6位小数输入,匹配失败再尝试3位的:
private static final DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern( "[yyyy-MM-dd'T'HH:mm:ss.SSSSSS]" + // 先尝试匹配6位小数 "[yyyy-MM-dd'T'HH:mm:ss.SSS]" // 再尝试3位小数 );
方法2:使用DateTimeFormatterBuilder构建(更清晰可控)
用optionalStart()和optionalEnd()明确定义可选部分,同样注意顺序:
private static final DateTimeFormatter dateTimeFormats = new DateTimeFormatterBuilder() .appendPattern("yyyy-MM-dd'T'HH:mm:ss") .optionalStart() .appendPattern(".SSSSSS") // 优先匹配6位小数 .optionalEnd() .optionalStart() .appendPattern(".SSS") // 再匹配3位小数 .optionalEnd() .toFormatter();
验证效果
修改后运行测试代码,两个输入都能被正确解析,不会抛出异常。
内容的提问来源于stack exchange,提问作者Sahib Yar
相关产品推荐
相关产品推荐

