日期计算器(date类)

//日期计算器

#include<iostream>
using namespace std;
#include<string>

class Date
{
public:
	Date (int year = 2015, int month = 11, int day = 15)//构造函数
		:_year(year)
		,_month(month)  //初始化列表进行初始化
		,_day(day)
	{
	}
	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;
	}

	void Display1()
	{
		cout<<"日期:"<<_year<<"-"<<_month<<"-"<<_day<<endl;
	}

public:
	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)
	{
		if(_year>d._year)
		{
			return true;
		}
		else if(_year==d._year)
		{
			if(_month>d._month)
			{
				return true;
			}
			else 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 !(*this > d);
	}

	bool Judge_ymd(int year=2015,int month =11,int day=15)//判断有效性
	{
		if(_year<1||_month<0||_month>12
			||_day<1||_day>Judge_day(_year,_month))
			return false;
		return true;
	}

	bool IsLeapYear (int year)//闰年
	{
		if ((year % 4 == 0 && year % 100 != 0)
			|| year % 400 == 0)
			return true;
		return false;
	}

	int YearMonth(Date& d)//月数 ++ 
	{
		++d._month;
		if(d._month==13)
		{
			d._month=1;
			++d._year;
		}
		else
		{
			d._month;
		}
		return d._month;
	}

	int Judge_day(int year,int month)//每月天数
	{
		int MonthDay[12]={31,28,31,30,31,30,31,31,30,31,30,31};
		if(IsLeapYear(year))
		{
			return MonthDay[month-1]+1;
		}
		return MonthDay[month-1];
	}

public:
	void CorrectDate()//转换日期
	{

		while(_day<=0)
		{
			if(_month==1)
			{
				_year--;
				_month=12;
			}
			else
			{
				_month--;
			}
			_day+=Judge_day(_year,_month);
		}
		while(_day>=Judge_day(_year,_month))
		{
			if(_month==12)
			{
				_year++;
				_month=1;
			}
			else
			{
				_month++;
			}
			_day-=Judge_day(_year,_month);
		}
	}

	//计算:日期前后n天的日期

	Date operator+(int day)
	{
		cout<<day<<"天之后:"<<endl;
		Date d(*this);
		d._day+=day;
		d.CorrectDate();
		return d;
	}

	Date operator-(int day)
	{
		cout<<day<<"天之前:"<<endl;
		Date d(*this);
		d._day-=day;
		d.CorrectDate();
		return d;
	}

	Date& operator+=(int day)
	{
		this->_day+=day;
		this->CorrectDate();
		return *this;
	}
	Date& operator-=(int day)
	{

		this->_day-=day;
		this->CorrectDate();
		return *this;
	}
	Date& operator++()//前置++
	{
		*this+=1;
		return *this;
	}
	Date operator++(int)//后置++
	{
		Date tmp(*this);
		*this+=1;
		return tmp;
	}

	//计算:两日期之间天数
	int operator-(Date& d)
	{
		int days=0;
		Date d1=*this;
		Date d2=d;
		cout<<"两日期间天数:"<<endl;
		if(d1<d2)//d2较小
		{
			d1=d;
			d2=*this;
		}

		while(d1 != d2)
		{
			days++;
		}

		return days;
	}

	friend istream& operator>>(istream& in, Date& d);
	friend ostream& operator<<(ostream& out, Date& d);
private:
	int _year;
	int _month;
	int _day;
};

istream& operator>>(istream& in, Date& d)
{
	in>>d._year;
	in>>d._month;
	in>>d._day;
	return in;
}
ostream& operator<<(ostream& out, Date& d)
{
	out<<d._year<<"-"<<d._month<<"-"<<d._day<<endl;
	return out;
}

void DisplayMenu()
{
	cout<<"*************************************"<<endl;
	cout<<"*********    万 年 历    ************"<<endl;
	cout<<"*************************************"<<endl;
	cout<<"****   1 计算日期前/后 n天的日期  ***"<<endl;
	cout<<"****   2 计算两日期之间天数   *******"<<endl;
	cout<<"****   0 退出      ******************"<<endl;
	cout<<"*************************************"<<endl;

}

int main()
{
	int input=0,flag=1;
	Date d1;
	Date d2;

	while(flag)
	{
		DisplayMenu();
		cout<<"请选择:"<<endl;
		cin>>input;

		switch(input)
		{
		case 1:
			{
		next1:
				int k=0;
				cout<<"请输入日期:"<<endl;
				cin>> d1;
				if(d1.Judge_ymd()==false)
				{
					cout<<"非法日期,请重新输入"<<endl;
					goto next1;
				}
				cout<<"请输入之后的天数:"<<endl;
				cin>>k;
				(d1+k).Display1();
				break;
			}
		case 2:
			{
		next2:
				int days=0;
				cout<<"请输入日期1:"<<endl;
				cin>> d1;
				if(d1.Judge_ymd()==false)
				{
					cout<<"非法日期,请重新输入"<<endl;
					goto next2;
				}

		next3:
				cout<<"请输入日期2:"<<endl;
				cin>> d2;
				if(d2.Judge_ymd()==false)
				{
					cout<<"非法日期,请重新输入"<<endl;
					goto next3;
				}
				days=d1-d2;
				cout<<"相差天数:"<<days<<endl;
				break;
			}
		case 0:
			{
				cout<<"退出"<<endl;
				break;
			}
		default:
			{
				cout<<"输入错误,请重新输入"<<endl;
				break;
			}
		}
		if(input==0)
		{
			flag=0;
		}
		else
		{
			flag=1;
		}
	}
	return 0;
}
时间: 2024-11-05 10:23:51

日期计算器(date类)的相关文章

【C++】日期类+日期万年历+日期计算器

对于日期类,我们主要实现一下日期类的基本函数,构造,拷贝构造,运算符的重载,析构.当然这里运算符的重载需要实现的还是挺多的,如:=.<.>.<=.>=.等 #include <iostream> using namespace std; class Date { public:     Date(int year = 1990, int month = 1, int day = 1)     {         _year = year;         _month 

包装类、Date类、SimpleDateFormat类(基本数据类型&lt;--&gt;String&lt;--&gt;日期/时间)

基本数据类型-->String "+"字符串连接符 基本数据类型<--String 基本数据类型 包装类 String-->xxx xxx parseXxx(String s) byte  Byte byte parseByte(String s) short   Short short parseShort(String s) int  Integer int parseInt(String s) long Long long parseLong(String s)

时间日期处理date,Calendar类

1.         Date类(该类现在很少用了) l         Date类对象的创建: n         创建一个当前时间 //默认是创建一个代表系统当前日期的Date对象 Date d = new Date(); n         创建一个我们指定的时间的Date对象: 下面是使用带参数的构造方法,可以构造指定日期的Date类对象,Date类中年份的参数应该是实际需要代表的年份减去1900,实际需要代表的月份减去1以后的值. //创建一个代表2009年6月12号的Date对象 D

Date 类 02

Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. 1.使用Date类代表当前系统时间 Date d = new Date(); System.out.println(d); 使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下: Sun Ma

JAVA的Date类与Calendar类

Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. 1.使用Date类代表当前系统时间 Date d = new Date(); System.out.println(d); 使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下: Sun Ma

slz-关于Date类

在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用.1.使用Date类代表当前系统时间Date d = new Date();System.out.println(d);使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下:Sun Mar 08 16:35:

日期计算器

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<Windows.h> using namespace std; class Date { public: Date(int _year, int _month, int _day);  //构造函数 void ShowDate() { cout << year << "-" << month <<

JavaScript基础——引用类型(二)日期类型Date、正则表达式类型RegExp

Date类型 ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(CoordinatedUniversal Time,国际协调时间)1970年1月1日午夜(零时)开始经过的毫秒数来保存日期.在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285 616年. 要创建一个日期对象,使用new 操作符和Date构造函数即可,如: var now = new Date(); 在调

java date类型和calendar类型区别

Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date类的使用. 1.使用Date类代表当前系统时间 Date d = new Date(); System.out.println(d); 使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下: Sun Ma

Date类和Calendar类

public class DateTest01 { public static void main(String[] args) { //获取并输出当前年月日星期 Date d = new Date(); //输出:Tue Jul 04 15:00:46 CST 2017 System.out.println(d); System.out.println("------------------------"); System.out.println("使用Date类指定时间&