DateTimeParseException在Java 11上但在Java 10上有效

时间:2018-09-29 21:30:58

标签: java-time java-11

以下测试用例可以在Java 10上完美运行:

import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;

class Test
{
    public static void main (String[] args) throws java.lang.Exception
    {
        DateTimeFormatter dateFormatter = new DateTimeFormatterBuilder().
          appendPattern("EEE, dd MMM yyyy HH:mm:ss zzz").
          toFormatter();
        Instant result = dateFormatter.parse("Sat, 29 Sep 2018 20:49:02 GMT", Instant::from);
        System.out.println("Result: " + result);
    }
}

但是在Java 11下我得到:

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Sat, 29 Sep 2018 20:49:02 GMT' could not be parsed at index 0
        at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
        at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
        at Test.main(Test.java:13)

这是怎么回事?

更新:将toFormatter()替换为toFormatter(Locale.US)可解决此问题。我猜这个问题与https://bugs.openjdk.java.net/browse/JDK-8206980有关。这个问题在Java 11 build 23中被标记为已修复,但我正在运行

openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)

这个版本不应该解决吗?

UPDATE2 :如果无法重现该问题,请尝试将toFormatter()替换为toFormatter(Locale.CANADA)

1 个答案:

答案 0 :(得分:8)

DateTimeFormatter.RFC_1123_DATE_TIME

您的日期时间字符串为RFC 822 / RFC 1123格式。不用构建自己的格式化程序,而是使用内置的DateTimeFormatter.RFC_1123_DATE_TIME

    Instant result = DateTimeFormatter.RFC_1123_DATE_TIME
            .parse("Sat, 29 Sep 2018 20:49:02 GMT", Instant::from);
    System.out.println("Result: " + result);

输出为:

  

结果:2018-09-29T20:49:02Z

根据RFC规范的要求,此RFC 1123格式化程序始终为英文。我什至尝试将默认语言环境设置为Locale.CANADA_FRENCH,但代码仍然有效。

您的代码出了什么问题?

在Java 11中,Java希望星期几和月份的缩写都在Locale.CANADA中用点写:Sat.Sep.,而不是Sat和{ {1}}。在Java 10中,它们应不带点,因此在这里进行解析。区别可能在于CLDR数据的不同版本,在任何上述Java版本中都几乎不能认为是错误。由于Java 9 CLDR一直是Java中的默认语言环境数据-包括不同语言环境中的日期和月份缩写。

演示:使用格式化程序,但按照您所说的将其修改为使用Sep

Locale.CANADA

在Java 10.0.2上运行时,没有打印点:

  

示例:Sun,2018年9月30日10:39:28 EDT

在Java 11 build 11 + 28上:

  

示例:2018年9月30日,星期日10:50:29 EDT

因此,我认为该行为与您链接到的错误报告无关。

链接