首页 > 编程语言 > 详细

C++ 实现一个日期类

时间:2016-03-06 01:26:19      阅读:248      评论:0      收藏:0      [点我收藏+]
#include <iostream>
using namespace std;
class date
{
friend ostream& operator<<(ostream& os, const date &d);
friend istream& operator>>(istream& in, date &d);
public:
date(int year = 1900, int month=1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
if(is_invalid_date())//无效的
{
_year = 1900;
_month = 1;
_day = 1;
}
}
public:
bool is_invalid_date()//判断日期是否无效
{
if((_year < 1900) 
|| ((_month < 1) || (_month > 12)) 
|| ((_day < 1) || (_day > day_in_month())))
{
return true;
}
return false;
}
public:
int day_in_month()
{
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(is_leap_year())
{
days[2] += 1;
}
return days[_month];
}
public:
bool is_leap_year()
{
if((_year % 400 == 0) || ((_year % 100) != 0 && _year % 4 == 0))
{
return true;
}
return false;
}
date(const date& d)
:_year(d._year)
,_month(d._month)
,_day(d._day)
{
}
date& operator=(const date& d)
{
if(this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
public:
void to_correct_date()
{
//2000 11 -3
while(_day <= 0)
{
if(_month == 1)
{
_month = 12;
_year -= 1;
}
else
{
_month -= 1;
}
_day += day_in_month();
}
while(_day > day_in_month())
{
_day -= day_in_month();
if(_month == 12)
{
_month = 1;
_year += 1;
}
else
{
_month += 1;
}
}
}
date operator+(int day)
{
date d(*this);
d._day += day;
//
d.to_correct_date();
return d;
}
date& operator+=(int day)
{
_day += day;
//
this->to_correct_date();
return *this;
}
date operator-(int day)
{
date d(*this);
d._day -= day;
//
d.to_correct_date();
return d;
}
date& operator-=(int day)
{
date d(*this);
_day -= day;
//
this->to_correct_date();
return *this;
}
int operator-(const date &d)
{
        int days = 0;
date d1(d);
date d2(*this);
if(d1 > d2)//d2 记录大的日期
{
d1 = (*this);
d2 = d;
}
while(d1 != d2)
{
days++;
d1 += 1;
}
return days;
}
bool operator>(const date& d)
{
if(_year > d._year)
return true;
if(_year == d._year)
{
if(_month > d._month)
return true;
if(_month == d._month)
{
if(_day > d._day)
{
return true;
}
}
}
return false;
}
bool operator>=(const date& d)
{
return (*this > d) || (*this == d);
}
bool operator!=(const date& d)
{
return !(*this == d);
}
bool operator==(const date& d)
{
return (_year == d._year && _month == d._month && _day == d._day);
}
bool operator<(const date& d)
{
return !(*this >= d);
}
bool operator<=(const date& d)
{
return (*this > d);
}
private:
int _year;
int _month;
int _day;
};
ostream& operator<<(ostream& os, const date& d)
{
os<<d._year<<"-"<<d._month<<"-"<<d._day;
return os;
}
istream& operator>>(istream& in, date& d)
{
in>>d._year>>d._month>>d._day;
return in;
}
int main()
{
date d(2016, 3, 5);
cout<<d<<endl;
d += 2;
cout<<"d+2:  "<<d<<endl;
d += 31;
cout<<"d+31:  "<<d<<endl;
d -= 61;
cout<<"d-61:  "<<d<<endl;
cout<<"=============="<<endl;
date d1(2016, 3, 5), d2(2016, 2, 1);
cout<<(d2 - d1)<<endl;
getchar();
return 0;
}

--------------------------------------------------------------------
别的方法 参见网上
日期类

-----------------my_date.h--------------

#ifndef __MY_DATE_H__
#define __MY_DATE_H__

#include <iostream>
#include <stdlib.h>

using namespace std;

class my_date
{
	friend ostream& my_date::operator<<(ostream& os, const my_date& q);
public:
    my_date(int x = 1970, int y = 1, int z = 1)
		:year(x)
		,month(y)
		,day(z)
	{
	
	}
    
	my_date operator+(int m);
	my_date& operator+=(int m);
   // void add(int m);//加天数

	my_date operator-(int m);
	my_date& operator-=(int m);
   // void del(int m);//减天数

	int operator-( my_date& q);
    //int diff(my_date& q);//日期差
    //void display();//显示
	
private:
    int year,month,day;
};
my_date my_date::operator+(int m)
{
	my_date tmp_date(*this);
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},temp,f;//d为12个月每个月天数的数组
    f=0;
    while (m>0)
    {
        if (tmp_date.year%100==0)
            d[1] = (tmp_date.year%400==0?29:28);//如果是闰年,2月天数为29
        else
            d[1] = (tmp_date.year%4==0?29:28);//如果是闰年,2月天数为29
        temp=d[tmp_date.month-1]-tmp_date.day;
        if (temp>=m)//如果所加天数未超过当月剩余天数
        {
            tmp_date.day=tmp_date.day+m;
            break;
        }
        m-=temp;
        tmp_date.day=0;
        tmp_date.month++;
        for (;tmp_date.month<=12;tmp_date.month++)//开始月遍历进行日期计算
        {
            if (d[tmp_date.month-1]>=m)
            {
                tmp_date.day+=m;
                break;
            }
            else
            {
                m-=d[tmp_date.month-1];
            }
        }
        if (tmp_date.month<=12)//若所加天数在本年12月内
            break;
        tmp_date.month=1;//所加天数超过今天剩余天数,月初始化为1月,即从下年一月继续算
        tmp_date.year++;//加一年
    }

	return tmp_date;
}

my_date& my_date::operator+=(int m)
{
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},temp,f;//d为12个月每个月天数的数组
    f=0;
    while (m>0)
    {
        if (year%100==0)
            d[1] = (year%400==0?29:28);//如果是闰年,2月天数为29
        else
            d[1] = (year%4==0?29:28);//如果是闰年,2月天数为29
        temp=d[month-1]-day;
        if (temp>=m)//如果所加天数未超过当月剩余天数
        {
            day=day+m;
            break;
        }
        m-=temp;
        day=0;
        month++;
        for (;month<=12;month++)//开始月遍历进行日期计算
        {
            if (d[month-1]>=m)
            {
                day+=m;
                break;
            }
            else
            {
                m-=d[month-1];
            }
        }
        if (month<=12)//若所加天数在本年12月内
            break;
        month=1;//所加天数超过今天剩余天数,月初始化为1月,即从下年一月继续算
        year++;//加一年
    }

	return *this;
}

my_date my_date::operator-(int m)
//void my_date::del(int m)//本函数注释与add基本相同
{
	my_date tmp_date(*this);
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},f;
    f=0;
    while (m>0)
    {
        if (tmp_date.year%100==0)
            d[1] = (tmp_date.year%400==0?29:28);
        else
            d[1] = (tmp_date.year%4==0?29:28);
        if (tmp_date.day>=m)
        {
            tmp_date.day=tmp_date.day-m;
            break;
        }
        m-=tmp_date.day;
        tmp_date.month--;
        for (;tmp_date.month>=1;tmp_date.month--)
        {
            if (d[tmp_date.month-1]>=m)
            {
                tmp_date.day=d[tmp_date.month-1]-m;
                break;
            }
            else
            {
                m-=d[tmp_date.month-1];
            }
        }
        if (tmp_date.month>=1)
            break;
        tmp_date.month=12;
        tmp_date.year--;
        tmp_date.day=31;
    }
	return tmp_date;
}

my_date& my_date::operator-=(int m)
//void my_date::del(int m)//本函数注释与add基本相同
{
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},f;
    f=0;
    while (m>0)
    {
        if (year%100==0)
            d[1] = (year%400==0?29:28);
        else
            d[1] = (year%4==0?29:28);
        if (day>=m)
        {
            day=day-m;
            break;
        }
        m-=day;
        month--;
        for (;month>=1;month--)
        {
            if (d[month-1]>=m)
            {
                day=d[month-1]-m;
                break;
            }
            else
            {
                m-=d[month-1];
            }
        }
        if (month>=1)
            break;
        month=12;
        year--;
        day=31;
    }
	return *this;
}

int my_date::operator-( my_date& q)
//int my_date::diff(my_date& q)
{
    int differece;
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31},m,i;
    my_date temp;
    my_date *pSmall,*pBig;
    if (year==q.year)//如果年相同
    {
        if (month==q.month)//若月相同
        {
            differece = q.day-day;
        }
        else//月不同
        {
            if (month>q.month)//让pSmall指针指向小日期,pBig指针指向大日期
            {
                pSmall = &q;
                pBig = this;
            }
            else
            {
                pSmall = this;
                pBig = &q;
            }
            temp.month=pSmall->month;
            temp.day=pSmall->day;
            for (i=1;i<=366;i++)//每次加一天,看看加多少次,两个日期相同,加的次数即为相差的天数
            {//由于年份相同,相差的天数必然不会大于366,实际循环次数不大于366
                temp + 1;//使用 运算符重载 +
                if (temp.month==pBig->month && temp.day==pBig->day)
                {
                    differece=i;
                    break;
                }
            }
            differece=(month>q.month?-differece:differece);
        }
    }
    else//年份不同
    {
        if (year>q.year)//让pSmall指针指向小日期,pBig指针指向大日期
        {
            pSmall = &q;
            pBig = this;
        }
        else
        {
            pSmall = this;
            pBig = &q;
        }
        temp.year=pSmall->year;
        temp.month=pSmall->month;
        temp.day=pSmall->day;
        m=pBig->year-pSmall->year;
        for (i=(m-1)*365;i<=(m+1)*366;i++)//每次加一天,看看加多少次,两个日期相同,加的次数即为相差的天数
        {//计算出年份差m后,两个日期的天数差必定在[(m-1)*365,(m+1)*366]范围内,实际循环的次数不大于2*366
            //temp.add(1);
			temp += 1;
            if (temp.month==pBig->month && temp.day==pBig->day)
            {
                differece=i-(m-1)*365+1;
                break;
            }
        }
        differece=(year>q.year?-differece:differece);
    }
    return differece;
}

ostream& operator<<(ostream& os, const my_date& q)
//void my_date::display()
{
    os<<q.year<<"年"<<q.month<<"月"<<q.day<<"日";
	return os;
}

#endif

------------------main.cpp--------------

#define _CRT_SECURE_NO_WARNINGS 1

#include "my_date.h"
//主函数演示
int main()
{
    my_date d(2016,2,24);
    cout<<"原日期date1:"<<endl;
    //d.display();
	cout<<d<<endl;
   // d.add(60);
	d+=60;
    cout<<"date2=date1+60:";
	cout<<d<<endl;
    d -= 60;
    cout<<"date3=date2-60:";
    cout<<d<<endl;
   // printf("2016-2-24与2017-2-24日相差%d天\n",d.diff(my_date(2017,2,24)));
	cout<<"2016-2-24与2017-2-24日相差"<<(d - my_date(2017,2,24))<<"天"<<endl;

	system("pause");
	return 0;
}
---------------------------------------------------------------------

本文出自 “爱技术爱生活” 博客,请务必保留此出处http://alick.blog.51cto.com/10786574/1747934

C++ 实现一个日期类

原文:http://alick.blog.51cto.com/10786574/1747934

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!