Подтвердить что ты не робот

Calendar add() vs roll(), когда мы его используем?

Я знаю, что add() добавляет указанное (подписанное) количество времени к заданному временному полю на основе правил календаря.

И roll() добавляет указанную (подписанную) единицу времени в заданное поле времени без изменения больших полей.

Я не могу думать о повседневном использовании roll(), я бы сделал все на add().

Можете ли вы помочь мне с примерами, когда мы используем roll() и когда add()?

РЕДАКТИРОВАТЬ 1

Ответы Joda не принимаются!

4b9b3361

Ответ 1

  • add() - почти всегда, как вы сказали
  • roll() - например, вы хотите "раздавать" события за один месяц. Алгоритм может состоять в том, чтобы продолжить несколько дней и разместить событие, а затем продолжить. Когда конец месяца будет достигнут, он должен начинаться с самого начала. Следовательно, roll().

Ответ 2

Найдено в jGuru

  • Calendar.roll()
    Изменяет определенную единицу и оставляет "больше" (с точки зрения времени-месяца "больше", чем в день) единицы без изменений. Пример API состоит в том, что с датой 31 августа 1999 года, (Calendar.MONTH, 8) дает 30 апреля 1999 года. То есть, ДЕНЬ изменен в соответствии с апрельским максимумом, но "большая" единица, YEAR, была без изменений.

roll(): Rolls up 8 months here i.e., adding 8 months to Aug will result in Apr but year remains unchanged(untouched).

  • Calendar.add()
    Вызвать следующий "большой" блок для изменения, если необходимо. То есть, учитывая дату 31 августа 1999 года, добавьте (Calendar.MONTH, 8) дает 30 апреля 2000. add() также заставляет пересчитать миллисекунды и все поля.

add(): Adds months to the current date i.e., adding 8 months to Aug will give Apr of Next Year, hence forces the Year change.

Ответ 3

Я просто задал один и тот же вопрос (так я нашел эту страницу), и кто-то на моем рабочем месте (молодец, DCK) придумал предложение:

Селектора даты на многих смартфонах (и других подобных интерфейсах) будет "катить" день с 31-го по 1-й, не изменяя месяц, аналогично для поля месяца.

Я не могу думать о другом банкомате использования, и это можно было бы реализовать другими способами, но, по крайней мере, это пример!

Тим

Ответ 4

Вот пример, который не сработает. Условие в цикле никогда не будет удовлетворено, потому что бросок, достигнув 31 января 2014 года, вернется к 1 января 2014 года.

    Calendar start=new GregorianCalendar();
    start.set(Calendar.YEAR, 2014);
    start.set(Calendar.MONTH, 0);
    start.set(Calendar.DAY_OF_MONTH, 1);
    //January 2, 2014

    Calendar end=new GregorianCalendar();
    end.set(Calendar.YEAR, 2014);
    end.set(Calendar.MONTH, 1);
    end.set(Calendar.DAY_OF_MONTH, 2);
    //February 2, 2014

    while (start.getTime().before(end.getTime())){
        start.roll(Calendar.DATE, 1);
    }