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

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

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

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

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

而且在实际使用中,早于改历以前的时间并没用格里历表式的习惯,都是换成儒略历表达,因此DateTime类这样的设计,等于说早于改历的时间基本不能用的,仍是得本身另外处理一遍。(其余语言像是C#提供的历法计算彷佛也存在相似状况)。方法

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

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

相关文章
相关标签/搜索