int whenDate(Date d1, Date d2) { if (validMonth(d1) == -1 || validDay(d1) == -1 || validYear(d1) == -1) return -2; //returns -2 if one of the dates are invalid if (validMonth(d2) == -1 || validDay(d2) == -1 || validYear(d2) == -1) return -2; if (d1.year > d2.year) return 1; else if (d1.year < d2.year) return -1; else if (d1.year == d2.year) { if (d1.month > d2.month) return 1; else if (d1.month < d2.month) return -1; else if (d1.month == d2.month) { if (d1.day > d2.day) return 1; else if (d1.day < d2.day) return -1; else if (d1.day == d2.day) return 0; } } }
Date::Date(int y, int m, int d) { year = Year(((y > 0) ? y : 1)); month = Month(m >= 1 && m <= 12 ? m : 1); month.setNumberOfDays(getDaysOfMonth(year.getYear(), month.getMonth())); day = Day(validDay(year.getYear(), month.getMonth(), d) ? d : 1); }
Date & Date::operator+=(long days) { if (days < 0) return (*this -= -days); int currYear = year.getYear(); int currMonth = month.getMonth(); int currDay = day.getDay(); int offset = 0; while (!validDay(currYear, currMonth, days)) { offset = getDaysOfMonth(currYear, currMonth); days -= offset; if (++currMonth > 12) { currMonth = 1; currYear++; } } currDay += days; if (!validDay(currYear, currMonth, currDay)) { offset = getDaysOfMonth(currYear, currMonth); currDay -= offset; if (++currMonth > 12) { currMonth = 1; currYear++; } } if (currYear < 1) currYear = currMonth = currDay = 1; year.setYear(currYear); month.setMonth(currMonth); month.setNumberOfDays(getDaysOfMonth(currYear, currMonth)); day.setDay(currDay); return *this; }
Date & Date::operator-=(long days) { if (days < 0) return (*this += -days); int currYear = year.getYear(); int currMonth = month.getMonth(); int currDay = day.getDay(); int offset = 0; while (!validDay(currYear, currMonth, days)) { if (--currMonth < 1) { currMonth = 12; currYear--; } offset = getDaysOfMonth(currYear, currMonth); days -= offset; } currDay -= days; if (currDay < 1) { if (--currMonth < 1) { currMonth = 12; currYear--; } offset = getDaysOfMonth(currYear, currMonth); currDay += offset; } if (currYear < 1) currYear = currMonth = currDay = 1; year.setYear(currYear); month.setMonth(currMonth); month.setNumberOfDays(getDaysOfMonth(currYear, currMonth)); day.setDay(currDay); return *this; }
void Date::setDay(int d) { if (validDay(year.getYear(), month.getMonth(), d)) day.setDay(d); }