3

我有以下代码在 Oracle JDK 10 上完美运行

public static void main(String[] args) {
    final var localTime = LocalTime.parse("8:00AM", DateTimeFormatter.ofPattern("h:mma"));
    System.out.println("Local time is " + localTime);
}

它输出以下...

Local time is 08:00

当我在 OpenJDK 12 上运行相同的代码时,我得到了这个......

Exception in thread "main" java.time.format.DateTimeParseException: Text '8:00AM' could not be parsed at index 4
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1951)
    at java.base/java.time.LocalTime.parse(LocalTime.java:463)
    at com.virtualenergyservices.portal.backend.bootstrap.FacilitiesImporter.main(FacilitiesImporter.java:909)

有人有什么想法吗?

4

2 回答 2

3

JDK 11已更新为使用CLDR v33(请参阅发行说明: 将区域设置数据更新为 Unicode CLDR v33)。与以前的默认语言环境数据CLDR相比,有许多变化。这会导致在解析一些与以前的 JDK 版本良好配合的与语言环境相关的字段时抛出异常。JREJDK8

您的测试用例中的代码不起作用,因为对于en_CA区域设置,使用CLDR v33日期间看起来像a.m./p.m.。所以,这里有两个选择:

  1. 更新代码以使用以下指定的格式CLDR

    public static void main(String[] args) {
        Locale.setDefault(new Locale("en", "CA"));
        final var localTime = LocalTime.parse("8:00a.m.", DateTimeFormatter.ofPattern("h:mma"));
        System.out.println("Local time is " + localTime);
    }
    
  2. 使用兼容性开关-Djava.locale.providers=COMPAT,它支持与 捆绑的语言环境数据,这曾经是和早期版本JRE中的默认设置。使用上述选项运行时将正确解析。JDK8"8:00AM"JDK12

于 2019-04-08T04:18:36.193 回答
0

显然 Locale.Canada 不起作用。

Locale.US 和 Locale.ROOT 确实有效。

于 2019-04-02T21:41:36.783 回答