#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.
. Итак, здесь есть два варианта :
-
Обновите код, чтобы использовать формат, указанный
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); }
-
Используйте переключатель совместимости
-Djava.locale.providers=COMPAT
, который поддерживает данные локали в комплекте сJRE
, которые использовались по умолчанию вJDK8
и более ранних версиях."8:00AM"
будет правильно проанализирован сJDK12
при запуске с опцией, упомянутой выше.
Ответ №2:
По-видимому, Locale.Канада не работает.
Язык.US и Locale.ROOT действительно работает.