资讯专栏INFORMATION COLUMN

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

李世赞 / 2499人阅读

摘要:并且在实际使用中,早于改历之前的时间并没用格里历表式的习惯,都是换成儒略历表达,所以类这样的设计,等于说早于改历的时间基本不能用的,还是得自己另外处理一遍。

时间戳只能计算 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世纪的时候,有一次历法改革,改变了月份划分不是规律的大小月交替了(现行日历样式),资料上说明并不是很清楚,这点很容易遗漏(我也是请教了一下才发现这问题..)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25972.html

相关文章

  • php 插入时间 0000解决

    摘要:可以在指定字段的值的时候使用变量来自动插入系统的当前时间。以后任何时间修改表中的记录时,对应记录的值会自动被更新为当前的系统时间。 今天在做php作业的时候插入时间一直都是0000-0000-0000 后来才发现是插入数据库那里少写了一个美元符号$ 真是╮(╯_╰)╭ 不过也查找了一些相关的信息 Unix时间戳 UNIX 时间戳(timestamp)是 PHP 中关于时间日期一个很重...

    novo 评论0 收藏0
  • php 插入时间 0000解决

    摘要:可以在指定字段的值的时候使用变量来自动插入系统的当前时间。以后任何时间修改表中的记录时,对应记录的值会自动被更新为当前的系统时间。 今天在做php作业的时候插入时间一直都是0000-0000-0000 后来才发现是插入数据库那里少写了一个美元符号$ 真是╮(╯_╰)╭ 不过也查找了一些相关的信息 Unix时间戳 UNIX 时间戳(timestamp)是 PHP 中关于时间日期一个很重...

    waltr 评论0 收藏0
  • 如何使用Python+SeaTable实现计算两个工作日天数

      小编写这篇文章的一个主要目的,主要是用来给大家继续讲解关于python的一些实例,比如综合运用Python+SeaTable,运用这个技能,可以实现相关的一些计算技能。比如可以实现连续性的计算两个工作日天数,下面给大家详细解答下。  当我们计算两个日期间的间隔天数时,通常是用结束日期减去开始日期,但在实际的项目管理、任务管理、工作计划等场景中,某些时间段会涉及双休日、法定节假日,甚至还有公司自...

    89542767 评论0 收藏0
  • Java8新特性之日期处理

    摘要:处理日期日历和时间的不足之处将设定为可变类型,以及的非线程安全使其应用非常受限。最完整的日期时间,包含时区和相对或格林威治的时差。获取当前的日期中的用于表示当天日期。 简介 伴随 lambda表达式、streams 以及一系列小优化,Java 8 推出了全新的日期时间API。 Java处理日期、日历和时间的不足之处:将 java.util.Date 设定为可变类型,以及 SimpleD...

    Airy 评论0 收藏0
  • python tips

    摘要:中的可以起到与此处相同的效果判断奇数自然是使用位操作最快了删除要删除的数量较多超多一半的话,建议重新生成如果数量较少,在和都可以的情况下,稍快一些 给dict设置默认值 这样能设置所有key的默认值为[],包括新添的key from collections import defaultdict context = defaultdict(list) setdefault一次只能设置一个...

    fuchenxuan 评论0 收藏0

发表评论

0条评论

李世赞

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<