Как отобразить общую эру ( "CE" ) в Java-8?
Следующий код не печатает "CE" или "Current Era":
System.out.println(IsoEra.CE.getDisplayName(TextStyle.SHORT, Locale.UK)); // output: AD
System.out.println(IsoEra.CE.getDisplayName(TextStyle.FULL, Locale.UK)); // output: Anno Domini
Конечно, IsoEra.CE.name()
помогает, но не требуется, если требуется полное отображаемое имя, например "общая эра" или "текущая эра". Я считаю это немного странным, потому что javadoc IsoEra
явно упоминает термин "Текущая эра" в своем описании класса. Он даже не работает для корневого языка. Здесь используется прецедент с нерелигиозным фоном.
Это тоже не помогает:
LocalDate date = LocalDate.now();
String year = date.format(DateTimeFormatter.ofPattern("G yyyy", Locale.UK)); // AD 2015
System.out.println(year);
Единственный способ, которым я нашел, был:
TextStyle style = ...;
Map<Long,String> eras = new HashMap<>();
long bce = (long) IsoEra.BCE.getValue(); // 0L
long ce = (long) IsoEra.CE.getValue(); // 1L
if (style == TextStyle.FULL) {
eras.put(bce, "Before current era");
eras.put(ce, "Current era");
} else {
eras.put(bce, "BCE");
eras.put(ce, "CE");
}
DateTimeFormatter dtf =
new DateTimeFormatterBuilder()
.appendText(ChronoField.ERA, eras)
.appendPattern(" yyyy").toFormatter();
System.out.println(LocalDate.now().format(dtf)); // CE 2015
Есть ли лучший или более короткий способ?
Ответы
Ответ 1
Нет, нет лучшего способа сделать это!
Объяснение: "Текущая эра" (и accoridngly "до текущей эры" ) - это "название поля" (абстракция/мета) стандарта ISO. Конечно, для этих полей также существует нет (стандартизованный) перевод по стране, и нет шаблона, который печатает этот результат. (По стандарту они ссылаются только на английском языке и по jdk соответственно только как CE, BCE
). Итак, что показывает исходный вывод:
AD
Anno Domini
является правильным, а ISO-совместимый (английский) перевод эпохи (даты, которая является "в текущую эпоху" ).
Чтобы решить эту проблему, я абсолютно согласен с вашим подходом (форматирования пользовательских дат) и углубляюсь в детали: я бы не стал осмеливаться менять одну строку!
Единственный потенциал экономии, который я вижу, заключается в "инициализации" (возможно, с помощью EnumMap для TextStyles... и... сколько языков вы хотите поддерживать?).. и "путем рефакторинга".
Благодарим вас за интересную "проблему" и предоставим ей решение!