如何在Java-8中显示通用时代(“CE”)?

2022-09-04 23:33:00

以下代码不打印“CE”或“当前时代”:

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

当然,如果需要完整的显示名称(如“共同时代”或“当前时代”),则无济于事。我认为这有点奇怪,因为javadoc在其类描述中明确提到了术语“当前时代”。它甚至不适用于根区域设置。这里的用例是为具有非宗教背景的客户提供服务。IsoEra.CE.name()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

不,没有更好的方法来做到这一点!

解释:“当前时代”(以及“当前时代之前”)是ISO标准的“字段名称”(抽象/元)。当然,这些字段也没有(标准化的)国家特定翻译,也没有打印此输出的模式。(按照标准,它们仅以英文引用,并且分别由jdk仅作为引用)。那么原始输出显示的内容:CE, BCE

  AD
  Anno Domini

是正确的,并且符合ISO标准的(英语)翻译的时代(日期是“在当前时代”)。

为了解决这个问题,我绝对同意你的方法(自定义日期格式),并深入细节:我不敢改变它的一行!

我看到的唯一节省潜力是在“初始化”中(也许使用EnumMap作为TextStyles......和。。。您要支持多少种语言?..和“通过重构”。

感谢您的有趣“问题”,并提供解决方案!


答案 2

推荐