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

Это похоже на из-за текущей реализации 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);

В самом деле, я рассматриваю изменение базовых данных как нарушение обратной совместимости (конкретный как поведенческий разрыв).