1. 程式人生 > >C語言計算任意兩日期之間天數

C語言計算任意兩日期之間天數

今天覆習了會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;
		}
		else
			days+=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;
}