簡體   English   中英

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

[英]How to display common era (“CE”) in Java-8?

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

當然,如果需要像“common era”或“current era”這樣的完整顯示名稱, 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

有沒有更好或更短的方式?

不,沒有更好的辦法!

說明:“當前時代”(並且當前時代之前)是ISO標准的“字段名稱”(摘要/元)。 當然,這些字段也沒有 (標准化的)國家/地區特定翻譯,也沒有打印此輸出的模式。(按標准,它們僅以英文引用,jdk僅分別作為CE, BCE引用)。 那么原始輸出顯示:

  AD
  Anno Domini

是正確的,以及時代的ISO符合(英語)翻譯(日期是“在當前時代”)。

為了解決這個問題,我完全贊同你的方法(自定義日期格式化),並深入細節:我不敢改變它的一行!

我看到的唯一節省潛力是“初始化”(可能使用了一個用於TextStyles的EnumMap ......以及......你想支持多少種語言?)..和“通過重構”。

感謝您提出有趣的“問題”,並為其提供解決方案!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM