#pragma once
#include <string>
using namespace std;
class Date {
public:
Date(int year, int month, int day) {
Date::date_year = year;
Date::date_month = month;
Date::date_day = day;
}
bool IsLeap() const {
if (date_year % 4 == 0) {
if (date_year % 100 == 0) {
if (date_year % 400 == 0) {
return true;
} else {
return false;
}
} else {
return true;
}
}
return false;
}
string ToString() {
string string_day = to_string(date_day);
string string_month = to_string(date_month);
string string_year = to_string(date_year);
if (date_day < 10) {
string_day = "0" + string_day;
}
if (date_month < 10) {
string_month = "0" + string_month;
}
if (date_year < 10) {
string_year = "000" + string_year;
} else if (date_year >= 10 && date_year < 100) {
string_year = "00" + string_year;
} else if (date_year >= 100 && date_year < 1000) {
string_year = "0" + string_year;
}
return string_day + "." + string_month + "." + string_year;
}
Date DaysLater(int days) {
if (date_day + days == date_day) {
return {date_year, date_month, date_day};
} else {
while (days > 0) {
days--;
if (date_month == 2 && date_day == 28) {
if (Date{date_year, date_month, date_day}.IsLeap()) {
date_day++;
}
} else if (date_month == 12 && date_day == 31) {
date_day = 1;
date_month = 1;
date_year++;
} else if (date_day < count_of_days[date_month]) {
date_day++;
} else {
date_day = 1;
date_month++;
}
}
}
return {date_year, date_month, date_day};
}
int DaysLeft(const Date& date) {
int counter = 0;
while ((date_year != date.date_year) && \
(date_month != date.date_month) && \
(date_day != date.date_day)) {
if (date_month == 2 && date_day == 28) {
if (Date{date_year, date_month, date_day}.IsLeap()) {
counter++;
date_day++;
}
} else if (date_month == 12 && date_day == 31) {
date_day = 1;
date_month = 1;
date_year++;
counter++;
} else if (date_day < count_of_days[date_month]) {
date_day++;
counter++;
} else {
date_day = 1;
date_month++;
counter++;
}
}
return counter;
}
private:
int date_year;
int date_month;
int date_day;
int[13] count_of_days = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
};