设为首页 加入收藏

TOP

C语言计算日期间隔天数的经典算法解析
2015-03-04 22:51:49 来源: 作者: 【 】 浏览:41
Tags:语言 计算 日期 间隔 天数 经典 算法 解析

在网上看到了一个C语言计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙。


先直接代码吧


#include
#include


int day_diff(int year_start, int month_start, int day_start
? ?, int year_end, int month_end, int day_end)
{
?int y2, m2, d2;
?int y1, m1, d1;
?
?m1 = (month_start + 9) % 12;
?y1 = year_start - m1/10;
?d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (day_start - 1);


?m2 = (month_end + 9) % 12;
?y2 = year_end - m2/10;
?d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (day_end - 1);
?
?return (d2 - d1);
}


int main(void)
{
?printf("%d\n", day_diff(2015, 1, 1, 2015, 1, 8));
?printf("%d\n", day_diff(2015, 1, 29, 2015, 2, 9));
?
?return 0;
}


算法解析


该算法总体思想是计算给定日期到 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日的间隔天数。


测试运行结果:




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇编程基本功触类旁通 下一篇Linux C ftruncate 函数清空文件..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: