C/C++输入两个任意日期求相隔天数
将两个日期转换成与一个指定日期(例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