判断天数C语言,C语言计算任意两日期之间天数

今天复习了会Program in c,有道题目计算任意两个日期之间的天数:

想了好久,最后写了一个很挫的程序.....

#include

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

{

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

{

if (isPrime(j)==1)

{

days+=366;

}

else

days+=365;

}

/************************************************************************/

/* 从minmonth累加到maxmonth,分闰年和平年 */

/************************************************************************/

int day;

if(isPrime(maxdate.year)==1)

{

for(int i=minmonth;i

{

day=primeMonth[i-1]*flag;

days=days+day;

}

days=days+maxdate.day-mindate.day;

}

else

{

for (int i=minmonth;i

{

day=notPrimeMonth[i-1]*flag;

days=days+day;

}

days=days+maxdate.day-mindate.day;

}

return days;

}

如果发现有错,请告诉我哦!!!!

测试一下,这里用mysql的datediff函数测试:

0818b9ca8b590ca3270a3433284dd417.png

我的:

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

我的:

0818b9ca8b590ca3270a3433284dd417.png

可能你测试的时候会发现,和mysql偏差一天,这我真不知道,也许是程序的问题吧,呵呵

突然发现,我想的有点问题,为什么不计算两个年份的日期到1月1号的日期呢,然后相减,哦,我想的有点复杂了,顺便将代码写的紧凑点.

#include

#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

days+=isPrime(j)?366:365;

//如果maxdate.year是闰年,则flag=1,后面调用primeMonth[1][12]

flag=isPrime(maxdate.year);

//加上maxdate.month到1月的天数

for (j=1;j

days+=primeMonth[flag][j-1];

//减去mindate.month到1月的天数

flag=isPrime(maxdate.year);

for (j=1;j

days-=primeMonth[flag][j-1];

days=days+maxdate.day-mindate.day;

return days;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值