#include <stdio.h>

#include <stdlib.h>

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日的间隔天数。

测试运行结果:

7

11

稍微改进一下,让其变得更好用一点:

#include <stdio.h>

#include <stdlib.h>



// 将日期转换为天数后作差即为两日期相距天数

int day_diff(int *pDate1, int *pDate2)

{

int y2, m2, d2;

int y1, m1, d1;



m1 = (pDate1[1] + 9) % 12;

y1 = pDate1[0] - m1/10;

d1 = 365*y1 + y1/4 - y1/100 + y1/400 + (m1*306 + 5)/10 + (pDate1[2] - 1);



m2 = (pDate2[1] + 9) % 12;

y2 = pDate2[0] - m2/10;

d2 = 365*y2 + y2/4 - y2/100 + y2/400 + (m2*306 + 5)/10 + (pDate2[2] - 1);



return (d2 - d1);

}





// 将字符串日期转换为整数

void datetointeger(char *pDate, int *pInteger)

{

char *pYear = &pDate[0];

char *pMonth = &pDate[5];

char *pDay = &pDate[8];

    

pInteger[0] = atoi(pYear);

pInteger[1] = atoi(pMonth);

pInteger[2] = atoi(pDay);

}





int main(void)

{

char date1[] = "2013-09-16";

char date2[] = "2014-09-16";

int arr1[3] = {0};

int arr2[3] = {0};



datetointeger(date1, arr1);

datetointeger(date2, arr2);



printf("pYear1:%d, pMonth1:%d, pDay1:%d\n", arr1[0], arr1[1], arr1[2]);

printf("pYear2:%d, pMonth2:%d, pDay2:%d\n", arr2[0], arr2[1], arr2[2]);



printf("date2 - date1 = %d天\n", day_diff(arr1, arr2));



return 0;

}



输出结果如下:

pYear1:2013, pMonth1:9, pDay1:16

pYear2:2014, pMonth2:9, pDay2:16

date2 - date1 = 365天

C语言计算日期间隔天数的经典算法解析的更多相关文章

  1. presto计算日期间隔天数或者小时间隔——date_diff函数使用

    “Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.”,亲身用过之后,觉得比hive快了10倍不止. ...

  2. C语言计算两个日期间隔天数

    在网上看到了一个C语言计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙. 先直接代码吧 #include <stdio.h> #include <stdlib.h> in ...

  3. MYSQL如何计算两个日期间隔天数

    如何透过MYSQL自带函数计算给定的两个日期的间隔天数   有两个途径可获得   1.利用TO_DAYS函数   select to_days(now()) - to_days('20120512') ...

  4. js计算日期相差天数

    日期不能直接相加减比较大小,需要转换一下然后计算最后转换成天,当然,你也可以根据同样类似的方法去转换成小时,或者月,年. function DateDiff(sDate1, sDate2) { //s ...

  5. JavaScript计算日期间隔以及结果错误(少一天)的解决方法

    下面的代码是之前从网上某个地方COPY下来的,之前一直用着,前段时间DateDiff()方法突然出问题了,输入两个日期2015-10-01 和 2015-10-02之后,计算出来的日期是0!如果只有几 ...

  6. JS计算日期加天数后的日期(起始日期+有效天数=截至日期)

    /** * 优惠券有效期 * startDate:起始日期 * valueTime:有效天数 */ function transferCouponValueTime(startDate,valueTi ...

  7. python 计算日期间隔

    from datetime import date a = date(2011,11,24) b = date(2011,11,17) print(a-b)

  8. php 计算两个日期的间隔天数

    使用php内部自带函数实现 1.使用DateTime::diff 实现计算 参考阅读>>PHP DateTime::diff() 上代码: <?php $start = " ...

  9. C#经典算法实践,回顾往生,更是致敬《算法导论》

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/666 访问. 概述 本系列博文将会向大家介绍本人在钻研<算法导论 ...

随机推荐

  1. BAPI LIST

    [转自 http://blog.csdn.net/minsenwu/article/details/8432081] 库存管理BAPI 库存: 1. BAPI_MATERIAL_AVAILABILIT ...

  2. 分析DNS解析时间

    提高网页的打开速度,一般地我们会选择使用CDN,利用“就近原则”让用户在最短的时间内获取到服务器资源,实际应用当中采用CDN的方式提高网站访问速度的效果也是最明显的.这也就是为什么国外的空间打开速度远 ...

  3. pycharm ctrl+滚轮调节字体大小

    File --> Setting --> Editor --> General --> 勾选Change font size (zoom) with Ctrl+Mouse Wh ...

  4. UML建模:学习笔记(1)

    UML:学习笔记(1) 事物 结构事物 类: 接口: 协作:(定义元素之间的相互作用) 用例:(在系统外部和系统交互的人) 组件:(描述物理系统的一部分) 节点:(一个节点可以被定义为运行时存在的物理 ...

  5. Eclipse快捷键与Notepad++ 快捷建冲突的问题

    notepad++添加了zen coding插件以后,notepad++默认的快捷键中Alt+/也是其快捷键中的一个,表示toggle comment,而用myeclipce或eclipse的朋友都知 ...

  6. hadoop集群增加新节点

    上次hadoop集群一块数据盘报警, 提交工单后维修人员更换硬盘 服务器是dell r720的, 8盘位, 蛋疼的是这些硬盘都是做的单盘raid1,维修人员说必须关机导入硬盘才能正常使用 (服务器就这 ...

  7. 剑指offer之 数值的整数次方

    问题描述:实现函数double power(double base,int exponent),求base的exponent次方.不能使用库函数,同时不需要考虑大数问题. package Proble ...

  8. Linux学习之CentOS(一)--CentOS6.6下Mysql数据库的安装与配置

    在这里我是通过yum来进行mysql数据库的安装的,通过这种方式进行安装,可以将跟mysql相关的一些服务.jar包都给我们安装好,所以省去了很多不必要的麻烦!!! [root@larry ~]# c ...

  9. UOJ136 开学前的作文

    描述 红包是一个萌萌的男孩子. 红包由于 NOI 惨挂,直到前不久依然无心写作业.如今快开学了,他决定好好完成作业. 对于可以交电子稿的作文,红包有特殊的完成技巧,大致流程是依次选中一段内容→按下 C ...

  10. C++(八)— 死锁原因及解决方法

    1.死锁原因 死锁问题被认为是线程/进程间切换消耗系统性能的一种极端情况.在死锁时,线程/进程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是任务永远无法执行完成. 打个比方,假设有 ...