求天数类题很好用的一个公式

式子求的是y年m月d日距离公元第一天(即1年1月1日)的天数。

int get(int y,int m,int d){
    if(m<3){
        --y;
        m+=12;
    }
    return 365*y+y/4 - y/100+y/400+(153*m - 457)/5+d - 306;

推导:

首先,每一年的“基础天数”为 y∗365 天

接着考虑闰年对年份的影响:每四年一个闰年,每一百年少一个闰年,每四百年多扣除了一天,于是修正的天数为 y÷4−y÷100+y÷400

最后,也是最麻烦的地方,我们需要判断2月在平闰年对天数的影响状况,这里列出几个式子:

31+30+31+30+31=153

457−365=92457−365=92

92=31+30+3192=31+30+31

365−31−28=306365−31−28=306

根据容斥原理,我们需要作出以下修正:

(153∗m−457)/5+d−306(153∗m−457)/5+d−306

于是,最终结果长成:

365∗y+y/4−y/100+y/400+(153∗m−457)/5+d−306

利用上面的公式,我们就可以计算出某一个日期距离公元第一天的天数之差,如果要计算两个日期之差分别计算相减即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学算法的懒羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值