package proj3; public class Date implements Comparable { private static final int[] MAX_DAY_OF_MONTH = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; private static final int[] MAX_DAY_OF_MONTH_LEAP = { 31, 29, 31, 30, 31, 30, 31, 30, 31, 31, 30, 31 }; private static final String[] MONTH_NAMES = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; private int year; private int month; private int dayOfMonth; private boolean valid; public Date(int year, int month, int dayOfMonth) { this.year = year; this.month = month; this.dayOfMonth = dayOfMonth; int daysInMonth = getDaysInMonth(month, year); if ((dayOfMonth <=0) || (daysInMonth == 0)) valid = false; else valid = dayOfMonth <= daysInMonth; } public int getYear() { return year; } public int getMonth() { return month; } public int getDayOfMonth() { return dayOfMonth; } public boolean isValid() { return valid; } private static boolean isLeapYear(int year) { if (year % 100 == 0) return year % 400 == 0; return year % 4 == 0; } private static int getDaysInMonth(int month, int year) { if (year < 1600) return 0; if ((month <= 0) || (month > 12)) return 0; int[] daysInMonth = MAX_DAY_OF_MONTH; if (isLeapYear(year)) daysInMonth = MAX_DAY_OF_MONTH_LEAP; return daysInMonth[month - 1]; } public int compareTo(Object other) { Date otherDate = (Date) other; if (year != otherDate.year) return year - otherDate.year; if (month != otherDate.month) return month - otherDate.month; return dayOfMonth - otherDate.dayOfMonth; } public String toString() { String monthName; String invalidString = ""; if ((month < 0) || (month > 12)) monthName = "xxx"; else monthName = MONTH_NAMES[month -1]; if (!valid) invalidString = ", invalid"; return monthName + " " + dayOfMonth + ", " + year + invalidString; } }