BaseCalendar
package sun.util.calendar; import java.util.TimeZone; import sun.util.calendar.AbstractCalendar; import sun.util.calendar.CalendarDate; import sun.util.calendar.CalendarUtils; import sun.util.calendar.BaseCalendar.Date; public abstract class BaseCalendar extends AbstractCalendar { public static final int JANUARY = 1; public static final int FEBRUARY = 2; public static final int MARCH = 3; public static final int APRIL = 4; public static final int MAY = 5; public static final int JUNE = 6; public static final int JULY = 7; public static final int AUGUST = 8; public static final int SEPTEMBER = 9; public static final int OCTOBER = 10; public static final int NOVEMBER = 11; public static final int DECEMBER = 12; public static final int SUNDAY = 1; public static final int MONDAY = 2; public static final int TUESDAY = 3; public static final int WEDNESDAY = 4; public static final int THURSDAY = 5; public static final int FRIDAY = 6; public static final int SATURDAY = 7; private static final int BASE_YEAR = 1970; private static final int[] FIXED_DATES = new int[]{719163, 719528, 719893, 720259, 720624, 720989, 721354, 721720, 722085, 722450, 722815, 723181, 723546, 723911, 724276, 724642, 725007, 725372, 725737, 726103, 726468, 726833, 727198, 727564, 727929, 728294, 728659, 729025, 729390, 729755, 730120, 730486, 730851, 731216, 731581, 731947, 732312, 732677, 733042, 733408, 733773, 734138, 734503, 734869, 735234, 735599, 735964, 736330, 736695, 737060, 737425, 737791, 738156, 738521, 738886, 739252, 739617, 739982, 740347, 740713, 741078, 741443, 741808, 742174, 742539, 742904, 743269, 743635, 744000, 744365}; static final int[] DAYS_IN_MONTH = new int[]{31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; static final int[] ACCUMULATED_DAYS_IN_MONTH = new int[]{-30, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; static final int[] ACCUMULATED_DAYS_IN_MONTH_LEAP = new int[]{-30, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; public boolean validate(CalendarDate arg0) { Date arg1 = (Date) arg0; if (arg1.isNormalized()) { return true; } else { int arg2 = arg1.getMonth(); if (arg2 >= 1 && arg2 <= 12) { int arg3 = arg1.getDayOfMonth(); if (arg3 > 0 && arg3 <= this.getMonthLength(arg1.getNormalizedYear(), arg2)) { int arg4 = arg1.getDayOfWeek(); if (arg4 != Integer.MIN_VALUE && arg4 != this.getDayOfWeek(arg1)) { return false; } else if (!this.validateTime(arg0)) { return false; } else { arg1.setNormalized(true); return true; } } else { return false; } } else { return false; } } } public boolean normalize(CalendarDate arg0) { if (arg0.isNormalized()) { return true; } else { Date arg1 = (Date) arg0; TimeZone arg2 = arg1.getZone(); if (arg2 != null) { this.getTime(arg0); return true; } else { int arg3 = this.normalizeTime(arg1); this.normalizeMonth(arg1); long arg4 = (long) arg1.getDayOfMonth() + (long) arg3; int arg6 = arg1.getMonth(); int arg7 = arg1.getNormalizedYear(); int arg8 = this.getMonthLength(arg7, arg6); if (arg4 > 0L && arg4 <= (long) arg8) { arg1.setDayOfWeek(this.getDayOfWeek(arg1)); } else if (arg4 <= 0L && arg4 > -28L) { --arg6; arg8 = this.getMonthLength(arg7, arg6); arg4 += (long) arg8; arg1.setDayOfMonth((int) arg4); if (arg6 == 0) { arg6 = 12; arg1.setNormalizedYear(arg7 - 1); } arg1.setMonth(arg6); } else if (arg4 > (long) arg8 && arg4 < (long) (arg8 + 28)) { arg4 -= (long) arg8; ++arg6; arg1.setDayOfMonth((int) arg4); if (arg6 > 12) { arg1.setNormalizedYear(arg7 + 1); arg6 = 1; } arg1.setMonth(arg6); } else { long arg9 = arg4 + this.getFixedDate(arg7, arg6, 1, arg1) - 1L; this.getCalendarDateFromFixedDate(arg1, arg9); } arg0.setLeapYear(this.isLeapYear(arg1.getNormalizedYear())); arg0.setZoneOffset(0); arg0.setDaylightSaving(0); arg1.setNormalized(true); return true; } } } void normalizeMonth(CalendarDate arg0) { Date arg1 = (Date) arg0; int arg2 = arg1.getNormalizedYear(); long arg3 = (long) arg1.getMonth(); if (arg3 <= 0L) { long arg5 = 1L - arg3; arg2 -= (int) (arg5 / 12L + 1L); arg3 = 13L - arg5 % 12L; arg1.setNormalizedYear(arg2); arg1.setMonth((int) arg3); } else if (arg3 > 12L) { arg2 += (int) ((arg3 - 1L) / 12L); arg3 = (arg3 - 1L) % 12L + 1L; arg1.setNormalizedYear(arg2); arg1.setMonth((int) arg3); } } public int getYearLength(CalendarDate arg0) { return this.isLeapYear(((Date) arg0).getNormalizedYear()) ? 366 : 365; } public int getYearLengthInMonths(CalendarDate arg0) { return 12; } public int getMonthLength(CalendarDate arg0) { Date arg1 = (Date) arg0; int arg2 = arg1.getMonth(); if (arg2 >= 1 && arg2 <= 12) { return this.getMonthLength(arg1.getNormalizedYear(), arg2); } else { throw new IllegalArgumentException("Illegal month value: " + arg2); } } private int getMonthLength(int arg0, int arg1) { int arg2 = DAYS_IN_MONTH[arg1]; if (arg1 == 2 && this.isLeapYear(arg0)) { ++arg2; } return arg2; } public long getDayOfYear(CalendarDate arg0) { return this.getDayOfYear(((Date) arg0).getNormalizedYear(), arg0.getMonth(), arg0.getDayOfMonth()); } final long getDayOfYear(int arg0, int arg1, int arg2) { return (long) arg2 + (long) (this.isLeapYear(arg0) ? ACCUMULATED_DAYS_IN_MONTH_LEAP[arg1] : ACCUMULATED_DAYS_IN_MONTH[arg1]); } public long getFixedDate(CalendarDate arg0) { if (!arg0.isNormalized()) { this.normalizeMonth(arg0); } return this.getFixedDate(((Date) arg0).getNormalizedYear(), arg0.getMonth(), arg0.getDayOfMonth(), (Date) arg0); } public long getFixedDate(int arg0, int arg1, int arg2, Date arg3) { boolean arg4 = arg1 == 1 && arg2 == 1; if (arg3 != null && arg3.hit(arg0)) { return arg4 ? arg3.getCachedJan1() : arg3.getCachedJan1() + this.getDayOfYear(arg0, arg1, arg2) - 1L; } else { int arg5 = arg0 - 1970; long arg6; if (arg5 >= 0 && arg5 < FIXED_DATES.length) { arg6 = (long) FIXED_DATES[arg5]; if (arg3 != null) { arg3.setCache(arg0, arg6, this.isLeapYear(arg0) ? 366 : 365); } return arg4 ? arg6 : arg6 + this.getDayOfYear(arg0, arg1, arg2) - 1L; } else { arg6 = (long) arg0 - 1L; long arg8 = (long) arg2; if (arg6 >= 0L) { arg8 += 365L * arg6 + arg6 / 4L - arg6 / 100L + arg6 / 400L + (long) ((367 * arg1 - 362) / 12); } else { arg8 += 365L * arg6 + CalendarUtils.floorDivide(arg6, 4L) - CalendarUtils.floorDivide(arg6, 100L) + CalendarUtils.floorDivide(arg6, 400L) + (long) CalendarUtils.floorDivide(367 * arg1 - 362, 12); } if (arg1 > 2) { arg8 -= this.isLeapYear(arg0) ? 1L : 2L; } if (arg3 != null && arg4) { arg3.setCache(arg0, arg8, this.isLeapYear(arg0) ? 366 : 365); } return arg8; } } } public void getCalendarDateFromFixedDate(CalendarDate arg0, long arg1) { Date arg3 = (Date) arg0; int arg4; long arg5; boolean arg7; if (arg3.hit(arg1)) { arg4 = arg3.getCachedYear(); arg5 = arg3.getCachedJan1(); arg7 = this.isLeapYear(arg4); } else { arg4 = this.getGregorianYearFromFixedDate(arg1); arg5 = this.getFixedDate(arg4, 1, 1, (Date) null); arg7 = this.isLeapYear(arg4); arg3.setCache(arg4, arg5, arg7 ? 366 : 365); } int arg8 = (int) (arg1 - arg5); long arg9 = arg5 + 31L + 28L; if (arg7) { ++arg9; } if (arg1 >= arg9) { arg8 += arg7 ? 1 : 2; } int arg11 = 12 * arg8 + 373; if (arg11 > 0) { arg11 /= 367; } else { arg11 = CalendarUtils.floorDivide(arg11, 367); } long arg12 = arg5 + (long) ACCUMULATED_DAYS_IN_MONTH[arg11]; if (arg7 && arg11 >= 3) { ++arg12; } int arg14 = (int) (arg1 - arg12) + 1; int arg15 = getDayOfWeekFromFixedDate(arg1); assert arg15 > 0 : "negative day of week " + arg15; arg3.setNormalizedYear(arg4); arg3.setMonth(arg11); arg3.setDayOfMonth(arg14); arg3.setDayOfWeek(arg15); arg3.setLeapYear(arg7); arg3.setNormalized(true); } public int getDayOfWeek(CalendarDate arg0) { long arg1 = this.getFixedDate(arg0); return getDayOfWeekFromFixedDate(arg1); } public static final int getDayOfWeekFromFixedDate(long arg) { return arg >= 0L ? (int) (arg % 7L) + 1 : (int) CalendarUtils.mod(arg, 7L) + 1; } public int getYearFromFixedDate(long arg0) { return this.getGregorianYearFromFixedDate(arg0); } final int getGregorianYearFromFixedDate(long arg0) { long arg2; int arg4; int arg5; int arg6; int arg7; int arg8; int arg9; int arg10; int arg11; if (arg0 > 0L) { arg2 = arg0 - 1L; arg8 = (int) (arg2 / 146097L); arg4 = (int) (arg2 % 146097L); arg9 = arg4 / '躬'; arg5 = arg4 % '躬'; arg10 = arg5 / 1461; arg6 = arg5 % 1461; arg11 = arg6 / 365; arg7 = arg6 % 365 + 1; } else { arg2 = arg0 - 1L; arg8 = (int) CalendarUtils.floorDivide(arg2, 146097L); arg4 = (int) CalendarUtils.mod(arg2, 146097L); arg9 = CalendarUtils.floorDivide(arg4, '躬'); arg5 = CalendarUtils.mod(arg4, '躬'); arg10 = CalendarUtils.floorDivide(arg5, 1461); arg6 = CalendarUtils.mod(arg5, 1461); arg11 = CalendarUtils.floorDivide(arg6, 365); arg7 = CalendarUtils.mod(arg6, 365) + 1; } int arg12 = 400 * arg8 + 100 * arg9 + 4 * arg10 + arg11; if (arg9 != 4 && arg11 != 4) { ++arg12; } return arg12; } protected boolean isLeapYear(CalendarDate arg0) { return this.isLeapYear(((Date) arg0).getNormalizedYear()); } boolean isLeapYear(int arg0) { return CalendarUtils.isGregorianLeapYear(arg0); } }
##################