其他分享
首页 > 其他分享> > BaseCalendar

BaseCalendar

作者:互联网

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);
	}
}

  

 

 

##################

标签:int,arg1,arg6,final,arg0,BaseCalendar,public
来源: https://www.cnblogs.com/herd/p/16268451.html