码迷,mamicode.com
首页 > 编程语言 > 详细

C++计算两个日期之间的天数

时间:2015-04-17 20:22:00      阅读:344      评论:0      收藏:0      [点我收藏+]

标签:

计算两个日期之间的天数的思路:

首先,判断输入的年份是不是闰年。年份是否相同?月份是否相同?日是否相同?

日月年有三种可能的情况:

  1. 同年同月。日数相减就出来了。
  2. 同年不同月。计算日期小的月份到年初的天数,计算日期大的月份到年初的天数。再把两个日期向减
  3. 不同年。先计算中间相隔几年,计算较小的日期到年底有多少天,再计算较大的日期距年初有多少天,将三个数向加。

代码如下:

 1 #include<iostream>
 2 #include<CString>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 bool isleapyear(int year)   //判断是否是闰年
 7 {
 8     if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
 9         return 1;
10     else
11         return 0;
12 }
13 
14 int Days(int y, int m, int d)     //计算y年m月d日到y年1月1日的天数
15 {
16     int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
17     int i;
18     int sum = 0;         /* 计算天数 */
19     if (isleapyear(y))     /* 如果为闰年,2月有 29 天 */   
20         days[2] = 29;
21     for (i = 0; i<m; i++)
22         sum = sum + days[i];
23     sum = sum + d - 1;
24     return sum;
25 }
26 
27 int Days(int y1, int m1, int d1, int y2, int m2, int d2) //计算年月日都不相同的两个日期之间的天数
28 {
29     int t1;
30     int t2;
31     int year = y2-y1;
32     int sum=0;  //相差的天数
33     if (year == 1)      //如果两个日期的年份相差为1
34     {
35         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);  //较小的日期计算y1年m1月d1日到年底的天数
36         t2 = Days(y2, m2, d2);                       //较大的日期计算y2年m2月d2日到年初的天数
37         sum = t1 + t2 + year;
38     }
39     else{
40         for (int i = y1+1; i < y2; i++)
41         {
42             if (isleapyear(i))
43             {
44                 sum += 366;
45             }
46             else
47                 sum += 365;
48         }
49         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
50         t2 = Days(y2, m2, d2);
51         sum = sum + t1 + t2 + 1;
52         
53     }
54     return sum;
55 }
56 
57 int main(){
58     int year1;   //较小的年份
59     int year2;
60     int month1;  //较小的月份
61     int month2;
62     int day1;
63     int day2;
64     int day=0;
65     cin >> year1 >> month1 >> day1;
66     cin >> year2 >> month2 >> day2;
67 
68     if (year1 > year2 || (year1 == year2) && (month1 > month2) || ((year1 == year2) && (month1 == month2)) && (day1 > day2) )
69     {
70         cout << "输入错误" << endl;
71     }
72     else{
73 
74         if (year1 == year2&&month1 == month2)    //  1.如果年和月相同,直接计算天数的差
75         {
76             day = abs(day2 - day1);
77             cout << day << endl;
78         }
79         else if (year1 == year2 && month1 != month2)   //  2.如果年份相同而月份不同,则计算较小的日期到较大的日期的天数
80         {
81             day = abs(Days(year1, month1, year1) - Days(year2, month2, day2));
82             cout << day << endl;
83         }
84         else
85         {
86             day = Days(year1, month1, day1, year2, month2, day2);
87             cout << day << endl;
88         }
89     }
90     return 0;
91     }

对于部分代码的理解:

int Days(int y, int m, int d)     //计算y年m月d日到y年1月1日的天数
{
    int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int i;
    int sum = 0;         /* 计算天数 */
    if (isleapyear(y))     /* 如果为闰年,2月有 29 天 */   
        days[2] = 29;
    for (i = 0; i<m; i++)
        sum = sum + days[i];
    sum = sum + d - 1;
    return sum;
}

这段代码的理解可以用下图表示:

技术分享

我们需要求的日期为两个红箭头之间的绿色部分。

 

 1 for (int i = y1+1; i < y2; i++)
 2         {
 3             if (isleapyear(i))
 4             {
 5                 sum += 366;
 6             }
 7             else
 8                 sum += 365;
 9         }
10         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
11         t2 = Days(y2, m2, d2);
12         sum = sum + t1 + t2 + 1;

这段代码的理解可以用下图表示:

技术分享

2015年跟2011年相差的其实只有三年,刚开始写的时候年数直接写的是2015减2011,导致多算了一年。

C++计算两个日期之间的天数

标签:

原文地址:http://www.cnblogs.com/rever/p/4435682.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!