Следующий код не печатает "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
Есть ли лучший или более короткий способ?