使用多模式DateTimeFormatter时LocalDate.parse解析失败如何解决?
问题原因
你连续调用appendPattern的方式是将多个日期格式直接拼接成了一个单一的解析规则,而非添加多个可选的解析模式。比如你原代码生成的解析器会要求输入同时满足dd/MM/yy+dd/MM/yyyy+yyyy/MM/dd的组合格式,这显然和你想要支持多种独立日期格式的需求不符,因此解析短日期字符串时会失败。
解决方案
不需要提前用正则判断格式,直接通过以下方式构建支持多模式的解析器:
方式1:用方括号包裹可选模式(推荐)
日期模式中的方括号[]表示该部分为可选内容,将每个独立的日期格式放在方括号内,解析器会自动尝试匹配任意一个符合的模式:
test("can parse dates") { val formatter = DateTimeFormatter.ofPattern("[dd/MM/yy][dd/MM/yyyy][yyyy/MM/dd]") LocalDate.parse("12/12/21", formatter) shouldBe LocalDate.of(2021, 12, 12) LocalDate.parse("12/12/2021", formatter) shouldBe LocalDate.of(2021, 12, 12) LocalDate.parse("2021/12/12", formatter) shouldBe LocalDate.of(2021, 12, 12) }
如果用DateTimeFormatterBuilder构建,写法如下:
val formatter = DateTimeFormatterBuilder() .appendPattern("[dd/MM/yy]") .appendPattern("[dd/MM/yyyy]") .appendPattern("[yyyy/MM/dd]") .toFormatter()
方式2:用appendOptional包裹独立解析器
通过appendOptional方法,将每个独立的DateTimeFormatter作为可选规则添加,解析器会依次尝试匹配:
val formatter = DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ofPattern("dd/MM/yy")) .appendOptional(DateTimeFormatter.ofPattern("dd/MM/yyyy")) .appendOptional(DateTimeFormatter.ofPattern("yyyy/MM/dd")) .toFormatter()
两种方式都能让解析器自动适配多种日期格式,无需提前判断输入格式。
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

