#pragma once #include #include class Date { public: Date(int year, int month, int day) { y = year; m = month; d = day; } bool IsLeap() const { bool a = true; if (y % 400 != 0 && y % 100 == 0) a = false; if (y % 4 != 0) a = false; return a; } std::string ToString() const { std::string a = d < 10 ? "0" + std::to_string(d) : std::to_string(d); a += "." + (m < 10 ? "0" + std::to_string(m) : std::to_string(m)); a += "."; a += (y < 1000 ? y < 100 ? y < 10 ? "000" : "00" : "0" : ""); a += std::to_string(y); return a; } Date DaysLater(int days) const { int64_t yy = y, mm = m, dd = d + days; while (true) { if (mm > 12) { mm = 1; yy++; } if (mm == 2 && ((dd > 28 && yy % 4 != 0) || (dd > 29 && yy % 4 == 0))) { dd -= y % 4 == 0 ? 29 : 28; mm++; continue; } if (dd > 30 && (mm == 4 || mm == 6 || mm == 9 || mm == 11)) { dd -= 30; mm++; continue; } if (dd > 31 && std::find(m31.begin(), m31.end(), m) != m31.end()) { dd -= 31; mm++; continue; } break; } Date a(yy, mm, dd); return a; } int DaysLeft(const Date& date) const { int64_t v = 0, dif_d = - d + date.d; for (int64_t i = y; i < date.y; i++) { if (i % 4 == 0) v++; } for (int64_t i = 1; i < m; i++) { if (std::find(m31.begin(), m31.end(), i) != m31.end()) dif_d -= 31; else if (i == 4 || i == 6 || i == 9 || i == 11) dif_d -= 30; else dif_d -= y % 4 == 0 ? 29 : 28; } for (int64_t i = 1; i < date.m; i++) { if (std::find(m31.begin(), m31.end(), i) != m31.end()) dif_d += 31; else if (i == 4 || i == 6 || i == 9 || i == 11) dif_d += 30; else dif_d += date.y % 4 == 0 ? 29 : 28; } return 365 * (date.y - y) + v + dif_d; } int64_t y, m, d; std::vector m31 = { 1, 3, 5, 7, 8, 10, 12}; };