zoukankan      html  css  js  c++  java
  • 图解:计算两个日期之间的天数

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

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

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

    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;
    }

    这个方法的功能是用来计算y年m月d日到y年1月1日的天数,如图。

    另外这个方法还有另一个重要的用处——计算两个相邻年份之间的天数。

    第一步,计算y1年m1月d1日到y1年12月31日的天数。

    第二步,计算y2年m2月d2日到y2年1月1日的天数。

    第三步,以上两个结果相加。

    如图:


     

     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;

    本段代码是在Days()方法的基础上增加了对两个年份之间间隔的天数的计算。

    可以在理解Days()的基础上理解本段代码,图解如下:

  • 相关阅读:
    【原创】go语言学习(十六)接口
    【原创】go语言学习(十五)IO操作2
    【原创】go语言学习(十四)IO操作1
    【原创】go语言学习(十三)struct介绍2
    【原创】go语言学习(十二)struct介绍1
    【原创】go语言学习(十一)package简介
    【原创】sed正则表达式替换
    【原创】go语言学习(十)Map类型
    【原创】go语言学习(九)指针类型
    【原创】go语言学习(八)切片
  • 原文地址:https://www.cnblogs.com/rever/p/4435682.html
Copyright © 2011-2022 走看看