labs-edaf30/lab4/date.cc

87 lines
2.2 KiB
C++
Raw Normal View History

2024-12-11 15:54:56 +01:00
#include <ctime> // för tid och localtime
#include <iomanip> // för setw och setfill
#include <sstream> // för inputhantering
2021-10-27 15:15:47 +02:00
#include "date.h"
int Date::daysPerMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
2024-12-11 15:54:56 +01:00
// Konstruktor: dagens datum
2021-10-27 15:15:47 +02:00
Date::Date() {
2024-12-11 15:54:56 +01:00
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;
2021-10-27 15:15:47 +02:00
}
2024-12-11 15:54:56 +01:00
// Konstruktor: specifikt datum
Date::Date(int y, int m, int d) : year(y), month(m), day(d) {}
2021-10-27 15:15:47 +02:00
2024-12-11 15:54:56 +01:00
// Get-funktioner
2021-10-27 15:15:47 +02:00
int Date::getYear() const {
2024-12-11 15:54:56 +01:00
return year;
2021-10-27 15:15:47 +02:00
}
int Date::getMonth() const {
2024-12-11 15:54:56 +01:00
return month;
2021-10-27 15:15:47 +02:00
}
int Date::getDay() const {
2024-12-11 15:54:56 +01:00
return day;
2021-10-27 15:15:47 +02:00
}
2024-12-11 15:54:56 +01:00
// Gå till nästa dag
2021-10-27 15:15:47 +02:00
void Date::next() {
2024-12-11 15:54:56 +01:00
day++;
if (day > daysPerMonth[month - 1] + (month == 2 && isLeapYear(year))) {
day = 1;
month++;
if (month > 12) {
month = 1;
year++;
}
}
2021-10-27 15:15:47 +02:00
}
2024-12-11 15:54:56 +01:00
// 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;
}