Локализовать строку из классов MonthDay или YearMonth в java.time?

Классы java.time, встроенные в Java 8 и более поздние версии, предлагают классы MonthDay и YearMonth. Их методы toString и parse используют стандартные форматы ISO 8601 (--MM-DD и YYYY-MM), что является разумным.

Для представления людям стандартные форматы могут оказаться непригодными. Есть ли способ генерировать автоматически локализованную строку для представления значений в объектах либо MonthDay, либо YearMonth?

Например, в Соединенных Штатах пользователям обычно может потребоваться MM/DD для месяца и MM/YY за год-месяц. В то время как в Великобритании пользователям может понадобиться DD/MM для месяца.

В любом случае, чтобы автоматизировать такие изменения Locale, а не явно определять шаблоны форматирования?


Я попробовал следующий код, используя формат, ориентированный на дату.

Locale l = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.SHORT ).withLocale ( l );

YearMonth ym = YearMonth.of ( 2017 , Month.JANUARY );
MonthDay md = MonthDay.of ( Month.JANUARY , 29 );

String outputYm = ym.format ( f );
String outputMd = md.format ( f );

Этот код выходит из строя, вызывая исключение при использовании для YearMonth или MonthDay.

Для YearMonth:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth
    at java.time.YearMonth.getLong(YearMonth.java:494)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at java.time.YearMonth.format(YearMonth.java:1073)
    at javatimestuff.App.doIt(App.java:56)
    at javatimestuff.App.main(App.java:45)

Для MonthDay:

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.MonthDay.getLong(MonthDay.java:451)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at java.time.MonthDay.format(MonthDay.java:646)
    at javatimestuff.App.doIt(App.java:57)
    at javatimestuff.App.main(App.java:45)
1
задан Basil Bourque 25 янв. '17 в 3:54
источник поделиться
1 ответ

См. JDK-8168532. В JDK требуется усовершенствование.

Можно работать за пределами JDK, но это большая работа. Вы должны разбирать XML файлы CLDR (которые взаимосвязаны и имеют много ссылок). Затем вы извлекаете соответствующие локализованные шаблоны для MonthYear и YearMonth. Затем эти шаблоны можно использовать для создания DateTimeFormatter.

В качестве альтернативы вы можете жестко скопировать карту - Map<Locale, DateTimeFormatter> - исходя из потребностей вашего бизнеса.

2
ответ дан JodaStephen 25 янв. '17 в 14:13
источник поделиться

Другие вопросы по меткам или Задайте вопрос