C语言计算日期间隔天数的经典算法解析
概览
在网上看到了一个计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙。
先直接代码吧
|
|
算法解析
该算法总体思想是计算给定日期到 0年3月1日 的天数,然后相减,获取天数的间隔。
m1 = (month_start + 9) % 12;
用于判断日期是否大于3月(2月是判断闰年的标识),还用于记录到3月的间隔月数。
y1 = year_start - m1/10;
如果是1月和2月,则不包括当前年(因为是计算到0年3月1日的天数)。
d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);
其中 365*y1
是不算闰年多出那一天的天数,
y1/4 - y1/100 + y1/400
是加所有闰年多出的那一天,
(m2*306 + 5)/10
用于计算到当前月到3月1日间的天数,306=365-31-28
(1月和2月),5是全年中不是31天月份的个数
(day_start - 1)
用于计算当前日到1日的间隔天数。
测试运行结果
- 原文链接:https://www.gocode.top/post/2015/02/07/linux-c-day-diff/
- 版权声明:本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,转载请注明出处(作者「阿然」,原文链接)。