C语言计算日期间隔天数的经典算法解析
#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语言计算日期间隔天数的经典算法解析的更多相关文章
- presto计算日期间隔天数或者小时间隔——date_diff函数使用
“Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.”,亲身用过之后,觉得比hive快了10倍不止. ...
- C语言计算两个日期间隔天数
在网上看到了一个C语言计算日期间隔的方法,咋一看很高深,仔细看更高神,很巧妙. 先直接代码吧 #include <stdio.h> #include <stdlib.h> in ...
- MYSQL如何计算两个日期间隔天数
如何透过MYSQL自带函数计算给定的两个日期的间隔天数 有两个途径可获得 1.利用TO_DAYS函数 select to_days(now()) - to_days('20120512') ...
- js计算日期相差天数
日期不能直接相加减比较大小,需要转换一下然后计算最后转换成天,当然,你也可以根据同样类似的方法去转换成小时,或者月,年. function DateDiff(sDate1, sDate2) { //s ...
- JavaScript计算日期间隔以及结果错误(少一天)的解决方法
下面的代码是之前从网上某个地方COPY下来的,之前一直用着,前段时间DateDiff()方法突然出问题了,输入两个日期2015-10-01 和 2015-10-02之后,计算出来的日期是0!如果只有几 ...
- JS计算日期加天数后的日期(起始日期+有效天数=截至日期)
/** * 优惠券有效期 * startDate:起始日期 * valueTime:有效天数 */ function transferCouponValueTime(startDate,valueTi ...
- python 计算日期间隔
from datetime import date a = date(2011,11,24) b = date(2011,11,17) print(a-b)
- php 计算两个日期的间隔天数
使用php内部自带函数实现 1.使用DateTime::diff 实现计算 参考阅读>>PHP DateTime::diff() 上代码: <?php $start = " ...
- C#经典算法实践,回顾往生,更是致敬《算法导论》
该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/666 访问. 概述 本系列博文将会向大家介绍本人在钻研<算法导论 ...
随机推荐
- JDK动态代理连接池
JDK动态代理 1 什么是JDK动态代理 刚刚写ItcastConnection时爽么?因为Connection中的方法太多了,每个都要写,所以很累吧.累点到是没什么,可以完成功能就是好的.但是不 ...
- mysql管理工具之pt-heartbeat
之前我一直用Seconds_behind_master来衡量主从的延迟,今天看到文档,才觉得多么不可靠!以下是官方文档的描述: In essence, this field measures the ...
- P4619 [SDOI2018]旧试题
题目 P4619 [SDOI2018]旧试题 Ps:山东的题目可真(du)好(liu),思维+码量的神仙题 推式 求\(\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^Cd(ij ...
- Android蓝牙串口通讯【转】
本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...
- 某国际知名IT公司笔试
原文地址:http://blog.csdn.net/lazy_tiger/article/details/1790986 这段时间没怎么顾及自己的这个“一寸土地”, 实在惭愧.因为这些天小弟又经历了“ ...
- Docker Copy On Write
Container分成结构 Container最上面是一个可写的容器层,以及若干只读的镜像层组成,Container的数据就存放在这些层中,这样的分层结构最大的特性是Copy-On-Write: 1. ...
- PE.微PE
1.老毛桃,大白菜(20180227) ZC:我记得以前 "老毛桃"."大白菜" 之前的版本,在安装好系统之后,是没有捆绑软件的,.现在,老毛桃 安装完系统之后 ...
- MySQL- 常用的MySQL函数,指令等
MySQL查看版本: status: 或者 select version(); //select @@version MySQL昨天, 一周前 ,一月前 ,一年前的数据 这里主要用到了 DATE_SU ...
- 微信等webview中无法修改document.title的情况
// hack在微信等webview中无法修改document.title的情况 var $iframe = $('<iframe src="https://www.bbtree.co ...
- 英语发音规则---Y字母
英语发音规则---Y字母 一.总结 一句话总结: 1.Y字母在单词最前面读发[j]? yes /jes/ [jɛs] n. 是 yard /jɑːd/ [jɑd] n. 院子 yellow /'jel ...