你可以用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来确定我需要哪种模式,然后再用它来解析?

推荐答案

正如前面解释的注释,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");

将解析202311182023-11-18(并格式化为2023-11-18).

但你不能用它来解析你粘贴的三种不同的格式.因为你的格式是are ambiguous.

这一点:

23/11/18-是2018年11月23日,还是11月18日23日(是的,18年--也就是2000多年前的情况).它仍然是一个有效的日期!),或者它是23年的11月18日(仍然是一个有效的日期?)

您可能认为公元1000年之前的任何日期都是"无效的",或者至少是必须呈现为0001的日期,所以您也许能够用可选的标记来做一些疯狂的事情,但这并不是它的真正用途.

就是Regexp.Regexp确定它的格式,然后dtf将其解析为LocalDate对象.

Java相关问答推荐

javafx getHostServices(). showDocument()调出Chrome而不是默认浏览器(Linux)

调用引发泛型异常的泛型方法时出现编译错误

在bash中将数组作为Java程序的参数传递

JPanel透支重叠的JComcoBox

如何使用Jackson将XML元素与值和属性一起封装

GetChildren().emoveAll()不会删除 node

尽管通过中断请求线程死亡,但线程仍将继续存在

如何从日期中截取时间并将其传递给组件?

为什么同步数据块无效?

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

FETCH类型设置为LAZY,但它仍会发送第二个请求

为什么我不能建立输入/输出流?Java ServerSocket

持续时间--为什么在秒为负数的情况下还要做额外的工作?

接受类及其接口的Java类型(矛盾)

[jdk21][Foreign Function&;Memory API]MemoryLayout::varHandle通过可变数组进行 struct 化的问题

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

如何使用命令行为Java应用程序生成烟雾测试用例

可以';不要在Intellij IDEA中使用最新的Java版本(JDK 21)

如何转换Vector<;对象>;转换为int?

为什么 Random() 的行为不符合预期?