如何将公历转换为中国农历?

How convert Gregorian to Chinese Lunar Calendar?

我想构建一个 android 应用程序,将公历转换为中国农历。

我不知道如何从公历转换为中国历。我该怎么做?

你可以试试: http://www.docjar.com/html/api/com/ibm/icu/util/ChineseCalendar.java.html

有一个构造函数:

public ChineseCalendar(Date date) ...

链接:

十二月:http://icu-project.org/apiref/icu4j/com/ibm/icu/util/ChineseCalendar.html

来源:http://site.icu-project.org/download

从公历到中文的转换

我刚刚发布了一个新版本的Time4J(v4.35,但使用Time4A-v3.40-2018b on Android) which supports the Chinese calendar。从公历到中国阴阳历的转换可以直接完成:

PlainDate gregorian = PlainDate.nowInSystemTime(); // 2018-03-07
ChineseCalendar cc = gregorian.transform(ChineseCalendar.axis());
System.out.println(cc); // chinese[wu-xu(2018)-1-21]

中国日历的文档还包含如何以多种本地化方式格式化或解析它的示例。

Android

显示器的特殊设计要求

另请注意,中国历法包含公历中不存在的元素,例如循环年闰月节气(我们的天文季节的概括)。 Time4J/A 可以格式化它,但它是特定于日历的。如果您考虑过普遍适用于所有日历的通用日历显示,这就是相关的。最好在 Android 上针对农历做一个特定的显示,这样其他重要信息,如文本形式的循环年或节气,也仍然可以显示。

与ICU4J的比较

主要区别:

  • API-style:ICU4J 采用了 java.util.Calendar 的旧世界,而 Time4J/A 遵循 domain-driven 方法
  • 不可变特性(ICU4J-calendar-class 与 Time4J/A 相比并非不可变)
  • 节气(ICU4J好像没有支持这个功能)
  • 准确性(ICU4J 使用基于 Peter Duffet/Smith 的书的天文学模块,而 Time4J/A 主要基于 Jean Meeus 的工作)

虽然有些人仍然喜欢ICU4J的old-fashioned-style,但我最担心的是ICU4J的准确性。作为参考,大家可以看看Hongkong observatory公布的2018年的数据。ICU4J在2018-11-07就已经和香港的数据有偏差了(整整一个月,日期错了一天!)。使用以下代码证明:

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

又见旧的unsolved issue on the bug-tracker of ICU4J,以后的很多日期都是错误的。当然,天文计算不能严格预测未来,但第一个 Time4J/A 偏离香港数据的日期是 2057 年(按当地午夜后仅 37 秒计算),而不是现在的 2018 年就像在 ICU4J 中一样。所以我建议不要使用 ICU4J,只要他们没有更正他们的天文模块,甚至不能正确计算实际年份。

在遥远的未来现实中,我们不知道谁对 2057 年是正确的,甚至香港天文台在这个日期也明确不确定:

If the time of new moon (first day of the lunar month) or solar term is close to midnight, the dates of the relevant lunar month or solar term in the "Conversion Table" may have a discrepancy of one day. Such situation will occur on the new moons on 28 September 2057 [...]