Неясно, используете ли вы «should», чтобы означать «это то, что я хочу, чтобы это сделать», или означать «это то, что я считаю документированным». documentation фактически выполняет резервное копирование приведенного ниже поведения:
add (f, delta) добавляет delta в поле f. Это эквивалентно вызывающему множеству (f, get (f) + delta) с двумя настройками:
Добавить правило 1. Значение поля f после вызова минус значение поля f перед вызовом delta, по модулю любого переполнения, которое произошло в поле f. Переполнение происходит, когда значение поля превышает его диапазон, и в результате следующее большее поле увеличивается или уменьшается, а значение поля возвращается обратно в его диапазон.
Добавить правило 2. Если ожидается, что меньшее поле будет инвариантным, но невозможно, чтобы оно было равно его предыдущему значению из-за изменений его минимума или максимума после изменения поля f или других ограничений, таких как изменение смещения часового пояса, тогда его значение корректируется как можно ближе к ожидаемому значению. Небольшое поле представляет собой меньшую единицу времени. HOUR - это меньшее поле, чем DAY_OF_MONTH. Никакая настройка не выполняется для небольших полей, которые не должны быть инвариантными. Календарная система определяет, какие поля должны быть инвариантными.
Кроме того, в отличие от set(), add() заставляет немедленно пересчитывать миллисекунды календаря и все поля.
Пример: рассмотрим GregorianCalendar, первоначально установленный 31 августа 1999 года. Вызов add (Calendar.MONTH, 13) устанавливает календарь до 30 сентября 2000 года. Добавление правила 1 устанавливает поле MONTH в сентябре, поскольку добавление 13 месяцев к Август дает сентябрь следующего года. Поскольку DAY_OF_MONTH не может быть 31 в сентябре в GregorianCalendar, добавьте правило 2, установив DAY_OF_MONTH в 30, самое близкое возможное значение. Хотя это небольшое поле, DAY_OF_WEEK не регулируется правилом 2, так как ожидается, что он изменится, когда месяц изменится в GregorianCalendar.
Вторая часть примера именно ситуация вы столкнулись: DAY_OF_MONTH, как ожидается, будет инвариантна, но должно измениться, чтобы остаться в нужном месяце, так это доводят до ближайшего возможного значения (29 в вашем случае).
Таким образом, похоже, что поведение соответствует мне - как вы считаете, что это противоречиво?
Я искал месяц для переполнения до следующего месяца с новой датой, которая 1 или 2.так есть ли другой способ сделать переполнение месяца и даты? –
@Rohan: Вы можете сделать это вручную достаточно легко: если день месяца после этого не совпадает с днем месяца, просто добавьте день. –
Посмотрите эти различия и добавьте эти дни и переходите к следующему месяцу. :) .. спасибо –