1 回答
TA贡献1799条经验 获得超9个赞
简短的解决方案:
我建议使用能够处理中国日历的专用格式引擎,而不是尝试依赖toString()
诸如此类的各种类型的方法。CyclicYear
Time4J 有自己的基于ChronoFormatter类的格式引擎:
ChineseCalendar obj = PlainDate.nowInSystemTime().transform(ChineseCalendar.axis());
ChronoFormatter<ChineseCalendar> f =
ChronoFormatter.ofPattern(
"d/M/U(r)",
PatternType.CLDR,
Locale.ROOT,
ChineseCalendar.axis());
System.out.println(f.print(obj));
// output today: 1/9/ji-hai(2019)
图案与中国年:
我使用了模式“d/M/U(r)”。中国历法的“正常”年份是由 CLDR 图案符号“U”表示的循环年。循环年在 60 年后重复,开始新的循环。年份的任何其他定义显然都是不寻常的。这可能会让西方用户感到惊讶,因为他们经常期望以向前的方式计算任何类型的预兆年份。但是,Time4J 还支持其他两种类型的年份。其中一个是现在仅具有历史意义的时代年份。另一种类型的年份是相关的公历年份(使用模式符号“r”)。其主要目的只是为了使循环年份明确。因此,许多人喜欢将中国年份构造为循环年份和相关公历年份的组合,形式如下:
U(r) or r(U)
甚至可以确定十二年后重复出现的十二生肖。假设您有一个中国日历对象,您可以通过以下方式确定十二生肖:
String zodiac = obj.getYear().getZodiac(Locale.ENGLISH);
System.out.println("Year of " + zodiac); // Year of Pig
反向方式(解析并转换为公历):
只需使用上面定义的格式化程序,然后解析:
PlainDate gregorian = f.parse("1/9/ji-hai(2019)").transform(PlainDate.axis());
System.out.println(gregorian); // output: 2019-09-29
关于转录:
我使用根区域设置来构建格式化程序。它以简单的拉丁字母生成循环年份,没有任何变音符号。如果您可能想使用官方拼音转录,您可以应用英语区域设置。循环年份将显示为“jǐ-hài”。中文(韩语和日语也使用相同的脚本)、越南语和俄语支持使用其他文字的特殊转录。
Time4J 的 API 文档可以在网上找到。该文档已经包含格式化和解析中国日历的示例。但我欢迎任何进一步的贡献或改进它的具体建议。
添加回答
举报