/** * See {@link #ceil(long)}. * * <p>This method modifies the given calendar and returns the same object. */ public Calendar ceil(Calendar cal) { OUTER: while (true) { for (CalendarField f : CalendarField.ADJUST_ORDER) { int cur = f.valueOf(cal); int next = f.ceil(this, cur); if (cur == next) continue; // this field is already in a good shape. move on to next // we are modifying this field, so clear all the lower level fields for (CalendarField l = f.lowerField; l != null; l = l.lowerField) l.clear(cal); if (next < 0) { // we need to roll over to the next field. f.rollUp(cal, 1); f.setTo(cal, f.first(this)); // since higher order field is affected by this, we need to restart from all over continue OUTER; } else { f.setTo(cal, next); if (f.redoAdjustmentIfModified) continue OUTER; // when we modify DAY_OF_MONTH and DAY_OF_WEEK, do it all over from the top } } return cal; // all fields adjusted } }
/** * See {@link #floor(long)} * * <p>This method modifies the given calendar and returns the same object. */ public Calendar floor(Calendar cal) { OUTER: while (true) { for (CalendarField f : CalendarField.ADJUST_ORDER) { int cur = f.valueOf(cal); int next = f.floor(this, cur); if (cur == next) continue; // this field is already in a good shape. move on to next // we are modifying this field, so clear all the lower level fields for (CalendarField l = f.lowerField; l != null; l = l.lowerField) l.clear(cal); if (next < 0) { // we need to borrow from the next field. f.rollUp(cal, -1); // the problem here, in contrast with the ceil method, is that // the maximum value of the field is not always a fixed value (that is, day of month) // so we zero-clear all the lower fields, set the desired value +1, f.setTo(cal, f.last(this)); f.addTo(cal, 1); // then subtract a minute to achieve maximum values on all the lower fields, // with the desired value in 'f' CalendarField.MINUTE.addTo(cal, -1); // since higher order field is affected by this, we need to restart from all over continue OUTER; } else { f.setTo(cal, next); f.addTo(cal, 1); CalendarField.MINUTE.addTo(cal, -1); if (f.redoAdjustmentIfModified) continue OUTER; // when we modify DAY_OF_MONTH and DAY_OF_WEEK, do it all over from the top } } return cal; // all fields adjusted } }