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



我想使用格里奥高利历到中国农历构建一个安卓应用程序。

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

从公历到中文的转换

我刚刚发布了支持中国日历的新版本Time4J(v4.35,但在Android上使用Time4A-v3.40-2018b)。从公历到中国阴阳历的转换可以直接完成:

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

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

安卓显示器的特殊设计要求

还要记住,中国历法包含公历中不存在的元素,例如周期年闰月节气(我们天文季节的概括)。Time4J/A 可以格式化它,但它特定于日历。如果您考虑过通用日历显示,这将适用于所有日历,这是相关的。最好在Android上为中国日历制作特定的显示,以便仍然可以显示其他重要信息,例如文本形式的循环年份或节气。

与ICU4J的比较

主要区别:

  • API风格:ICU4J采用了java.util.Calendar的旧世界,而Time4J/A遵循域驱动的方法
  • 不可变性功能(与 Time4J/A 相比,ICU4J-calendar-class 不是不可变的)
  • 节气术语(ICU4J似乎对此功能没有任何支持)
  • 准确性(ICU4J使用基于Peter Duffet/Smith著作的天文学模块,而Time4J/A主要基于Jean Meeus的工作)

虽然有些人仍然喜欢ICU4J的老式风格,但我最担心的是ICU4J的准确性。作为参考,您可以观看香港天文台公布的2018年数据。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错误跟踪器上未解决的旧问题,将来的更多日期都是错误的。当然,天文计算不能严格预测未来,但Time4J/A偏离香港数据的第一个日期是2057年(计算为当地午夜后37秒),而不是像ICU4J那样的2018年。因此,只要ICU4J没有纠正他们的天文学模块,甚至不能正确表示实际年份,我就建议不要使用ICU4J。

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

如果是新月的时间(农历月初一)或节气 接近午夜,相关农历月或太阳的日期 "换算表"中的术语可能有一天的差异。这样 情况将在2057年9月28日的新月上发生[...]

你可以试试: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

最新更新