代码之家  ›  专栏  ›  技术社区  ›  Nikolas Charalambidis

Java Joda time无法分析DateTimeFormat::longTime

  •  2
  • Nikolas Charalambidis  · 技术社区  · 6 年前

    我最近遇到了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 并打印解析的 本地时间字符串 13:23:45.000

    2. 我在这里挣扎。这个 本地时间字符串 1:23:45 PM 但是,以下行会导致异常:

      java.lang.IllegalArgumentException:格式无效:“1:23:45 PM”太短

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

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   Anonymous    6 年前

    我真的不知道乔达的时间,但我有一个猜测,听起来在我自己的耳朵合格。我试过这个:

        DateTimeFormatter dateTimeFormatter 
                = DateTimeFormat.longTime().withLocale(Locale.US);
    
        String timeString = DateTime.now().toString(dateTimeFormatter);
        System.out.println("timeString: \"" + timeString + '"');
    

    时间字符串:“3:19:09 PM CEST”

    看来 DateTimeFormat.longTime() 包括时区缩写(这里CEST表示中欧夏季时间)。显然,代码中发生的是:

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