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

时间:2018-09-24 12:52:06

标签: java parsing time jodatime

我最近遇到过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:无效格式:“ 1:23:45 PM”太短

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

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

1 个答案:

答案 0 :(得分:1)

我不太了解Joda-Time,但我猜想听起来像是我的耳朵。我尝试过:

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

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

在欧洲/哥本哈根时区的计算机上,它刚刚打印:

  

timeString:“美国东部标准时间下午3:19:09”

因此,DateTimeFormat.longTime()似乎包含时区缩写(此处为中欧夏令时的CEST)。因此,显然在您的代码中发生的是:

  • 由于LocalTime不包含时区,因此其toString方法使用空字符串作为时区的缩写来格式化时间。它确实包括了时间与时区缩写应该在的位置之间的间隔。除了您引用(以及我在此处复制时)之外,PM后还有一个空格。
  • LocalTime.parse更为严格,它反对字符串中没有时区缩写。