public class Date { private int day; private int month; private int year; public Date(int year, int month, int day) { if (!validDate(year, month, day)) { throw new IllegalArgumentException("Not a valid date"); } this.day = day; this.month = month; this.year = year; } public void incrementOneDay() { day += 1; if (day == 32 && month == 1) { day = 1; month = 2; } else if (day == 29 && month == 2 && !isLeapyear(year)) { day = 1; month = 3; } else if (day == 30 && month == 2 && isLeapyear(year)) { day = 1; month = 3; } else if (day == 32 && month == 3) { day = 1; month = 4; } else if (day == 31 && month == 4) { day = 1; month = 5; } else if (day == 32 && month == 5) { day = 1; month = 6; } else if (day == 31 && month == 6) { day = 1; month = 7; } else if (day == 32 && month == 7) { day = 1; month = 8; } else if (day == 32 && month == 8) { day = 1; month = 9; } else if (day == 31 && month == 9) { day = 1; month = 10; } else if (day == 32 && month == 10) { day = 1; month = 11; } else if (day == 31 && month == 11) { day = 1; month = 12; } else if (day == 32 && month == 12) { day = 1; month = 1; year += 1; } } public void incrementNDays(int n) { for (int i = 1; i <= n; i++) { incrementOneDay(); } } public void decrementOneDay() { day -= 1; if (day == 0) { if (month == 1) { day = 31; month = 12; year += -1; } else if (month == 2) { day = 31; month = 1; } else if (month == 3) { if (isLeapyear(year)) { day = 29; month = 2; } else { day = 28; month = 2; } } else if (month == 4) { day = 31; month = 3; } else if (month == 5) { day = 30; month = 4; } else if (month == 6) { day = 31; month = 5; } else if (month == 7) { day = 30; month = 6; } else if (month == 8) { day = 31; month = 7; } else if (month == 9) { day = 31; month = 8; } else if (month == 10) { day = 30; month = 9; } else if (month == 11) { day = 31; month = 10; } else if (month == 12) { day = 30; month = 11; } } } public void decrementNDays(int n) { for (int i = 1; i <= n; i++) { decrementOneDay(); } } public static boolean isLeapyear(int year) { return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0); } public static int daysBetweenDates(Date dateOne, Date dateTwo) { int numDays = 0; boolean date1Smaller = true; Date date1 = new Date(dateOne.getYear(), dateOne.getMonth(), dateOne.getDay()); Date date2 = new Date(dateTwo.getYear(), dateTwo.getMonth(), dateTwo.getDay()); if (date1.getYear() > date2.getYear()) { date1Smaller = false; } else if (date1.getYear() < date2.getYear()) { date1Smaller = true; } else if (date1.getMonth() < date2.getMonth()) { date1Smaller = true; } else if (date1.getMonth() > date2.getMonth()) { date1Smaller = false; } else if (date1.getDay() < date2.getDay()) { date1Smaller = true; } else if (date1.getDay() > date2.getDay()) { date1Smaller = false; } else { return 0; } while (!date1.toString().equals(date2.toString())) { numDays++; if (date1Smaller) { date1.incrementOneDay(); } else { date1.decrementOneDay(); } } return numDays; } public static boolean validDate(int year, int month, int day) { if (day < 1 || day > 31) { return false; } if (month < 1 || month > 12) { return false; } if (year < 0) { return false; } if (day == 31 && (month == 2 || month == 4 || month == 6 || month == 9 || month == 11)) { return false; } if (day > 28 && month == 2 && !isLeapyear(year)) { return false; } if (day > 29 && month == 2 && isLeapyear(year)) { return false; } return true; } public int getMonth() { return month; } public int getYear() { return year; } public int getDay() { return day; } public String toString() { String dateString = year + "/" + month + "/" + day; return dateString; } }