实现Date Class

//Date.h
#ifndef DATE_H
#define DATE_H

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

/* Date Class */
class Date {
public:
	Date() :year(1990), month(1), day(1) {};
	Date(int year, int month, int day) :year(year), month(month), day(day) {}
	void setDate(int ayear, int amonth, int aday);
	void setYear(int year) {
		this->year = year;
	}
	int getYear() {
		return this->year;
	}
	void setMonth(int month) {
		this->month = month;
	}
	int getMonth() {
		return this->month;
	}
	void setDate(int day) {
		this->day = day;
	}
	int getDay() {
		return this->day;
	}
	void setSeparator(char separator) {
		this->separator = separator;
	}

	void printFullYear();          //以YYYY-MM-DD的形式打印,比如2011-01-08
	void printStandardYear();      //以YY-MM-DD的形式打印,比如11-01-08
	/* 计算当前日期与参数日期之间相差几个整年,仅考虑参数日期比当前日期晚的情况。*/
	int fullYearsTo(Date& date);
	/* 计算当前日期与参数日期之间相差多少天(考虑闰年),如果参数日期在当前日期之前,返回负数。*/
	int daysTo(Date& date);
	//int totalDays(int year, int month, int day);
	int getDayOfYear(int year, int month, int day)const;    //计算当前日期是本年的第几天
	int getLeftDaysYear(int year, int month, int day)const; //计算当前日期距本年结束还有几天,不包括当前日期这一天

	bool operator < (const Date& date2)const;
	bool operator < (Date& date2);
	bool operator > (const Date& date2)const;
	bool operator > (Date& date2);
	bool operator == (const Date& date2)const;
	int operator - (const Date& date2)const;

private:
	int year;;
	int month;
	int day;
	char separator = '-';  //日期分隔符
	static const int DAYS_PER_MONTH[12];
	/* 根据年和月,判断参数日期是否合法。如果合法,返回day,否则返回1。*/
	int checkDay(int day);
	bool isLeapyear(int year) const;
};

const int Date::DAYS_PER_MONTH[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

bool Date::isLeapyear(int year)const {
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
		return true;
	} else {
		return false;
	}
}

int Date::checkDay(int day) {
	if (isLeapyear(year) && month == 2) {
		if (day >= 1 && day <= 29) {
			return day;
		} else {
			return 1;
		}
	} else {
		if (day >= 1 && day <= DAYS_PER_MONTH[month - 1]) {
			return day;
		} else {
			return 1;
		}
	}
}

void Date::setDate(int ayear, int amonth, int aday) {
	year = ayear;
	if (amonth < 1 || amonth > 12) {
		month = 1;
	} else {
		month = amonth;
	}
	day = checkDay(aday);
}

void Date::printFullYear() {
	cout << setfill('0') << setw(4) << year << separator
		<< setfill('0') << setw(2) << month << separator
		<< setfill('0') << setw(2) << day;
}

void Date::printStandardYear() {
	int standardyear = year % 100;
	cout << setfill('0') << setw(2) << standardyear << separator
		<< setfill('0') << setw(2) << month << separator
		<< setfill('0') << setw(2) << day;
}

int Date::fullYearsTo(Date& date) {
	int yearDifference = date.year - year - 1;
	return yearDifference;
}

//int Date::daysTo(Date& date) {
//	return totalDays(date.year, date.month, date.day) - totalDays(year, month, day);
//}
//
//int Date::totalDays(int year, int month, int day) {
//	int years = year - 1;
//	int total = years * 365 + years / 4 - years / 100 + years / 400;
//	for (int i = 1; i < month; i++) {
//		total += DAYS_PER_MONTH[i - 1];
//	}
//	total += day;
//	if (isLeapyear(year) && month > 2) {
//		total++;
//	}
//	return total;
//}

int Date::daysTo(Date& date) {
	int dayDifference = 0;
	if (year < date.year) {
		for (int i = year + 1; i < date.year; i++) {
			dayDifference += 365;
			if (isLeapyear(i)) {
				dayDifference++;
			}
		}
		dayDifference += getDayOfYear(date.year, date.month, date.day) + getLeftDaysYear(year, month, day);
	} else if (year > date.year) {
		for (int i = date.year + 1; i < year; i++) {
			dayDifference += 365;
			if (isLeapyear(i)) {
				dayDifference++;
			}
		}
		dayDifference += getDayOfYear(year, month, day) + getLeftDaysYear(date.year, date.month, date.day);
		dayDifference = -dayDifference;
	} else {
		dayDifference = getDayOfYear(date.year, date.month, date.day) - getDayOfYear(year, month, day);
	}
	return dayDifference;
}

bool Date::operator < (const Date& date2)const {
	if (year > date2.year) {
		return false;
	} else if (year < date2.year) {
		return true;
	} else {
		if (month > date2.month) {
			return false;
		} else if (month < date2.month) {
			return true;
		} else {
			if (day < date2.day) {
				return true;
			} else {
				return false;
			}
		}
	}
}

bool Date::operator < (Date& date2) {
	if (year > date2.year) {
		return false;
	} else if (year < date2.year) {
		return true;
	} else {
		if (month > date2.month) {
			return false;
		} else if (month < date2.month) {
			return true;
		} else {
			if (day < date2.day) {
				return true;
			} else {
				return false;
			}
		}
	}
}

bool Date::operator == (const Date& date2)const {
	if (year == date2.year && month == date2.month && day == date2.day) {
		return true;
	} else {
		return false;
	}
}

bool Date::operator > (const Date& date2)const {
	if (*this < date2 || *this == date2) {
		return false;
	} else {
		return true;
	}
}

bool Date::operator > (Date& date2) {
	if (*this < date2 || *this == date2) {
		return false;
	} else {
		return true;
	}
}

int Date::operator - (const Date& date2)const {
	int difference = 0;
	if (*this < date2) {
		for (int i = year + 1; i < date2.year; i++) {
			difference += 365;
			if (isLeapyear(i)) {
				difference++;
			}
		}
		difference += getDayOfYear(date2.year, date2.month, date2.day) + getLeftDaysYear(year, month, day);
		difference = -difference;
	} else if (*this > date2) {
		for (int i = date2.year + 1; i < year; i++) {
			difference += 365;
			if (isLeapyear(i)) {
				difference++;
			}
		}
		difference += getLeftDaysYear(date2.year, date2.month, date2.day) + getDayOfYear(year, month, day);
	}
	return difference;
}

int Date::getDayOfYear(int year, int month, int day)const {
	int total = 0;
	for (int i = 1; i < month; i++) {
		total += DAYS_PER_MONTH[i - 1];
	}
	if (isLeapyear(year) && month > 2) {
		total++;
	}
	total += day;
	return total;
}

int Date::getLeftDaysYear(int year, int month, int day)const {
	int totalLeft = 365;
	if (isLeapyear(year)) {
		totalLeft++;
	}
	totalLeft = totalLeft - getDayOfYear(year, month, day);
	return totalLeft;
}

#endif
posted @ 2022-08-30 20:51  catting123  阅读(37)  评论(0)    收藏  举报