从公历到中文的转换
我刚刚发布了Time4J的新版本(v4.35,但是使用Time4A https://github.com/MenoData/Time4A-v3.40-2018b(Android 上)),支持农历 http://time4j.net/javadoc-en/net/time4j/calendar/ChineseCalendar.html。从公历到中国阴阳历的转换可以直接完成:
PlainDate gregorian = PlainDate.nowInSystemTime(); // 2018-03-07
ChineseCalendar cc = gregorian.transform(ChineseCalendar.axis());
System.out.println(cc); // chinese[wu-xu(2018)-1-21]
中国日历的文档还包含如何以多种本地化方式格式化或解析它的示例。
Android 上显示的特殊设计要求
另请记住,中国历法包含公历中不存在的元素,例如循环年, 闰月 or 节气(我们天文季节的概括)。 Time4J/A 可以对其进行格式化,但它是特定于日历的。如果您考虑过通用日历显示,该显示应普遍适用于所有日历,那么这是相关的。最好在 Android 上为农历做一个特定的显示,这样其他重要信息(例如文本形式的循环年或节气)仍然可以显示。
与 ICU4J 的比较
主要区别:
- API 风格:ICU4J 采用了旧世界
java.util.Calendar
而 Time4J/A 遵循领域驱动的方法
- 不变性功能(与 Time4J/A 相比,ICU4J 日历类不是不变的)
- 节气(ICU4J好像不支持这个功能)
- 准确性(ICU4J使用基于Peter Duffet/Smith的书的天文学模块,而Time4J/A主要基于Jean Meeus的工作)
虽然有些人仍然喜欢 ICU4J 的老式风格,但我最担心的是 ICU4J 的准确性。作为参考,您可以观看发布的数据香港天文台 http://www.hko.gov.hk/gts/time/calendar/pdf/2018e.pdf2018年。ICU4J在2018年11月7日就已经与香港数据有偏差(整整一个月,日期误差了一天!)。使用以下代码证明:
DateFormat df =
DateFormat.getDateInstance(
DateFormat.FULL,
ULocale.forLanguageTag("en-u-ca-chinese"));
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
sf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
ChineseCalendar cc = new ChineseCalendar(78, 35, 0, 0, 1);
System.out.println(df.format(cc.getTime())); // Friday, First Month 1, 2018(wu-xu)
for (int i = 0; i < 13; i++) {
cc.add(Calendar.MONTH, 1);
System.out.print(df.format(cc.getTime()));
System.out.println("=>" + sf.format(cc.getTime()));
}
输出(注意11月份的行):
Saturday, Second Month 1, 2018(wu-xu)=>2018-03-17
Monday, Third Month 1, 2018(wu-xu)=>2018-04-16
Tuesday, Fourth Month 1, 2018(wu-xu)=>2018-05-15
Thursday, Fifth Month 1, 2018(wu-xu)=>2018-06-14
Friday, Sixth Month 1, 2018(wu-xu)=>2018-07-13
Saturday, Seventh Month 1, 2018(wu-xu)=>2018-08-11
Monday, Eighth Month 1, 2018(wu-xu)=>2018-09-10
Tuesday, Ninth Month 1, 2018(wu-xu)=>2018-10-09
Wednesday, Tenth Month 1, 2018(wu-xu)=>2018-11-07
Friday, Eleventh Month 1, 2018(wu-xu)=>2018-12-07
Sunday, Twelfth Month 1, 2018(wu-xu)=>2019-01-06
Tuesday, First Month 1, 2019(ji-hai)=>2019-02-05
Thursday, Second Month 1, 2019(ji-hai)=>2019-03-07
又见旧ICU4J 错误跟踪器上未解决的问题 http://bugs.icu-project.org/trac/ticket/10893,未来还有更多的日期是错误的。当然,天文计算无法以严格的方式预测未来,但 Time4J/A 第一次偏离香港数据的日期是 2057 年(计算为当地午夜后仅 37 秒),而不是像现在这样的 2018 年。 ICU4J。因此,只要 ICU4J 没有更正其天文学模块,甚至无法正确反映实际年份,我就会建议不要使用 ICU4J。
现实地说,在遥远的未来,我们不知道 2057 年谁是正确的,甚至香港天文台在这个日期也明确不确定:
如果是新月(农历初一)或节气的时间
接近午夜时,相关农历月或阳历的日期
“换算表”中的术语可能存在一天的差异。这样的
这种情况将发生在 2057 年 9 月 28 日的新月 [...]