注册 登录
编程论坛 C++教室

Date类

PcrazyC 发布于 2008-03-16 22:50, 3148 次点击
今天写了一个DATE类,发上来共享一下,由于时间比较紧,所以随便调试了一下,如果有错误,请指正,可能过两天再更新一下

//头文件(date.h)

程序代码:
class Date
{
public:
    Date();
    Date(int y,int m,int d);
    Date(const Date& dt);
    Date& add_year(int n);
    Date& add_month(int n);
    Date& add_day(int n);
    bool leapyear(int n);
    Date operator+(int n);
    Date operator-(int n);
    Date& operator++();
    Date& operator--();
    Date& operator+=(int n);
    Date& operator-=(int n);
    bool operator==(Date dt) const;
    bool operator!=(Date dt) const;
    bool operator<(Date dt) const;
    bool operator>(Date dt) const;
    int operator-(Date dt);
    int get_week();
    static void set_today(int y,int m,int d);
    void print();

private:
    int y,m,d;
    week w;
    static Date default_date;
};


//CPP文件:
程序代码:

#include"date.h"
#include<iostream>

using namespace std;

#define CASE break;case
typedef enum wk{sun=0,mon,tue,wed,thu,fri,sat}week;

const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

Date Date::default_date=Date(2008,3,16);
void Date::set_today(int y,int m,int d)
{
    default_date.y=y;
    default_date.m=m;
    default_date.d=d;
}

Date::Date()
{
    *this=default_date;
}

Date::Date(int y,int m,int d)
{
    this->y=y;
    this->m=m;
    this->d=d;
}

Date::Date(const Date &dt)
{
    y=dt.y;
    m=dt.m;
    d=dt.d;
}

Date& Date::add_day(int n)
{
    d+=n;
    int day=m==2&&leapyear(y)?month[m]+1:month[m];
    while(d>day)
    {
        m++;
        d-=day;
        day=m==2&&leapyear(y)?month[m]+1:month[m];
    }
    if(m>12)
    {
        y+=m/12;
        m=m%12;
    }
    return *this;
}

Date& Date::add_month(int n)
{
    m+=n;
    if(m>12)
    {
        y+=m/12;
        m=m%12;
    }
    int day=m==2&&leapyear(y)?month[m]+1:month[m];
    if(d>day)
    {
        m++;
        d-=day;
    }
    return *this;
}

Date& Date::add_year(int n)
{
    if(leapyear(y)&&!leapyear(y+n)&&m==2&&d==29)
    {
        m=3;
        d=1;
    }
    y+=n;
    return *this;
}

bool Date::operator==(Date dt) const
{
    if(y==dt.y&&m==dt.y&&d==dt.d)
        return 1;
    return 0;
}
bool Date::operator !=(Date dt) const
{
    if(*this==dt)
        return 0;
    return 1;
}

bool Date::operator<(Date dt) const
{
    if(y!=dt.y)
        return y<dt.y;
    if(m!=dt.m)
        return m<dt.m;
    return d<dt.d;
}

bool Date::operator>(Date dt) const
{
    if(y!=dt.y)
        return y>dt.y;
    if(m!=dt.m)
        return m>dt.m;
    return d>dt.d;
}

Date Date::operator+(int n)
{
    this->add_day(n);
    return *this;
}

Date Date::operator-(int n)
{
    while(n)
    {
        int day=(m-1)==2&&leapyear(y)?month[m-1?m-1:12]+1:month[m-1?m-1:12];
        if(n>day)
        {
            d-=day;
            n-=day;
            m--;
        }
        else
        {
            if(n>=d)
            {
                d=day+d-n;
                m--;
            }
            else
                d-=n;

        }
        if(m<0)
        {
            m=12;
            y--;
        }
    }
    return *this;
}

int Date::operator -(Date dt)
{
    int sum=0,day;
    while(y>dt.y+1)
    {
        sum+=leapyear(dt.y)?366:365;
        dt.y++;
    }
    if(y>dt.y&&(m>dt.m||m==dt.m&&d>=dt.d))
    {
        sum+=leapyear(dt.y)?366:365;
        dt.y++;
    }
    while(m>dt.m)
    {
        day=dt.m==2&&leapyear(dt.y)?month[dt.m]+1:month[dt.m];
        sum+=day;
        dt.m++;
    }
    sum+=d-dt.d;
    return sum;

}

Date& Date::operator+=(int n)
{
    *this=*this+n;
    return *this;
}

Date& Date::operator-=(int n)
{
    *this=*this-n;
    return *this;
}

Date& Date::operator++()
{
    *this+=1;
    return *this;
}

Date& Date::operator--()
{
    *this-=1;
    return *this;
}

bool Date::leapyear(int n)
{
    if(n%4)
        return 0;
    if(n%100==0)
        if(n%400)
            return 0;
    return 1;
}

void Date::print()
{
    cout<<y<<"."<<m<<"."<<d<<"\t";
    w=(week)(get_week()%7);
    switch(w)
    {
    case 0:
        cout<<"sunday";
    CASE(1):
        cout<<"monday";
    CASE(2):
        cout<<"tuesday";
    CASE(3):
        cout<<"wednesday";
    CASE(4):
        cout<<"thursday";
    CASE(5):
        cout<<"friday";
    CASE(6):
        cout<<"saturday";
        break;
    default:
        cout<<"the week is wrong";
    }
    cout<<endl;
}

int Date::get_week()
{
    return *this>default_date?(*this-default_date)%7:7-(default_date-*this)%7;
}
13 回复
#2
小烟2008-03-18 01:19
牛人,看不懂也来坐哈
#3
zabbey2008-03-18 10:21
LZ可以试着把农历加上,那就有点难度了。
#4
PcrazyC2008-03-18 10:27
[bo]以下是引用 [un]zabbey[/un] 在 2008-3-18 10:21 的发言:[/bo]

LZ可以试着把农历加上,那就有点难度了。

这个我考虑过,可能过两天再加,还可能加一些新的东西
#5
sunkaidong2008-03-18 15:41
呵呵..不错..帮你顶了..我过几天也弄个原创..要不现在精华还是0呢..愚昧...
#6
PcrazyC2008-03-18 19:46
我精华帖本来就有四个,这个好像不算在内吧
#7
zdyiam2008-03-19 08:45
ddddddd
#8
VanHorn2008-03-19 10:22
日期类啊。挺好的。楼主,我觉得应该再加一个获得系统日期的方法,用来获得当前时间,这样更有意义。
#9
PcrazyC2008-03-19 11:45
这个只是我自己刚学C++随便写的,后面的继承之类的我都还没看,如果真的要设计一个日期类的话,我不可能设计得这么简单,这只是看了前两章的一个练习而已,等我看了后面的再完整的设计一个日期类出来
#10
荒野的雄狮2008-10-24 21:46
挺佩服你的,我c++看了不少,可很少动手自己写东西。顶顶……
#11
wxm1984272008-10-27 14:59
佩服,我也是有看C++,也很少写东东,向你学习……
#12
blueboy820062008-10-27 20:12
这两天太忙了,这个收着了,有空一定拜读。。。
#13
mbstorm2008-11-01 13:28
很佩服你lz!有什么学习的方法能教我吗?谢谢了!
#14
mbstorm2008-11-01 23:00
我收藏了
1