Календарь add () против roll () когда мы его используем? - PullRequest
52 голосов
/ 24 марта 2010

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

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

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

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

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

Йода ответы не принимаются!

Ответы [ 4 ]

52 голосов
/ 24 марта 2010
  • add() - почти всегда, как вы сказали
  • roll() - например, вы хотите «обойтись» за один месяц. Алгоритм может состоять в том, чтобы продолжить количество дней и разместить событие, а затем продолжить. Когда достигнут конец месяца, он должен начинаться сначала. Отсюда roll().
29 голосов
/ 24 марта 2010

найдено в jGuru

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

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(): Adds months to the current date i.e., adding 8 months to Aug will give Apr of Next Year, hence forces the Year change.

6 голосов
/ 20 февраля 2012

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

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

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

Тим

2 голосов
/ 07 февраля 2014

Вот пример, который не будет работать. Условие в цикле никогда не будет выполнено, потому что бросок, достигший 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...