如何将格里高利转换为中国农历?

时间:2015-03-08 04:48:56

标签: java android calendar

我想使用阳历来制作一个Android应用程序到中国农历。

我不知道如何从格里高利转换为中国日历。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

从格里高利转换为中文

我刚发布了一个新版本的Time4J(v4.35,但在Android上使用Time4A - v3.40-2018b),它支持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上显示的特殊设计要求

请记住,中国日历包含格里历中不存在的元素,例如循环年闰月节气< / strong>(我们的天文季节的概括)。 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的准确性。作为参考,您可以观看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年,甚至香港天文台在这个日期也明确不确定:

  

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