У меня есть код и тестовый файл в устаревшем приложении, которое можно суммировать следующим образом:
@Test
public void testParseDate() throws ParseException {
String toParse = "Mo Aug 18 11:25:26 MESZ +0200 2014";
String pattern = "EEE MMM dd HH:mm:ss z Z yyyy";
DateFormat dateFormatter = new SimpleDateFormat(pattern, Locale.GERMANY);
Date date = dateFormatter.parse(toParse);
//skipped assumptions
}
Этот тест проходит в Java 8 и ниже. Однако с Java 10 вверх это приводит к java.text.ParseException: Unparseable date: "Mo Aug 18 11:25:26 MESZ +0200 2014"
.
Для записи: кроме de_DE
, исключение также выбрасывается для локалей de_CH
, de_AT
, de_LU
.
Мне известно о том, что форматирование даты было изменено с помощью JDK 9 (JEP 252). Тем не менее, я считаю, что это разрушительное изменение, нарушающее обратную совместимость. Выдержки:
В JDK 9 данные репозитория данных общего хранилища данных (CLDR) Unicode включены в качестве данных локали по умолчанию, поэтому вы можете использовать стандартные данные локали без каких-либо дальнейших действий.
В JDK 8, хотя локальные данные CLDR в комплекте с JRE, по умолчанию он не включен.
Код, который использует службы, зависящие от языка, такие как форматирование даты, времени и числа, может давать разные результаты с данными локали CLDR.
Добавление .
для дня недели (Mo.
) компенсирует это, и тест пройдет. Однако это не является реальным решением для старых данных (в сериализованном виде, таком как XML).
Проверка этого qaru.site/info/387464/..., мне кажется, что поведение является намеренным для немецкой локализации и может быть смягчено путем указания java.locale.providers
с COMPAT
режимом. Однако мне не нравится идея полагаться на некоторое значение свойства системы по двум причинам:
- изменение в следующих выпусках JDK.
- быть забытым в разных средах.
Мой вопрос:
- Как я могу поддерживать обратную совместимость старого кода с этим конкретным шаблоном даты, без повторной записи/изменения существующих сериализованных данных или добавления/изменения системных свойств (например,
java.locale.providers
), которые могут быть забыты в разных средах (серверы приложений, автономные банки,...)?