Подтвердить что ты не робот

Как отобразить общую эру ( "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

Есть ли лучший или более короткий способ?

4b9b3361

Ответ 1

Нет, нет лучшего способа сделать это!

Объяснение: "Текущая эра" (и accoridngly "до текущей эры" ) - это "название поля" (абстракция/мета) стандарта ISO. Конечно, для этих полей также существует нет (стандартизованный) перевод по стране, и нет шаблона, который печатает этот результат. (По стандарту они ссылаются только на английском языке и по jdk соответственно только как CE, BCE). Итак, что показывает исходный вывод:

  AD
  Anno Domini

является правильным, а ISO-совместимый (английский) перевод эпохи (даты, которая является "в текущую эпоху" ).

Чтобы решить эту проблему, я абсолютно согласен с вашим подходом (форматирования пользовательских дат) и углубляюсь в детали: я бы не стал осмеливаться менять одну строку!

Единственный потенциал экономии, который я вижу, заключается в "инициализации" (возможно, с помощью EnumMap для TextStyles... и... сколько языков вы хотите поддерживать?).. и "путем рефакторинга".

Благодарим вас за интересную "проблему" и предоставим ей решение!