gpt4 book ai didi

java - 使用多个可选模式时顺序的重要性

转载 作者:行者123 更新时间:2023-12-03 22:58:37 24 4
gpt4 key购买 nike

DateTimeFormatter 中可选模式的顺序如何影响解析操作?

我在运行这个程序时想知道为什么最后一行抛出异常而不是前三行。

public static void main(String[] args) {
String p1 = "[EEEE][E] dd-MM-yyyy";
String p2 = "[E][EEEE] dd-MM-yyyy";
String date1 = "Thu 07-01-2016";
String date2 = "Thursday 07-01-2016";
parse(date1, p1); //OK
parse(date1, p2); //OK
parse(date2, p1); //OK
parse(date2, p2); //Exception
}

private static void parse(String date, String pattern) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, Locale.ENGLISH);
System.out.println(fmt.parse(date));
}

最后一行的异常是:

java.time.format.DateTimeParseException: Text 'Thursday 07-01-2016' could not be parsed at index 3

最佳答案

文档没有提到任何优先级,我会争辩说你得到的结果是正常的。它是从左到右读取String格式的结果。

  • 让我们考虑第一种格式[EEEE][E] dd-MM-yyyy"

    • "Thu 07-01-2016":API 会尝试查找第一个可选部分 "[EEEE]" 是否可以匹配。引自 DateTimeFormatter关于文本标记的 Javadoc

      Exactly 4 pattern letters will use the full form.

      在这种情况下是星期几的完整形式。这与 "Thu" 不匹配,因此将跳过该可选部分。然而,第二个可选部分是 [E]",并且仍然引用

      Less than 4 pattern letters will use the short form.

      所以这将匹配 "Thu"。这样才能正确理解要解析的String

    • "Thursday 07-01-2016":与上面相同,除了它会在第一个可选部分匹配 "Thursday"。但是 API 仍将继续搜索有效部分以寻找下一个可选部分 [E]",但它不会找到任何部分,因此跳过可选部分。
  • 现在让我们考虑第二种格式[E][EEEE] dd-MM-yyyy"
    • "Thu 07-01-2016":API 会尝试查找第一个可选部分 "[E]" 是否可以匹配,它确实适用于 “星期四”。如上所述,API 现在将尝试为 [EEEE]" 找到匹配项,但找不到任何匹配项,因此跳过可选部分。
    • "Thursday 07-01-2016":API 尝试再次匹配 "[E]",这就是事情发生的地方:它确实匹配。 "Thursday""Thu" 开头,因此格式化程序能够找到匹配项。但随后,它会尝试解析其余部分,即 "rsday 07-01-2016"[EEEE] 可选部分将不匹配,因此将被跳过。然后它因空格而失败,因为剩下的地方没有空格(取而代之的是 "r")。

所以如果你用

运行你的代码
parse("ThuThursday 07-01-2016", "[E][EEEE] dd-MM-yyyy");

你会看到它有效:"[E]" 匹配 "Thu""[EEEE]" 匹配 “星期四”

注意异常消息是如何暗示这一点的(重点是我的):

java.time.format.DateTimeParseException: Text 'Thursday 07-01-2016' could not be parsed at index 3

索引 3 对应于 “rsday”“r”,所以这意味着它能够解析,直到这一点。

关于java - 使用多个可选模式时顺序的重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34657355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com