使用多个可选模式时订单的重要性 - java

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:无法在索引3处解析文本“ Thursday 07-01-2016”

参考方案

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

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

"Thu 07-01-2016":API尝试查找第一个可选部分"[EEEE]"是否可以匹配。从DateTimeFormatter Javadoc引用有关文本令牌的信息

恰好4个图案字母将使用完整格式。

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

少于4个图案字母将使用缩写形式。

因此这将匹配"Thu"。因此,可以正确理解要解析的字符串
"Thursday 07-01-2016":与上面相同,除了它将在第一个可选部分中与"Thursday"匹配。但是API仍会继续在有效部分中搜索下一个可选部分"[E]",并且找不到任何内容,因此将跳过可选部分。

让我们现在考虑第二种格式"[E][EEEE] dd-MM-yyyy"

"Thu 07-01-2016":API尝试查找第一个可选部分"[E]"是否可以匹配,并且确实适用于"Thu"。如上所述,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]"匹配"Thursday"

请注意,异常消息如何也暗示了这一点(重点是我):

java.time.format.DateTimeParseException:无法在索引3处解析文本“ Thursday 07-01-2016”

索引3对应于"r""rsday",因此这意味着它能够解析到现在为止。

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

Java-父类正在从子类中调用方法? - java

抱歉,我还是编码的新手,可能还没有掌握所有术语。希望您仍然能理解我的问题。我想得到的输出是:"Cost for Parent is: 77.77" "Cost for Child is: 33.33" 但是,我得到这个:"Cost for Parent is: 33.33" "Cost f…

Java Map,如何将UTF-8字符串正确放置到地图? - java

我有一个地图,LinkedHashMap更确切地说。我想在上面放一个字符串对象。然后,我读取此值以查看实际存储的内容。字符串本身具有非ASCII字符(西里尔文,韩文等)。将其放到地图上然后阅读后,这些字符将替换为??? s。一些代码:Map obj = new LinkedHashMap(); System.out.println("name: &…

HIbernate创建数据库表 - java

我正在学习JPA-Hibernate。我正在关注这个article在Dog.java中,它被称为@Table(name = "dog")。 在persistence.xml中,我有以下内容<property name="hibernate.hbm2ddl.auto" value="create"…