86 lines
2.2 KiB
C++
86 lines
2.2 KiB
C++
#include <ctime> // för tid och localtime
|
|
#include <iomanip> // för setw och setfill
|
|
#include <sstream> // 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;
|
|
}
|