JDK синтаксический анализ даты DayOfWeek в немецком языке, java8 vs java9
Я пробовал некоторый код в Java 8 (1.8.0_77) и Java 9 (Java HotSpot (TM) 64-разрядный сервер VM (сборка 9 + 181, смешанный режим))
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN);
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from);
System.out.println("mo = " + mo);
Я не слишком хорошо разбираюсь в деталях этих классов, но в Java 8 это работает, печать:
mo = ПОНЕДЕЛЬНИК
В Java 9, однако, он терпит неудачу
Исключение в потоке "main" java.time.format.DateTimeParseException: текст 'Mo' не может быть проанализирован с индексом 0 в java.base/java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java:1988) в java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1890) в день .main(day.java:10)
Любые идеи, воспроизводится ли это?
поэтому при формировании:
используя этот код:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN);
String format = dtf.format(DayOfWeek.MONDAY);
System.out.println("format = " + format);
jdk1.8.0-77:
format = Mo
jdk-9 (сборка 9 + 181)
format = Mo.
Ответы
Ответ 1
Это похоже на java-9 из-за текущей реализации CLDR date-time-patterns с реализацией JEP - 252, в котором говорится, что
Использовать данные локали из общих данных локали Unicode Consortium Репозиторий (CLDR) по умолчанию.
Локализованные шаблоны для форматирования и перевода дисплея строки, такие как имя локали, могут быть разными в некоторых локалях.
Чтобы включить поведение, совместимое с JDK 8, установите систему свойство java.locale.providers
до значения с COMPAT перед CLDR.
И чтобы добавить вторую часть данных, международные компоненты для Unicode в немецком языке, который имеет следующая релевантная информация может оправдать, что поведение является преднамеренным -
![введите описание изображения здесь]()
Изменить/Примечание. Как указано в @ManiGrover, руководство по миграции содержит аналогичное предупреждение для таких реализаций -
Если ваше приложение запускается успешно, внимательно посмотрите на свои тесты и убедитесь, что поведение такое же, как на JDK 8. Например, несколько ранних усыновителей заметили, что их даты и валюты отформатирован по-разному. См. Использовать локальные данные CLDR по умолчанию.
Ответ 2
Аббревиатуры "Мо", "Ди" и т.д. без точки не исчезли в CLDR, но доступны через автономный режим. Вы должны изменить свой шаблон, используя символ одиночного формата "c" вместо "e" :
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ccc", Locale.GERMAN);
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from);
В самом деле, я рассматриваю изменение базовых данных как нарушение обратной совместимости (конкретный как поведенческий разрыв).