}
public int getYear() {
return y;
}
public int getDay() {
return d;
}
public int getMonth() {
return m;
}
public boolean isLeap() {
return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);
}
public int weekday() {
int yy = y, cc, dd = d, mm = m;
if (mm < 3) {
yy--;
mm += 10;
} else {
mm -= 2;
}
int mmm = mm;
cc = yy / 100;
yy = yy % 100;
int A = dd + (int) (2.6 * mmm - 0.2) + yy + (yy / 4) + (cc / 4) - 2
* cc;
int W = A % 7;
if (W < 0)
W += 7;
return W;
}
public String dateString() {
return String.format("%s, %s %d%s %d", dayName(weekday()),
monthName(m), d, numberEnding(), y);
}
private String numberEnding() {
if (d % 10 == 1 && d != 11)
return "st";
if (d % 10 == 2 && d != 12)
return "nd";
if (d % 10 == 3 && d != 13)
return "rd";
return "th";
}
private String monthName(int month) {
switch (month) {
case 1:
return "January";
case 2:
return "February";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
default:
return "invalid month (" + month + ")";
}
}
private String dayName(int w) {
switch (w) {
case 0:
return "Sunday";
case 1:
return "Monday";
case 2:
return "Tuesday";
case 3:
return "Wednesday";
case 4:
return "Thursday";
case 5:
return "Friday";
case 6:
return "Saturday";
default:
return "invalid day (" + w + ")";
}
}
public void addDay(int n) {
setJulian(julianDayNumber() + n);
}
public void addMonth(int i) {
setJulian(julianDayNumber(y, m + i, d));
}
public void addYear(int i) {
setJulian(julianDayNumber(y + i, m, d));
}
public static int julianDayNumber(int y, int m, int d) {
y += m / 12;
m %= 12;
int a = (14 - m) / 12;
int yy = (y) + 4800 - a;
int mm = m + 12 * a - 3;
int jdn = d + (153 * mm + 2) / 5 + 365 * yy + yy / 4 - yy / 100 + yy
/ 400 - 32045;
return jdn;
}
public int julianDayNumber() {
return julianDayNumber(y, m, d);
}
public static int lil2jul(int lil) {
return lil + 2299160;
}
public static int jul2lil(int jul) {
return jul - 2299160;
}
public int lilianDayNumber() {
return jul2lil(julianDayNumber());
}
public static int lilianDayNumber(int y, int m, int d) {
return jul2lil(julianDayNumber(y, m, d));
}
public void setJulian(int jul) {
jul = Math.max(jul, julianDayNumber(1582, 10, 15));
jul = Math.min(jul, julianDayNumber(2199, 12, 31));
int J = (int) Math.floor(jul + 0.5);
int j = J + 32044;
int g = j / 146097;
int dg = j % 146097;
int c = ((dg / 36524 + 1) * 3) / 4;
int dc = dg - c * 36524;
int b = dc / 1461;
int db = dc % 1461;
int a = ((db / 365 + 1) * 3) / 4;
int da = db - a * 365;
int y = g * 400 + c * 100 + b * 4 + a;
int m = (da * 5 + 308) / 153 - 2;
int d = da - ((m + 4) * 153) / 5 + 122;
int Y = y - 4800 + (m + 2) / 12;
int M = (m + 2) % 12 + 1;
int D = d + 1;
this.d = D;
this.m = M;
this.y = Y;
}
public String numericString() {
return String.format("%02d.%02d.%04d", d, m, y);
}
@Override
public int compareTo(Date d) {
return lilianDayNumber() - d.lilianDayNumber();
}
public boolean scan() {
Scanner sc = new Scanner(System.in);
System.out.println("enter date (y m d)");
int y = Integer.parseInt(sc.nextLine()), m = Integer.parseInt(sc.nextLine()), d = Integer.parseInt(sc.nextLine());
if (julianDayNumber(y, m, d) > julianDayNumber(2199, 12, 31))
return false;
if (julianDayNumber(y, m, d) < julianDayNumber(1582, 10, 15))
return false;
setJulian(julianDayNumber(y, m, d));
sc.close();
return true;
}
@Override
public String toString() {
return String.format("%02d.%02d.%04d", d, m, y);
}
}