| |
| #ifndef DATE_H |
| #define DATE_H |
| |
| #include <iostream> |
| #include <iomanip> |
| #include <string> |
| using namespace std; |
| |
| |
| 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(); |
| void printStandardYear(); |
| |
| int fullYearsTo(Date& date); |
| |
| int daysTo(Date& date); |
| |
| 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]; |
| |
| 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) { |
| 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统