PHP DateTime类计算早于改历时间的坑

时间戳只能计算 1970 年后的时间,由于需要计算更早的日期,发现 PHP 还有提供一个 DateTime类,但在使用中发现有问题。

1582年,因为旧历精度问题,导致已经积累了十天的偏差,,所以此年10月5号~10月14号跳过,10月4号之后直接是10月15号,同时修个置闰规则,成为如今使用的格里高利历。

现行公历(拉丁语:Calendarium Gregorianum,又译格里历、国瑞历、额我略历、格列高利历、格里高利历、葛瑞格里历、格列高历,也称基督历),是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,由罗马大公教会教宗格列高利十三世在1582年颁行。
格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。
格里高利历

问题出在1582年之前,之前应该是使用旧历,也就是儒略历,主要差异在置闰方法不同。
但PHP的DateTime类计算依然是按新历计算(或者说计算时早于改历不会自动换算成儒略历),所以导致1300年之类整百年的时候,二月日期不对,实际传入这天时,会自动换算成3月1号,diff计算天数差,也会有错误。

并且在实际使用中,早于改历之前的时间并没用格里历表式的习惯,都是换成儒略历表达,所以DateTime类这样的设计,等于说早于改历的时间基本不能用的,还是得自己另外处理一遍。(其他语言像是C#提供的历法计算似乎也存在类似情况)。

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

还有一个细节就是,儒略历定制于公元前45年,是大小月交替的,但在5世纪的时候,有一次历法改革,改变了月份划分不是规律的大小月交替了(现行日历样式),资料上说明并不是很清楚,这点很容易遗漏(我也是请教了一下才发现这问题..)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值