1 16 package org.joda.time.chrono; 17 18 import org.joda.time.Chronology; 19 import org.joda.time.DateTimeConstants; 20 21 34 abstract class BasicGJChronology extends BasicChronology { 35 36 37 private static final long serialVersionUID = 538276888268L; 38 39 private static final int[] MIN_DAYS_PER_MONTH_ARRAY = { 43 31,28,31,30,31,30,31,31,30,31,30,31 44 }; 45 private static final int[] MAX_DAYS_PER_MONTH_ARRAY = { 46 31,29,31,30,31,30,31,31,30,31,30,31 47 }; 48 private static final long[] MIN_TOTAL_MILLIS_BY_MONTH_ARRAY; 49 private static final long[] MAX_TOTAL_MILLIS_BY_MONTH_ARRAY; 50 private static final long FEB_29 = (31L + 29 - 1) * DateTimeConstants.MILLIS_PER_DAY; 51 52 static { 53 MIN_TOTAL_MILLIS_BY_MONTH_ARRAY = new long[12]; 54 MAX_TOTAL_MILLIS_BY_MONTH_ARRAY = new long[12]; 55 56 long minSum = 0; 57 long maxSum = 0; 58 for (int i = 0; i < 11; i++) { 59 long millis = MIN_DAYS_PER_MONTH_ARRAY[i] 60 * (long)DateTimeConstants.MILLIS_PER_DAY; 61 minSum += millis; 62 MIN_TOTAL_MILLIS_BY_MONTH_ARRAY[i + 1] = minSum; 63 64 millis = MAX_DAYS_PER_MONTH_ARRAY[i] 65 * (long)DateTimeConstants.MILLIS_PER_DAY; 66 maxSum += millis; 67 MAX_TOTAL_MILLIS_BY_MONTH_ARRAY[i + 1] = maxSum; 68 } 69 } 70 71 74 BasicGJChronology(Chronology base, Object param, int minDaysInFirstWeek) { 75 super(base, param, minDaysInFirstWeek); 76 } 77 78 int getMonthOfYear(long millis, int year) { 80 88 int i = (int)((millis - getYearMillis(year)) >> 10); 89 90 93 return 94 (isLeapYear(year)) 95 ? ((i < 182 * 84375) 96 ? ((i < 91 * 84375) 97 ? ((i < 31 * 84375) ? 1 : (i < 60 * 84375) ? 2 : 3) 98 : ((i < 121 * 84375) ? 4 : (i < 152 * 84375) ? 5 : 6)) 99 : ((i < 274 * 84375) 100 ? ((i < 213 * 84375) ? 7 : (i < 244 * 84375) ? 8 : 9) 101 : ((i < 305 * 84375) ? 10 : (i < 335 * 84375) ? 11 : 12))) 102 : ((i < 181 * 84375) 103 ? ((i < 90 * 84375) 104 ? ((i < 31 * 84375) ? 1 : (i < 59 * 84375) ? 2 : 3) 105 : ((i < 120 * 84375) ? 4 : (i < 151 * 84375) ? 5 : 6)) 106 : ((i < 273 * 84375) 107 ? ((i < 212 * 84375) ? 7 : (i < 243 * 84375) ? 8 : 9) 108 : ((i < 304 * 84375) ? 10 : (i < 334 * 84375) ? 11 : 12))); 109 } 110 111 119 int getDaysInYearMonth(int year, int month) { 120 if (isLeapYear(year)) { 121 return MAX_DAYS_PER_MONTH_ARRAY[month - 1]; 122 } else { 123 return MIN_DAYS_PER_MONTH_ARRAY[month - 1]; 124 } 125 } 126 127 int getDaysInMonthMax(int month) { 129 return MAX_DAYS_PER_MONTH_ARRAY[month - 1]; 130 } 131 132 int getDaysInMonthMaxForSet(long instant, int value) { 134 return (value > 28 ? getDaysInMonthMax(instant) : 28); 135 } 136 137 long getTotalMillisByYearMonth(int year, int month) { 139 if (isLeapYear(year)) { 140 return MAX_TOTAL_MILLIS_BY_MONTH_ARRAY[month - 1]; 141 } else { 142 return MIN_TOTAL_MILLIS_BY_MONTH_ARRAY[month - 1]; 143 } 144 } 145 146 long getYearDifference(long minuendInstant, long subtrahendInstant) { 148 int minuendYear = getYear(minuendInstant); 149 int subtrahendYear = getYear(subtrahendInstant); 150 151 long minuendRem = minuendInstant - getYearMillis(minuendYear); 153 long subtrahendRem = subtrahendInstant - getYearMillis(subtrahendYear); 154 155 if (subtrahendRem >= FEB_29) { 157 if (isLeapYear(subtrahendYear)) { 158 if (!isLeapYear(minuendYear)) { 159 subtrahendRem -= DateTimeConstants.MILLIS_PER_DAY; 160 } 161 } else if (minuendRem >= FEB_29 && isLeapYear(minuendYear)) { 162 minuendRem -= DateTimeConstants.MILLIS_PER_DAY; 163 } 164 } 165 166 int difference = minuendYear - subtrahendYear; 167 if (minuendRem < subtrahendRem) { 168 difference--; 169 } 170 return difference; 171 } 172 173 long setYear(long instant, int year) { 175 int thisYear = getYear(instant); 176 int dayOfYear = getDayOfYear(instant, thisYear); 177 int millisOfDay = getMillisOfDay(instant); 178 179 if (dayOfYear > (31 + 28)) { if (isLeapYear(thisYear)) { 181 if (!isLeapYear(year)) { 183 dayOfYear--; 185 } 186 } else { 187 if (isLeapYear(year)) { 189 dayOfYear++; 191 } 192 } 193 } 194 195 instant = getYearMonthDayMillis(year, 1, dayOfYear); 196 instant += millisOfDay; 197 198 return instant; 199 } 200 201 } 202 | Popular Tags |