程序员都应该了解的日历计法:儒略历、格里历和外推格里历

倖福魔咒の 提交于 2020-04-17 14:04:29

【推荐阅读】微服务还能火多久?>>>

阿里云智能数据库事业部 OLAP 平台团队现向 2021 届海内外院校应届毕业生(毕业时间在2020年11月-2021年10月之间)招聘大数据系统工程师,有机会转正,有意请加 iteblog 微信内推。

儒略历(Julian calendar)

儒略历,是格里历(Gregorian calendar)的前身,由罗马共和国独裁官儒略·凯撒采纳埃及亚历山大的希腊数学家兼天文学家索西琴尼计算的历法,在公元前45年1月1日起执行,取代旧罗马历历法的历法。一年设12个月,大小月交替,四年一闰,平年365日,闰年于二月底增加一闰日,年平均长度为365.25日。因为1月1日是罗马执政官上任的日期,故其被订为一年的开始日。由于累积误差随着时间越来越大,1582年后由教宗额我略十三世改良,变为格里历,即沿用至今的公历。

程序员都应该了解的日历:儒略历、格里历和外推格里历
如果想及时了解Spark、Hadoop或者HBase相关的文章,欢迎关注微信公众号: iteblog_hadoop

格里历(Gregorian calendar)

格里历是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,亦是一个被当今国际社会最广泛地使用的历法。由教宗额我略十三世于1582年颁行。公历是阳历的一种,于1912年在中国引进采用,因农历等中国传统历法是阴阳历,故公历在中文中又称阳历、西历、新历、公历。

格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。

格里历的历年平均长度为365.2425日,接近平均回归年的365.242199074日,即每3300年误差一日,也更接近春分点回归年的365.24237日,即每8000年误差一日;而儒略历的历年为365.25日,每128年就误差一日。到1582年时,儒略历的春分日(3月21日)与地球公转到春分点的实际时间已相差10天,令到所算出的复活节日期与实际的春分的间隔逐渐增大,因此,格里历开始实行时,将儒略历1582年10月4日星期四的次日,为格里历1582年10月15日星期五,即有10天被删除,但原星期的周期保持不变。格里历的纪年沿用儒略历,当年定历以耶稣诞生年开始起算(但考证是公元前4年出生,但此记数法沿用至今),称为“公元”。

简单的说我们现在用的日历就是格里历。但是在格里历出现之前使用的是儒略历,而儒略历是单纯的大小月交替,所以 2月是有 31 号的。因为儒略历误差太大,所以后来使用了格里历进行替代。

格里历日期与儒略历日期的差距

根据上面的描述,格里历日期与儒略历日期是存在差距的,具体如下:

  • 1582年:
    • 格里历10月15日,相当于儒略历10月5日,之后的日期:格里历日期减10日等于儒略历日期。
  • 1583年-1699年:格里历日期减10日等于儒略历日期。
  • 1700年(格里历没有闰日,但儒略历有):
    • 2月28日,相当于儒略历2月18日,之前的日期:格里历日期减10日等于儒略历日期。
    • 格里历3月1日,相当于儒略历2月19日,之后的日期:格里历日期减11日等于儒略历日期。
  • 1701年-1799年:格里历日期减11日等于儒略历日期。
  • 1800年(格里历没有闰日,但儒略历有):
    • 格里历2月28日,合儒略历2月17日,之前的日期:格里历日期减11日等于儒略历日期。
    • 格里历3月1日,相当于儒略历2月18日,或之后的日期:格里历日期减12日等于儒略历日期。
  • 1801年-1899年:格里历日期减12日等于儒略历日期。
  • 1900年(格里历没有闰日,但儒略历有):
    • 格里历2月28日,合儒略历2月16日,之前的日期:格里历日期减12日等于儒略历日期。
    • 格里历3月1日,相当于儒略历2月17日,或之后的日期:格里历日期减13日等于儒略历日期。
  • 1901年-2099:格里历日期减13日等于儒略历日期。
  • 2100年(格里历没有闰日,但儒略历有):
    • 格里历2月28日,相当于儒略历2月15日,之前的日期:格里历日期减13日等于儒略历日期。
    • 格里历3月1日,合儒略历2月16日,或之后的日期:格里历日期减14日等于儒略历日期。

外推格里历(Proleptic Gregorian calendar)

在格里历是在1582年10月15日正式启用的,那如果我们想用格里历表示这时间之前的日期,那就是外推格里历了。

和编程的关系

前面说了这么多,和我们编程有什么关系呢?其实是有关系的,在 Java 中,java.util.GregorianCalendar 类就是支持儒略历(Julian calendar)和格里历(Gregorian calendar)的(参见 GregorianCalendar)。在格里历执行之前的日期,java.util.GregorianCalendar 类是使用儒略历表示的。

而 JDK 8 引入的 java.time.chrono.IsoChronology 是基于外推格里历(Proleptic Gregorian calendar)实现的,是基于 ISO-8601 标准,是事实上的世界日历,参见(IsoChronology)。

本文参考:
儒略历:https://zh.wikipedia.org/wiki/%E5%84%92%E7%95%A5%E6%9B%86
格里历:https://zh.wikipedia.org/wiki/%E6%A0%BC%E9%87%8C%E6%9B%86

本博客文章除特别声明,全部都是原创!
转载本文请加上:转载自过往记忆(https://www.iteblog.com/)
本文链接: 【程序员都应该了解的日历计法:儒略历、格里历和外推格里历】(https://www.iteblog.com/archives/9798.html)

喜欢 (0) 分享 (0)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!