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

时间: 2024-10-27 21:17:39

C/C++输入两个任意日期求相隔天数的相关文章

20161116 输入两个自然数,求它们的和

题目: 输入两个自然数,求它们的和. 代码: 1 program work20161126; 2 var 3 a,b,c:integer; 4 BEGIN 5 readln(a,b); 6 c:=a+b; 7 writeln(c); 8 END.     

两个日期的相隔天数

计算两个日期对象间相隔天数 package cn.util; import java.util.Date; public class date { /** * 计算两个日期的相隔天数 * @param begin * @param end * @return */ public static long dateDivide(Date begin,Date end){ //获取结束日期的毫秒数 getTime()返回的是一个long型的毫秒数 long endTime=end.getTime();

输入两个正整数,求其最大公约数和最小公倍数

1 /* 2 题目:输入两个正整数m和n,求其最大公约数和最小公倍数. 3 例如:12和20的最大公约数是4,最小公倍数是60. 4 */ 5 6 // 导包 7 import java.util.Scanner; 8 9 public class ForTest { 10 public static void main(String[] args) { 11 // 创建键盘输入对象 12 Scanner sc = new Scanner(System.in); 13 14 // 接收键盘输入的

根据提供的两个固定日期求出相差的月份

最近 在搞日历,给两个指定日期算出相差的天数 这个还好,可还要算出月份      一紧张没想出来,在网上找找,找到了,一看,其实方法 很简单就是没想到 把日期1的年数与12相乘,加上日期1的月份, 把日期2同一操作 然后再两个月份相减 得到的就是月份差, 有人说夸年能行吗? 答案是肯定的, 贴代码 最初的想法不是我 //两个日期 var date1 = '2016-02-26'; var date2 = '2015-11-10'; // 拆分年月日 date1 = date1.split('-'

js-获取两个字符串日期的相隔周

例如说"2017-04-01 23:00:00"是周六, "2017-04-28 23:00:00"是周五,包含各自所在的那一周,我真正需要获得的结果是5个周. 开始做的时候一直把字符串啊,时间格式啊转来转去,后来发现,完全没有必要,毕竟我想要的只是周期值而已..... 思路其实很简单,就是获取开始日期的那一周的周一的日期 然后用周一的日期和结束日期比较,向上取整.就可以获取到这个数了 var start = "2017-04-01 23:00:00&qu

javascript比较两个日期之间相隔天数

$(function () { var starttime = transdate("2014-09-30 15:53:00"); var endtime = transdate("2014-10-03 15:53:00"); var now = "'"+new Date().getTime()+"'"; var nowtime = now.substr(1,10); if(nowtime > endtime){ $('

c#(asp.net) 如何计算两个日期之间相隔天数

1.DateTime t1 = Convert.ToDateTime("2006-1-6"); DateTime t2 = Convert.ToDateTime("2006-1-16"); int day=Math.Abs(((TimeSpan)(t1 - t2)).Days); 2.datediff(day,date1,date2) 3. DateTime oldDate = new DateTime(2002,7,15); DateTime newDate =

java计算两个日期之间相差天数和相隔天数详解

大家看到文章标题"两个日期之间相差天数和相隔天数",是否有疑惑呢!从中文字面理解,"相差"和"相隔"是有区别的,然而就是这些区别害死很多人,却没有发现,在大量新增统计时是差之毫厘谬以千里,我能都发现是因为一个偶然的机会,一个项目运行几年却没有人发现,我在其中还不到一年,一开始写这些这代码的人根本没分清楚什么情况就写了,怪不得统计的数据总是有那么细微的差别,在于日期"相差"和"相隔"有某些特定的情况下是相等的

c语言:输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数. 解:程序: #include <stdio.h> int main() { int num1, num2, t,p; printf("请输入两个正整数:"); scanf("%d,%d", &num1, &num2);//7,8 p = num1*num2; while (t = num1%num2)//7           1        0,循环结束 { num1 = num2;