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

时间:2015-04-07 14:36:20

标签: java java-8 java-time

以下代码不会打印“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

当然,IsoEra.CE.name()会有所帮助,但如果需要完整的显示名称,如“普通时代”或“当前时代”,则会有所帮助。我认为这有点奇怪,因为IsoEra的javadoc在其类描述中明确提到了“当前时代”一词。它甚至不适用于根区域设置。这里的用例是为非宗教背景的客户提供服务。

这也没有用处:

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 个答案:

答案 0 :(得分:1)

不,没有更好的方法可以做到!

说明:&#34;当前时代&#34; (以及#34;在当前时代之前#34;)是ISO标准的字段&#34;(摘要/元)的名称。当然,这些字段还有 no (标准化)国家/地区特定翻译,并且没有打印此输出的模式。(按标准,它们仅以英文引用,而jdk仅分别作为{{1引用}})。那么原始输出显示了什么:

CE, BCE

是正确的,并且是时代的ISO符合(英语)翻译(在当前时代的#34;和#34;)。

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

我看到的唯一节省潜力是&#34;初始化&#34;(也许使用EnumMap for TextStyles ...以及...你想支持多少种语言?)..和&#34 ;通过重构&#34;。

感谢您提出有趣的问题&#34;并为其提供解决方案!