2012-05-04 2 views
0

Я имею следующий кодJava Calendar.add давая противоречивые результаты

Calendar calendar = Calendar.getInstance(); 

    calendar.set(2011, 7, 29);  //case 1  
    // calendar.set(2011, 7, 30);  //case 2 
    // calendar.set(2011, 7, 31); //case 3 

    System.out.println("===After seting the date== "+calendar.getTime()); 

    System.out.println("================================================================="); 

    calendar.add(Calendar.MONTH, 6); 


    System.out.println("===result after adding 6 months== "+calendar.getTime()); 

и для случая 2 и 3 случая и я получаю тот же результат. он должен переполняться до следующего месяца и показывать новую дату. но его не происходит.

ответ

4

Неясно, используете ли вы «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 в вашем случае).

Таким образом, похоже, что поведение соответствует мне - как вы считаете, что это противоречиво?

+0

Я искал месяц для переполнения до следующего месяца с новой датой, которая 1 или 2.так есть ли другой способ сделать переполнение месяца и даты? –

+0

@Rohan: Вы можете сделать это вручную достаточно легко: если день месяца после этого не совпадает с днем ​​месяца, просто добавьте день. –

+0

Посмотрите эти различия и добавьте эти дни и переходите к следующему месяцу. :) .. спасибо –

0

Я нашел следующее, чтобы простейшим способом достичь, используя gregorian календари. установите день месяца в последний день следующего месяца, чтобы он не стал первым днем ​​следующего месяца.

Попробуйте следовать.

cal.set (Calendar.DAY_OF_MONTH, Math.min (Calendar.DAY_OF_MONTH, cal.getActualMaximum (Calendar.DAY_OF_MONTH)));

Смежные вопросы