【问题标题】:Java Joda time is unable to parse DateTimeFormat::longTimeJava Joda 时间无法解析 DateTimeFormat::longTime
【发布时间】:2019-02-27 23:57:37
【问题描述】:

我最近遇到了 Joda,但在解析 LocalTime 时遇到了问题,如简单的 sn-p 所示:

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 无法解析自己?我想我做错了什么 - 这是什么?

【问题讨论】:

  • 哈!很有趣...
  • 我看到你标记了这个 java-8。您是否考虑过使用 java.time?尤达现在有点过时了。
  • @JanLarsen:我的错误,我的意思是只有 Joda 时间。
  • 您的模式“hh:mm:ss”没有意义,请使用“HH:mm:ss”或“hh:mm:ss a”。
  • @MenoHochschild:我的错字,但这无关紧要。我的问题针对其他任何地方。 ://

标签: java parsing time jodatime


【解决方案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 PM CEST"

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

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

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2021-05-22
    • 2016-11-16
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多