C語言計算任意兩日期之間天數
阿新 • • 發佈:2019-01-04
今天覆習了會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; }