LocalTime.parse ведет себя по-другому в JDK 12

#java #datetime-format #java-12

#java #datetime-формат #java-12

Вопрос:

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

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

Комментарии:

1. Другой язык?

2. Я получаю ту же ошибку в JDK 10.0.1

3. Я попытался явно установить локаль Канада.

4. AM у меня не работает, но am работает — похоже, это зависит от локали

5. Это канадский язык, который поддерживает «AM» (интересно, есть ли франко-канадский язык, который не поддерживает «AM»)

Ответ №1:

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

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

Ответ №2:

По-видимому, Locale.Канада не работает.

Язык.US и Locale.ROOT действительно работает.