日期相关的计算
今天(Sun, 16 Sep 2018 06:34:57 +0000)帮同学写一个日期相关的c++题,竟然耗费了很多时间,不得不感叹自己真是老了。 首先定义类用年月日(yy,mm,dd)存储日期 日期±天数,直接加减到“天”上,然后“多退少补”。 两日期之间相差天数。我是先计算两日前距元年元月元日的天数,然后直接相减。但我这么算,老是差几天,调试了好久,甚至我都一度打算放弃,直接调用上面做的日期加天数一天一天往上累加(可以预料到这会用多长时间)。 最后才检查出,竟然是判断闰年出错了,我把取余弄成了整除,闰年哭晕在厕所。 老了,真的老了。

今天(Sun, 16 Sep 2018 06:34:57 +0000)帮同学写一个日期相关的c++题,竟然耗费了很多时间,不得不感叹自己真是老了。 首先定义类用年月日(yy,mm,dd)存储日期 日期±天数,直接加减到“天”上,然后“多退少补”。 两日期之间相差天数。我是先计算两日前距元年元月元日的天数,然后直接相减。但我这么算,老是差几天,调试了好久,甚至我都一度打算放弃,直接调用上面做的日期加天数一天一天往上累加(可以预料到这会用多长时间)。 最后才检查出,竟然是判断闰年出错了,我把取余弄成了整除,闰年哭晕在厕所。 老了,真的老了。

#include <iostream>
using namespace std;
class TMyDate
{
private:
    int yy,mm,dd;
    bool isrn(int year)//判断闰年
    {
        if((year%4==0&&year%100!=0)||(year%400==0))
        {
            return true;
        }
        return false;
    }
    int getDaysofmonth(int y,int m)//某年某月有多少天
    {
        switch(m)
        {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 2:
            if(isrn(y)){
                return 29;
            }
            return 28;
        default:
            return 30;
        }
    }
    int getTotaldays(int y,int m,int d){//某年月日距元年元月元日天数
        int sum=0;
        sum+=d;
        m--;
        while(m--){
            sum+=getDaysofmonth(y,m);
        }
        y--;
        while(y--){
            sum+=isrn(y)?366:365;
        }
        return sum;
    }
public:
    TMyDate()
    {
        yy=1900;
        mm=1;
        dd=1;
    }
    TMyDate(int y,int m,int d)
    {
        yy=y;
        mm=m;
        dd=d;
    }
    int getYear(){
        return yy;
    }
    int getMonth(){
        return mm;
    }
    int getDay(){
        return dd;
    }
    TMyDate operator+(int d){//日期加天数
        int tmp_d=dd;
        int tmp_m=mm;
        int tmp_y=yy;
        tmp_d+=d;
        while(true){
            if(tmp_d>getDaysofmonth(tmp_y,tmp_m)){
                tmp_m++;
                tmp_d-=getDaysofmonth(tmp_y,tmp_m);
                continue;
            }
            if(tmp_m>12){
                tmp_y++;
                tmp_m-=12;
                continue;
            }
            break;
        }
        return TMyDate(tmp_y,tmp_m,tmp_d);
    }
    TMyDate operator-(int d){//日期减天数
        int tmp_d=dd;
        int tmp_m=mm;
        int tmp_y=yy;
        tmp_d-=d;
        while(true){
            if(tmp_d<=0){
                tmp_m--;
                tmp_d+=getDaysofmonth(tmp_y,tmp_m);
                continue;
            }
            if(tmp_m<=0){
                tmp_y--;
                tmp_m+=12;
                continue;
            }
            break;
        }
        return TMyDate(tmp_y,tmp_m,tmp_d);
    }
    int operator-(TMyDate&d){//日期与日期相距天数
        return getTotaldays(yy,mm,dd)-getTotaldays(d.getYear(),d.getMonth(),d.getDay());
    }
    void showInfo(){
        cout<<yy<<'-'<<mm<<'-'<<dd<<endl;
    }
};
int main()
{
    TMyDate tmp1(2018,9,16);
    TMyDate tmp2(1998,6,4);
    TMyDate tmp3;
    tmp1.showInfo();
    tmp2.showInfo();
    tmp3=tmp1-25;
    tmp3.showInfo();
    tmp3=tmp1+25;
    tmp3.showInfo();
    cout<<tmp1-tmp2<<endl;
    tmp1.showInfo();
    tmp2.showInfo();
    return 0;
}

最后修改于 2018-09-16