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

posted @ 2017-06-20 15:30  Boblim  阅读(8534)  评论(0编辑  收藏  举报