#include <iostream>
using namespace std;
class Date {
private:
int year, month, day;
public:
Date(int y, int m, int d) {
year = y;
month = m;
day = d;
}
bool leap(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int dton(Date& date) {
int days = 0;
for (int i = 0; i < date.year; i++) {
if (leap(i)) {
days += 366;
} else {
days += 365;
}
}
for (int i = 1; i < date.month; i++) {
if (leap(date.year)) {
days += day_tab[1][i - 1];
} else {
days += day_tab[0][i - 1];
}
}
days += date.day - 1;
return days;
}
Date ntod(int n) {
Date date(0, 1, 1);
while (n >= 365) {
if (leap(date.year)) {
n -= 366;
} else {
n -= 365;
}
date.year++;
}
for (int i = 0; i < 12; i++) {
if (leap(date.year) && n < day_tab[1][i]) {
date.month = i + 1;
date.day = n + 1;
break;
}
if (!leap(date.year) && n < day_tab[0][i]) {
date.month = i + 1;
date.day = n + 1;
break;
}
n -= leap(date.year) ? day_tab[1][i] : day_tab[0][i];
}
return date;
}
Date operator+(int days) {
int d = dton(*this) + days;
return ntod(d);
}
Date operator-(int days) {
int d = dton(*this) - days;
return ntod(d);
}
int operator-(Date& b) {
int days1 = dton(*this);
int days2 = dton(b);
return abs(days1 - days2);
}
static int day_tab[2][12];
int getYear() {
return year;
}
int getMonth() {
return month;
}
int getDay() {
return day;
}
};
int Date::day_tab[2][12] ={
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
int main() {
int choice;
while (true) {
cout << "请选择操作:" << endl;
cout << "1. 计算日期+天数" << endl;
cout << "2. 计算日期-天数" << endl;
cout << "3. 计算日期相差多少天" << endl;
cout << "0. 退出程序" << endl;
cin >> choice;
if (choice == 0) {
break;
}
if (choice == 1) {
int year, month, day, days;
cout << "请输入日期(年 月 日):" << endl;
cin >> year >> month >> day;
cout << "请输入天数:" << endl;
cin >> days;
Date date(year, month, day);
Date result = date + days;
cout << "加" << days << "天后的日期为:" << result.getYear() << "年" << result.getMonth() << "月" << result.getDay() << "日" << endl;
} else if (choice == 2) {
int year, month, day, days;
cout << "请输入日期(年 月 日):" << endl;
cin >> year >> month >> day;
cout << "请输入天数:" << endl;
cin >> days;
Date date(year, month, day);
Date result = date - days;
cout << "减" << days << "天后的日期为:" << result.getYear() << "年" << result.getMonth() << "月" << result.getDay() << "日" << endl;
} else if (choice == 3) {
int year1, month1, day1, year2, month2, day2;
cout << "请输入第一个日期(年 月 日):" << endl;
cin >> year1 >> month1 >> day1;
cout << "请输入第二个日期(年 月 日):" << endl;
cin >> year2 >> month2 >> day2;
Date date1(year1, month1, day1);
Date date2(year2, month2, day2);
int diff = date1 - date2;
cout << "两个日期相差" << diff << "天" << endl;
}
}
return 0;
}