#include // för tid och localtime #include // för setw och setfill #include // för inputhantering #include "date.h" int Date::daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // Konstruktor: dagens datum Date::Date() { time_t timer = time(0); // tid i sekunder sedan 1970-01-01 tm* locTime = localtime(&timer); // lokal tid year = 1900 + locTime->tm_year; month = 1 + locTime->tm_mon; day = locTime->tm_mday; } // Konstruktor: specifikt datum Date::Date(int y, int m, int d) : year(y), month(m), day(d) {} // Get-funktioner int Date::getYear() const { return year; } int Date::getMonth() const { return month; } int Date::getDay() const { return day; } // Gå till nästa dag void Date::next() { day++; if (day > daysPerMonth[month - 1] + (month == 2 && isLeapYear(year))) { day = 1; month++; if (month > 12) { month = 1; year++; } } } // Kontrollera om ett år är ett skottår bool Date::isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } // Overloaded operator<< (output) std::ostream& operator<<(std::ostream& os, const Date& date) { os << std::setw(4) << std::setfill('0') << date.getYear() << '-' << std::setw(2) << std::setfill('0') << date.getMonth() << '-' << std::setw(2) << std::setfill('0') << date.getDay(); return os; } // Overloaded operator>> (input) std::istream& operator>>(std::istream& is, Date& date) { std::string input; is >> input; std::istringstream iss(input); char dash1, dash2; int y, m, d; if (iss >> y >> dash1 >> m >> dash2 >> d && dash1 == '-' && dash2 == '-') { // Validera månad och dag if (m >= 1 && m <= 12) { int maxDay = Date::daysPerMonth[m - 1]; if (m == 2 && Date::isLeapYear(y)) { maxDay = 29; // Februari har 29 dagar under skottår } if (d >= 1 && d <= maxDay) { date = Date(y, m, d); // Sätt datumet om det är giltigt return is; } } } // Ogiltig inmatning is.setstate(std::ios_base::failbit); return is; }