C语言计算任意两日期之间天数
来源:互联网 发布:淘宝商品摆放 编辑:程序博客网 时间:2024/05/17 04:23
今天复习了会Program in c,有道题目计算任意两个日期之间的天数:
想了好久,最后写了一个很挫的程序.....
#include <stdio.h>struct date{int year;int month;int day;};int main(void){int isPrime(int year);int dateDiff(struct date mindate,struct date maxdate);struct date mindate,maxdate;int days;printf("please input the one date:");scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);printf("please input other day:");scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);days=dateDiff(mindate,maxdate); printf("the day is:%d\n",days); return 0;}/************************************************************************//* 判断闰年函数(4年一润,100年不润,400年再润) *//************************************************************************/int isPrime(int year){if ((year%4==0&&year%100!=0)||(year%400==0)){return 1;} else{return 0;}}int dateDiff(struct date mindate,struct date maxdate){int days=0, flag=1;const int primeMonth[12]={31,29,31,30,31,30,31,31,30,31,30,31};const int notPrimeMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};/************************************************************************//* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */ /************************************************************************/struct date tmp;if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day)){tmp=mindate;mindate=maxdate;maxdate=tmp;} int maxmonth,minmonth;/************************************************************************//* 主要思路:拿2002-8-8 2005-2-22来说 */ /* 将2004-8-8---2005-2-22----2005-7-8 *//*一前一后刚好N年,算出2005-2-22到2005-7-8的天数,然后用总年*36(5|6)减掉) *//* 2002-9-8 2005-11-22 *//* 2002-9-8-----2005-9-8-----2005-11-22(这次是加上后面天数) *//*如何判断是加还是减呢?年大而月小的,则是减,程序中用flag标示 *//************************************************************************/if (maxdate.month<mindate.month){maxmonth=mindate.month;minmonth=maxdate.month;flag=-1;}else{maxmonth=maxdate.month;minmonth=mindate.month;flag=1;} /************************************************************************/ /* 从mindate.year开始累加到maxdate.year */ /************************************************************************/for(int j=mindate.year;j<maxdate.year;++j){if (isPrime(j)==1){days+=366;}elsedays+=365;}/************************************************************************//* 从minmonth累加到maxmonth,分闰年和平年 *//************************************************************************/int day;if(isPrime(maxdate.year)==1){for(int i=minmonth;i<maxmonth;i++){day=primeMonth[i-1]*flag;days=days+day;}days=days+maxdate.day-mindate.day;}else{for (int i=minmonth;i<maxmonth;i++){day=notPrimeMonth[i-1]*flag;days=days+day;}days=days+maxdate.day-mindate.day;}return days;}
如果发现有错,请告诉我哦!!!!
测试一下,这里用mysql的datediff函数测试:
我的:
我的:
可能你测试的时候会发现,和mysql偏差一天,这我真不知道,也许是程序的问题吧,呵呵
突然发现,我想的有点问题,为什么不计算两个年份的日期到1月1号的日期呢,然后相减,哦,我想的有点复杂了,顺便将代码写的紧凑点.
#include <stdio.h>#define isPrime(year) ((year%4==0&&year%100!=0)||(year%400==0))struct date{int year;int month;int day;};int main(void){//int isPrime(int year);int dateDiff(struct date mindate,struct date maxdate);struct date mindate,maxdate;int days;printf("please input the one date:");scanf("%i-%i-%i",&mindate.year,&mindate.month,&mindate.day);printf("please input other day:");scanf("%i-%i-%i",&maxdate.year,&maxdate.month,&maxdate.day);days=dateDiff(mindate,maxdate); printf("the day is:%d\n",days); return 0;}int dateDiff(struct date mindate,struct date maxdate){int days=0,j,flag;const int primeMonth[][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};/************************************************************************//* 交换两个日期函数,将小的日期给mindate,将大的日期给maxdate */ /************************************************************************/struct date tmp;if ((mindate.year>maxdate.year)|| (mindate.year==maxdate.year&&mindate.month>maxdate.month)||(mindate.year==maxdate.year&&mindate.month==maxdate.month&&mindate.day>maxdate.day)){tmp=mindate;mindate=maxdate;maxdate=tmp;} /************************************************************************/ /* 从mindate.year开始累加到maxdate.year */ /************************************************************************/for(j=mindate.year;j<maxdate.year;++j)days+=isPrime(j)?366:365;//如果maxdate.year是闰年,则flag=1,后面调用primeMonth[1][12]flag=isPrime(maxdate.year);//加上maxdate.month到1月的天数for (j=1;j<maxdate.month;j++)days+=primeMonth[flag][j-1];//减去mindate.month到1月的天数 flag=isPrime(maxdate.year); for (j=1;j<mindate.month;j++) days-=primeMonth[flag][j-1]; days=days+maxdate.day-mindate.day; return days;}
- C语言计算任意两日期之间天数
- 计算任意2个日期之间的天数(C语言实现)
- 计算任意俩日期之间的天数
- C语言计算两个日期之间的天数
- 计算两日期之间的工作日天数
- java计算两日期之间的天数
- Java计算两日期之间的天数
- 计算两日期之间的天数
- Java中计算任意两个日期之间的工作天数
- 计算任意2个日期之间的工作天数
- 计算任意两个日期之间的天数问题
- Java中计算任意两个日期之间的工作天数
- php计算任意两个日期之间的天数
- C++ 计算任意两个日期之间的天数
- 两日期之间的天数
- 计算两日期间隔天数
- 计算两日期相差天数
- 计算两日期相差天数
- 好多的架构师
- Linux 目录结构及主要内容
- OpenCV播放视频 加随视频播放自动滚动的滚动条
- POJ 2243解题报告
- 在指定的线程接收信号 pthread_sigmask
- C语言计算任意两日期之间天数
- 定制自己的flex淡入淡出效果组件
- MySQL查询优化器源码分析
- google搜索命令列表
- 随机生成十个数并选出最大值
- android - Jni Environment 函数
- 抽象类与接口的区别 (转自老毕)
- Android.mk
- DBISAM故障一例