📄 periodicevent.java
字号:
index ++; if (index >= maskField.length) return true; return false; default: return false; } } else { // gets the DAY_OF_WEEK value from the reference date if (refDate == -1) return false; int mask[] = new int[index]; System.arraycopy(maskField, 0, mask, 0, maskField.length); maskField = mask; maskField[index] = Calendar.DAY_OF_WEEK; mask = new int[index]; System.arraycopy(maskValue, 0, mask, 0, maskValue.length); maskValue = mask; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); return true; } default: return false; } case Calendar.WEEK_OF_YEAR: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.WEEK_OF_YEAR); } else if (refDate != -1) { if (! checkField(calendar, Calendar.WEEK_OF_YEAR, maskValue[index])) return false; } index ++; if (index < maskField.length) { switch (maskField[index]) { case Calendar.DAY_OF_WEEK: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_WEEK, maskValue[index])) return false; } index ++; if (index >= maskField.length) return true; return false; default: return false; } } else { // gets the DAY_OF_WEEK value from the reference date if (refDate == -1) return false; int mask[] = new int[index]; System.arraycopy(maskField, 0, mask, 0, maskField.length); maskField = mask; maskField[index] = Calendar.DAY_OF_WEEK; mask = new int[index]; System.arraycopy(maskValue, 0, mask, 0, maskValue.length); maskValue = mask; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); return true; } case Calendar.DAY_OF_YEAR: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_YEAR); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_YEAR, maskValue[index])) return false; } index ++; if (index >= maskField.length) return true; return false; } break; case Calendar.MONTH: switch (maskField[index]) { case Calendar.WEEK_OF_MONTH: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.WEEK_OF_MONTH); } else if (refDate != -1) { if (! checkField(calendar, Calendar.WEEK_OF_MONTH, maskValue[index])) return false; } index ++; if (index < maskField.length) { switch (maskField[index]) { case Calendar.DAY_OF_WEEK: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_WEEK, maskValue[index])) return false; } index ++; if (index >= maskField.length) return true; return false; default: return false; } } else { // gets the DAY_OF_WEEK value from the reference date if (refDate == -1) return false; int mask[] = new int[index]; System.arraycopy(maskField, 0, mask, 0, maskField.length); maskField = mask; maskField[index] = Calendar.DAY_OF_WEEK; mask = new int[index]; System.arraycopy(maskValue, 0, mask, 0, maskValue.length); maskValue = mask; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); return true; } case Calendar.DAY_OF_MONTH: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_MONTH); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_MONTH, maskValue[index])) return false; } index ++; if (index >= maskField.length) return true; return false; case Calendar.DAY_OF_WEEK_IN_MONTH: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_WEEK_IN_MONTH, maskValue[index])) return false; } index ++; if (index < maskField.length) { switch (maskField[index]) { case Calendar.DAY_OF_WEEK: if (fillValue) { if (refDate == -1) return false; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); } else if (refDate != -1) { if (! checkField(calendar, Calendar.DAY_OF_WEEK, maskValue[index])) return false; } index ++; if (index >= maskField.length) return true; return false; default: return false; } } else { // gets the DAY_OF_WEEK value from the reference date if (refDate == -1) return false; int mask[] = new int[index]; System.arraycopy(maskField, 0, mask, 0, maskField.length); maskField = mask; maskField[index] = Calendar.DAY_OF_WEEK; mask = new int[index]; System.arraycopy(maskValue, 0, mask, 0, maskValue.length); maskValue = mask; maskValue[index] = calendar.get(Calendar.DAY_OF_WEEK); return true; } default: return false; } default: // when period is the day or lower, no mask is allowed return false; } // not reached return false; } /** * Provides a string image for this object. * * @return string image for this object */ public String toString() { StringBuffer output = new StringBuffer(); output.append("("); output.append(super.toString()); output.append(",timeZoneId="); Strings.toString(output, timeZoneId); output.append(",refDate="); output.append(refDate); if (refDate > 0) { output.append("("); output.append(DateFormat.getDateTimeInstance().format( new Date(refDate))); output.append(")"); } output.append(",period="); output.append(period); output.append(",maskField="); Strings.toStringArray(output, maskField); output.append(",maskValue="); Strings.toStringArray(output, maskValue); output.append(")"); return output.toString(); } /** * Applies the mask on the calendar. */ protected void applyMask() { if (maskField == null) return; int lastDayInMonth = 0; for (int i = 0; i < maskField.length; i ++) { // negative values for DAY_OF_MONTH are not handled by the Calendar if ((maskField[i] == Calendar.DAY_OF_MONTH) && (maskValue[i] < 0)) { lastDayInMonth = maskValue[i]; calendar.set(Calendar.DAY_OF_MONTH, 33); } else { calendar.set(maskField[i], maskValue[i]); } } if (lastDayInMonth != 0) { // resolve the calendar date.// calendar.getTime(); // Work-around calendar jdk1.4 bug (Id: 4685354). calendar.get(Calendar.MONTH); calendar.set(Calendar.DAY_OF_MONTH, lastDayInMonth + 1); } } /** * Checks that the calendar conforms to the mask. */ protected boolean checkMask() { if (maskField == null) return true; for (int i = 0; i < maskField.length; i ++) { if ((maskValue[i] > 0) && (calendar.get(maskField[i]) != maskValue[i])) return false; } return true; } /** * Gets the next event date after the parameter date. Returns * <code>-1</code> if there is no such date. * * @param now * starting date for the lookup * @param inclusive * if <code>true</code> checks <code>now</code> as an answer * @return * the next event date after now, * <code>-1</code> if there is no such date */ public long getNextDate(long now, boolean inclusive) { return getNextDate(now, 1, inclusive); } /** * Gets the next event date after the parameter date. Returns * <code>-1</code> if there is no such date. * Calls {@link getNextDate(long, boolean) getNextDate} with the * <code>inclusive</code> parameter set to <code>false</code>. * * @param now * starting date for the lookup * @return * the next event date after now, * <code>-1</code> if there is no such date */ public long getNextDate(long now) { return getNextDate(now, false); } /** * Gets the last event date before the parameter date. Returns * <code>-1</code> if there is no such date. * * @param now * starting date for the backward lookup * @param inclusive * if <code>true</code> checks <code>now</code> as an answer * @return * the last event date before now, * <code>-1</code> if there is no such date */ public long getLastDate(long now, boolean inclusive) { return getNextDate(now, -1, inclusive); } /** * Gets the last event date before the parameter date. Returns * <code>-1</code> if there is no such date. * Calls {@link getLastDate(long, boolean) getLastDate} with the * <code>inclusive</code> parameter set to <code>false</code>. * * @param now * starting date for the backward lookup * @return * the last event date before now, * <code>-1</code> if there is no such date */ public long getLastDate(long now) { return getLastDate(now, false); } /** * Gets the next event date before or after the parameter date. Returns * <code>-1</code> if there is no such date. * * @param now * starting date for the lookup * @param dir * direction of lookup, forward when positive, backward when negative * @param inclusive * if <code>true</code> checks <code>now</code> as an answer * @return * the next event date before/after now, * <code>-1</code> if there is no such date */ private long getNextDate(long now, int dir, boolean inclusive) { if (dir == 0) return -1; if (dir > 0) dir = 1; else dir = -1; if (refDate == -1) return -1; // the calendar date is always set to the reference date, which is // a valid event date, or to the last valid event date returned long date = calendar.getTime().getTime(); if (inclusive && (date == now)) return date; if (period.value == 0) return -1; Calendar clone = (Calendar) calendar.clone(); // gets a rough estimate of the number of periods between date and now long pnum = now - date; int sign = 1; if (pnum > 0) { sign = dir; } else { pnum = -pnum; sign = -dir; } switch (period.unit) { case Calendar.YEAR: pnum /= 12; case Calendar.MONTH: pnum /= 30; case Calendar.DAY_OF_MONTH: pnum /= 24; case Calendar.HOUR_OF_DAY: pnum /= 60; case Calendar.MINUTE: pnum /= 60; case Calendar.SECOND: pnum /= 1000; } pnum /= period.value; // tries to skip a large period pnum_loop: while (pnum > 3) { calendar.add(period.unit, (int) (pnum * period.value * dir * sign)); // sets all fields before evaluating the calendar applyMask(); if (! checkMask()) { // this is not a valid event date calendar = clone; clone = (Calendar) calendar.clone(); pnum --; continue pnum_loop; } // this is a valid event date clone = (Calendar) calendar.clone(); break pnum_loop; } date = calendar.getTime().getTime(); if (now == date) { if (inclusive) return date; sign = 1; } else if (now > date) { sign = dir; } else { sign = -dir; } pnum = 1; main_loop: while (true) { calendar.add(period.unit, (int) (pnum * period.value * dir * sign)); applyMask(); date = calendar.getTime().getTime(); if ((sign == -1) && ((((date - now) * dir) < 0) || (!inclusive && (date == now)))) { calendar = clone; return calendar.getTime().getTime(); } if (! checkMask()) { // this is not a valid event date calendar = clone; clone = (Calendar) calendar.clone(); pnum ++; continue main_loop; } // this is a valid event date if ((sign == 1) && ((((date - now) * dir) > 0) || (inclusive && (date == now)))) { return date; } clone = (Calendar) calendar.clone(); pnum = 1; } // never reached }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -