Java Joda 时间无法解析 DateTimeFormat::longTime

Java Joda time is unable to parse DateTimeFormat::longTime

我最近遇到了 Joda,我在解析 LocalTime 时遇到了问题,如一个简单的片段所示:

String localTimeString = LocalTime.now().toString(dateTimeFormatter);
LocalTime localTime = LocalTime.parse(localTimeString, dateTimeFormatter);

结果根据使用的 DateTimeFormatter 而不同:

  1. DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss");
  2. DateTimeFormatter dateTimeFormatter = DateTimeFormat.longTime();

我对结果感到惊讶:

  1. 第一个工作正常,localTimeString 的值为 13:23:45 并正确打印解析的 localTimeString 结果 13:23:45.000

  2. 我在这里挣扎。 localTimeString1:23:45 PM,但是,以下行会导致异常:

    java.lang.IllegalArgumentException: Invalid format: "1:23:45 PM " is too short

我没有发现任何类似的问题,Joda JavaDoc 也没有帮助我。

为什么DateTimeFormat::longTime无法解析自身?我想我做错了什么 - 是什么?

我不太了解 Joda-Time,但我的猜测在我自己听来是合格的。我试过这个:

    DateTimeFormatter dateTimeFormatter 
            = DateTimeFormat.longTime().withLocale(Locale.US);

    String timeString = DateTime.now().toString(dateTimeFormatter);
    System.out.println("timeString: \"" + timeString + '"');

在我的 Europe/Copenhagen 时区计算机上,它刚刚打印:

timeString: "3:19:09 PM CEST"

所以 DateTimeFormat.longTime() 似乎包括时区缩写(这里的 CEST 代表中欧夏令时)。所以显然你的代码中发生的是:

  • 由于LocalTime不包含时区,其toString方法将时间格式化为空字符串作为时区缩写。它确实包括时间和时区缩写应该在的位置之间的 space。在你引用的例外情况下(以及当我在这里复制它时)在 PM.
  • 之后有一个 space
  • LocalTime.parse 更严格,反对字符串中缺少时区缩写。