將兩個日期轉換成與一個指定日期(例1970-01-01)之間的差然后計算
思路:
兩個日期相隔天數的計算,首先可以將兩個日期轉換成time_t(從指定日期至1970年1月1日0時0分0秒相隔的秒數),然后計算兩個time_t的秒數差,最后用此秒數差除以24*3600秒就可以得到相隔的天數。所以程序中需要建立兩個函數,一個是將日期轉換成time_t的函數,一個是計算日期相隔天數的函數。
例:
1)建立程序的主體結構:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<time.h> 6 int get_days(const char* from, const char* to); 7 time_t convert(int year,int month,int day); 8 int main() 9 { 10 const char* from="2013-3-15"; 11 const char* to="2015-8-14"; 12 int days=get_days(from,to); 13 printf("From:%s\nTo:%s\n",from,to); 14 printf("%d\n",days); 15 system("pause"); 16 return 0; 17 }
get_days函數是計算兩個日期相隔天數的主要函數,主要實現從字符串中提取相應的數據和最后差值的計算;convert函數主要是將日期轉換成秒值。兩個函數的關系是get_day將會調用convert。
2)convert函數的實現:
1 time_t convert(int year,int month,int day) 2 { 3 tm info={0}; 4 info.tm_year=year-1900; 5 info.tm_mon=month-1; 6 info.tm_mday=day; 7 return mktime(&info); 8 }
這里需要使用的是一個tm的結構體,該結構體包含很多信息,其中最為重要的就是年、月、日、時、分、秒。還有一個重要的內部函數就是mktime該函數可以將tm結構體轉換成秒值也就是time_t類型。函數主要實現的方法就是新建一個tm結構體,然后將所有項賦值為0,再將年月日更新入tm結構體,最后使用mktime函數計算秒值並返回。
3)get_days函數的實現:
1 int get_days(const char* from, const char* to) 2 { 3 int year,month,day; 4 sscanf(from,"%d-%d-%d",&year,&month,&day); 5 int fromSecond=(int)convert(year,month,day); 6 sscanf(to,"%d-%d-%d",&year,&month,&day); 7 int toSecond=(int)convert(year,month,day); 8 return (toSecond-fromSecond)/24/3600; 9 }
這個函數最為重要的就是使用sscanf命令完成字符串中數字部分的獲取。一旦獲取到年月日再代入函數convert就可計算出秒值,最后將兩個秒值相減再除以一天的秒數即可得到結果。
完整程序:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<time.h> 6 int get_days(const char* from, const char* to); 7 time_t convert(int year, int month, int day); 8 9 int main() 10 { 11 const char* from = "2013-3-15"; 12 const char* to = "2015-8-14"; 13 int days = get_days(from, to); 14 printf("From:%s\nTo:%s\n", from, to); 15 printf("%d\n", days); 16 system("pause"); 17 return 0; 18 } 19 20 time_t convert(int year, int month, int day) 21 { 22 tm info = {0}; 23 info.tm_year = year - 1900; 24 info.tm_mon = month - 1; 25 info.tm_mday = day; 26 return mktime(&info); 27 } 28 29 int get_days(const char* from, const char* to) 30 { 31 int year, month, day; 32 sscanf(from, "%d-%d-%d", &year, &month, &day); 33 int fromSecond = (int) convert(year, month, day); 34 sscanf(to, "%d-%d-%d", &year, &month, &day); 35 int toSecond = (int) convert(year, month, day); 36 return (toSecond - fromSecond) / 24 / 3600; 37 }
直接計算
思路:
比如輸入2001/03/23--2013/12/11,分成三段,2001/03/23--2001/12/31,2002年初到2012年底,2013/01/01--2013/12/11.只要判斷第二段中是否有閏年即可。
代碼:
1 //是否閏年 2 bool IsLeapYear(int y) 3 { 4 return ((y%4==0&&y%100!=0)||(y%400)==0); 5 } 6 7 //今年已過的天數(從1月1日算起) 8 int GetNowDays(int y,int m,int d) 9 { 10 int days=0; 11 switch(m-1) 12 { 13 case 11: 14 days+=days+30; 15 case 10: 16 days+=days+31; 17 case 9: 18 days+=days+30; 19 case 8: 20 days+=days+31; 21 case 7: 22 days+=days+31; 23 case 6: 24 days+=days+30; 25 case 5: 26 days+=days+31; 27 case 4: 28 days+=days+30; 29 case 3: 30 days+=days+31; 31 case 2: 32 if(IsLeapYear(y)) 33 days+=29; 34 else 35 days+=28; 36 case 1: 37 days+=31; 38 default: 39 days+=d; 40 break; 41 } 42 return days; 43 } 44 45 //今年剩余天數 46 int GetRemainDays(int y,int m,int d) 47 { 48 if(IsLeapYear(y)) 49 return (366-GetNowDays(y,m,d)); 50 else 51 return (365-GetNowDays(y,m,d)); 52 } 53 54 //日期格式為yyyy-mm-dd 55 //求兩個日期之間的相隔天數 56 int GetExDays(const char* bgDate,const char* exDate) 57 { 58 if(bgDate==NULL||exDate==NULL) 59 return 0; 60 if(strcmp(bgDate,exDate)>0) 61 return 0; 62 int by,bm,bd,ey,em,ed; 63 int days=0; 64 sscanf(bgDate,"%d-%d-%d",&by,&bm,&bd); 65 sscanf(exDate,"%d-%d-%d",&ey,&em,&ed); 66 67 if(ey-by>=1) 68 { 69 days+=((ey-(by+1))/4)*(365*3+366); 70 int tmp=(ey-(by+1))%4; 71 for(int i=1;i<=tmp;++i) 72 { 73 if(IsLeapYear(by+1)) 74 days+=366; 75 else 76 days+=365; 77 } 78 days+=(GetRemainDays(by,bm,bd)+GetNowDays(ey,em,ed)); 79 }else 80 { 81 days+=(GetNowDays(ey,em,ed)-GetNowDays(by,bm,bd)); 82 } 83 return days; 84 }
轉載請注明出處:http://www.cnblogs.com/fnlingnzb-learner/p/7054503.html