Men*_*ild 13 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
Run Code Online (Sandbox Code Playgroud)
当然,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);
Run Code Online (Sandbox Code Playgroud)
我找到的唯一方法是:
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
Run Code Online (Sandbox Code Playgroud)
有没有更好或更短的方式?
不,没有更好的办法了!
说明:“当前时代”(以及相应的“当前时代之前”)是 ISO 标准的“字段名称”(抽象/元)。当然,这些字段也没有(标准化的)国家/地区特定翻译,也没有打印此输出的模式。(根据标准,它们仅以英文引用,而 jdk 仅分别引用为CE, BCE)。那么原始输出显示的是:
AD
Anno Domini
Run Code Online (Sandbox Code Playgroud)
是正确的,并且该时代的 ISO 符合(英语)翻译(“当前时代”的日期)。
为了解决这个问题,我绝对同意你的方法(自定义日期格式),并更深入地了解细节:我不敢更改其中的一行!
我看到的唯一节省潜力是“初始化”(也许使用 EnumMap 作为 TextStyles...以及...您想要支持多少种语言?)...以及“通过重构”。
感谢您提出有趣的“问题”,并提供解决方案!