实现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 @   catting123  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示