Это означает, что начиная с Java 16 в Locale.UK короткое имя теперь «Сентябрь».
Это хорошо известно - согласно этому вопросу SO, этому отчету об ошибке OpenJDK, даже этому отчету об ошибке CLDR.
Мой вопрос заключается в том, как лучше всего справиться с этим вопросом. это особенно важно, если нет уверенности в том, в каком языковом стандарте будет отформатирована дата. Например, я имею дело с поставщиком данных, который предоставляет даты в формате дд/МММ/гггг, но иногда мы получаем короткие названия месяцев в США, например «сентябрь»; а в других случаях мы получаем короткие названия месяцев в Великобритании — например, «Сентябрь».
- Простое решение — найти и заменить:
Код: Выделить всё
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MMM/yyyy").withLocale(Locale.US);
LocalDate date = LocalDate.parse(dateString.replaceAll("Sept", "Sep"), format);
- DateTimeFormatterBuilder — необязательные форматы, каждый из которых указывает локаль:
Примерно так:
Код: Выделить всё
DateTimeFormatter format = new DateTimeFormatterBuilder()
.appendOptional(DateTimeFormatter.ofPattern("dd/MMM/yyyy").withLocale(Locale.US))
.appendOptional(DateTimeFormatter.ofPattern("dd/MMM/yyyy").withLocale(Locale.UK))
.toFormatter()
.withLocale(Locale.US);
LocalDate d = LocalDate.parse(dateString, format);
Я не знаю, является ли это предполагаемым поведением или нет. Я думаю, что Javadocs вводит в заблуждение по этому поводу, поскольку они утверждают:
Форматировщик будет форматировать, если данные доступны для всех полей, содержащихся в нем. Средство форматирования выполнит анализ совпадения строки, в противном случае ошибка не будет возвращена.
К сожалению, этого не происходит. Любой необязательный DateTimeFormatter применяется с общим языковым стандартом, а не с примененным к нему языковым стандартом. Затем, если строка dateString имеет короткий месяц в соответствии с одним из этих языков, но который отличается от языка общего параметра DateTimeFormatter, будет выдано исключение.
- DateTimeFormatter — необязательные символы:
Код: Выделить всё
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd/MMM['t']/yyyy").withLocale(Locale.US);
LocalDate date = LocalDate.parse(dateString, format);
Итак, мои вопросы:
- Как лучше всего настроить DateTimeFormatter, который может обрабатывать короткие названия месяцев в разных локалях, особенно сентябрь в Locale.US и Locale.UK? (Является ли вариант 1. найти/заменить лучшим, что мы можем сделать?)
- В варианте 2. работает ли это так, как задумано? Или мне чего-то не хватает в плане объединения DateTimeFormatters с разными локалями? Это ошибка/недокументированное поведение?
- Для варианта 3. можно ли исключить необязательные символы при печати? (Насколько я понимаю, это не так — см. этот вопрос SO.)
Подробнее здесь: https://stackoverflow.com/questions/798 ... ort-months
Мобильная версия