你可以使用DateTimeFormatterBuilder
创建一个包含多个模式的DateTimeFormatter
,但是LocalDate.parse
似乎不喜欢它,它只支持一个模式,而不能支持多个模式。
test("can parse dates") {
val formatter =
DateTimeFormatterBuilder()
.appendPattern("dd/MM/yy")
.appendPattern("dd/MM/yyyy") // <-- fine when commented out
.appendPattern("yyyy/MM/dd") // <-- fine when commented out
.toFormatter()
// error: Text '12/12/21' could not be parsed at index 8
LocalDate.parse("12/12/21", formatter) shouldBe LocalDate.of(2021, 12, 12)
// works just fine
LocalDate.parse("12/12/21", DateTimeFormatter.ofPattern("dd/MM/yy")) shouldBe LocalDate.of(2021, 12, 12)
}
字符串
有没有办法让它工作,或者我必须先使用Regex
来找出我需要的模式,然后再用它来解析?
1条答案
按热度按时间jjhzyzn01#
正如已经解释过的注解,
appendPattern
添加到日期格式字符串中。因此,您的日期格式化程序将在今天(2023年11月18日)格式化为:字符串
并且将等同于:
型
一般来说,你不能让DTF代表多个冲突的替代方案。它确实有 * 一些 * 功能-模式可以放在
[]
中,将它们标记为可选。例如:型
将解析
20231118
和2023-11-18
(并将格式转换为2023-11-18
)。但是你不能用它来解析你粘贴的3个不同的格式。因为你的格式是不明确的。
这一点:
23/11/18
-是2018年11月23日,还是11月18日23日(是的,18 -在2000多年前。它仍然是一个有效的日期!),还是23年的11月18日(仍然是一个有效的日期?)你大概认为1000年之前的任何日期都是“无效的”,或者至少是必须被渲染为0001的东西,所以你可以用可选的标记做一些疯狂的事情,但这不是它的真正用途。
就是Regexp。Regexp确定它是什么格式,然后DTF将其解析为
LocalDate
对象。