Exemplo n.º 1
0
  /**
   * 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
    }
  }
Exemplo n.º 2
0
  /**
   * 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
    }
  }