您可以使用
DateTimeFormatter
创建具有多种图案的 DateTimeFormatterBuilder
,但 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
首先找出我需要的模式,然后用它来解析?
正如评论已经解释的那样,
appendPattern
添加了日期格式字符串想要的内容。因此,您的日期格式化程序会将今天(2023 年 11 月 18 日)格式化为:
18/11/2318/11/20232023/11/18
并且与:
相同DateTimeFormatterBuilder()
.appendPattern("dd/MM/yydd/MM/yyyyyyyy/MM/dd");
一般来说,您不能只让 DTF 代表多个相互冲突的替代方案。它确实有 some 功能 - 模式可以放置在
[]
中,这将它们标记为可选。例如:
DateTimeFormatterBuilder()
.appendPattern("yyyy[-]MM[-]dd");
将解析
20231118
和 2023-11-18
(并且格式为 2023-11-18
)。
但是你不能用它来解析你粘贴的 3 种不同格式。因为您的格式不明确。
这个:
23/11/18
- 是2018年11月23日,还是18年11月23日(是的,18 - 就像,2000多年前。它仍然是一个有效的日期!),还是23年的11月18日(仍然是有效日期吗?)
您可能会认为 1000 年之前的任何日期都是“无效”的,或者至少是必须呈现为 0001 的日期,因此您可能可以使用可选标记做一些疯狂的事情,但这并不是真正的目的是为了。
正则表达式就是这样。 Regexp 找出它的格式,然后 DTF 将其解析为
LocalDate
对象。