式子求的是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
利用上面的公式,我们就可以计算出某一个日期距离公元第一天的天数之差,如果要计算两个日期之差分别计算相减即可