LocalTime.parse ведет себя по-разному на JDK 12 - PullRequest
3 голосов
/ 03 апреля 2019

У меня есть следующий код, который отлично работает на 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 Iполучите это ...

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)

У кого-нибудь есть идеи?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

JDK 11 обновлен для использования CLDR v33 (см. Примечания к выпуску: Обновлены данные локали до Unicode CLDR v33 ). CLDR имеет много изменений по сравнению с данными локали JRE, которые использовались по умолчанию в JDK8 и более ранних версиях. Это приводит к исключениям, возникающим при анализе некоторых зависящих от локали полей, которые хорошо работали с предыдущими версиями JDK.

Код в вашем тестовом примере не работает, потому что для локали en_CA с CLDR v33 dayperiod выглядит как 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 при запуске с указанной выше опцией.

0 голосов
/ 03 апреля 2019

Очевидно, что Locale.Canada не работает.

Locale.US и Locale.ROOT работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...