kotlin LocalDate.parse无法处理具有多个模式的DateTimeFormatter

hgncfbus  于 7个月前  发布在  Kotlin
关注(0)|答案(1)|浏览(57)

你可以使用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来找出我需要的模式,然后再用它来解析?

jjhzyzn0

jjhzyzn01#

正如已经解释过的注解,appendPattern添加到日期格式字符串中。因此,您的日期格式化程序将在今天(2023年11月18日)格式化为:

18/11/2318/11/20232023/11/18

字符串
并且将等同于:

DateTimeFormatterBuilder()
                .appendPattern("dd/MM/yydd/MM/yyyyyyyy/MM/dd");


一般来说,你不能让DTF代表多个冲突的替代方案。它确实有 * 一些 * 功能-模式可以放在[]中,将它们标记为可选。例如:

DateTimeFormatterBuilder()
                .appendPattern("yyyy[-]MM[-]dd");


将解析202311182023-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对象。

相关问题