C++ 求两日期间相隔天数

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
    #include <iostream>  
    #include <algorithm>  
    #include <cmath>  
      
    using namespace std;  
      
    struct Date{  
        int year;  
        int month;  
        int day;  
      
        Date(int y = 0, int m = 0, int d = 0):  
            year(y), month(m), day(d) {}  
      
        Date & readIn() {  
            cin >> year >> month >> day;  
            return *this;  
        }  
      
        void swap(Date & rhs) {  
            Date t(*this);  
            *this = rhs;  
            rhs = t;  
        }  
      
    };  
      
    bool is_leap(int year) {  
        return (year % 400)|| (year % 4 && year % 100);  
    }  
      
    bool operator < (const Date & lhs, const Date & rhs) {  
        return (lhs.year < rhs.year) ||  
                (lhs.year == rhs.year) && (lhs.month < rhs.month) ||  
                (lhs.year == rhs.year) && (lhs.month == rhs.month && lhs.day < rhs.day);  
    }  
      
    int days_of_month(int year,int month) {  
        switch(month) {  
        case 1: case 3: case 5:case 7:  
        case 8: case 10: case 12:  
            return 31;  
        case 2:  
            return is_leap(year) ? 29: 28;  
      
        case 4: case 6: case 9: case 11:  
            return 30;  
        default:  
            return -1;  
        }  
    }  
      
    int day_diff(Date lhs, Date rhs) {  
    <span style="white-space:pre">    </span>//通过不断用其中一个向另一个逼近来求相差天数  
        int flag = 1;  
        if(rhs < lhs) {  
            swap(lhs, rhs);  
            flag = -1;  
        }  
      
        int day_shf = 0;  
        if(lhs.day < rhs.day) {  
            day_shf += rhs.day - lhs.day;  
            rhs.day = lhs.day;  
        }  
        if(lhs.day > rhs.day) {  
            day_shf -= lhs.day - rhs.day;  
            lhs.day = rhs.day;  
        }  
      
        while(lhs.month < rhs.month) {  
            day_shf += days_of_month(lhs.year ,lhs.month);  
            ++lhs.month;  
        }  
        while(lhs.month > rhs.month) {  
            day_shf -= days_of_month(rhs.year ,rhs.month);  
            ++rhs.month;  
        }  
    <span style="white-space:pre">    </span>//两个日期始终以相互为界,故日期大小关系不可能改变  
        while(lhs.year < rhs.year) {  
            day_shf += is_leap(lhs.year) ? 366: 365;  
            ++lhs.year;  
        }  
      
        return day_shf*flag;  
    }  
      
      
    int main()  
    {  
        Date d1, d2;  
        while(true) {  
            d1.readIn(); d2.readIn();  
            cout << day_diff(d1, d2) << endl;  
        }  
        return 0;  
    }  

标签: swap

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:Python压缩和解压缩文件(zip/unzip)

下一篇:JavaScript倒计时