#include <string>
class Date {
public:
int year;
int month;
int day;
Date(int year, int month, int day)
: year(year), month(month), day(day) {
}
bool IsLeap() const {
if (this->year % 4 == 0) {
if (this->year % 100 == 0) {
if (this->year % 400 == 0) {
return true;
} else {
return false;
}
} else {
return true;
}
} else {
return false;
}
return false;
}
std::string ToString() {
std::string output = std::to_string(this->day);
output += ".";
output += std::to_string(this->month);
output += ".";
output += std::to_string(this->year);
return output;
}
Date DaysLater(int days) {
bool ready = false;
int year_out = this->year;
int month_out = this->month;
int day_out = this->day;
int days_check;
day_out += days;
while (!ready) {
switch (month_out) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days_check = 31;
break;
case 4:
case 6:
case 9:
case 11:
days_check = 30;
break;
case 2:
if (IsLeap())
days_check = 29;
else
days_check = 28;
break;
default:
break;
}
if (day_out > days_check) {
day_out -= days_check;
month_out++;
if (month_out > 12) {
year_out++;
month_out = 1;
}
} else {
ready = true;
}
}
Date output(year_out, month_out, day_out);
return output;
}
int DaysLeft(const Date& date) {
int output = 0;
int abs_now = 0;
int abs_then = 0;
abs_now = 365 * this->year + this->year/4 - this->year/100 +
this->year/400 + (153*this->month - 457)/5 + this->day - 306;
abs_then = 365 * date.year + date.year/4 - date.year/100 + date.year/400
+ (153*date.month - 457)/5 + date.day - 306;
output = abs_then - abs_now;
return output;
}
};