LocalDate.parse 对于具有多种模式的 DateTimeFormatter 失败

问题描述 投票:0回答:1

您可以使用

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
首先找出我需要的模式,然后用它来解析?

java kotlin parsing localdate kotest
1个回答
0
投票

正如评论已经解释的那样,

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
对象。

© www.soinside.com 2019 - 2024. All rights reserved.