Calendar add() vs roll(), когда мы его используем?
Я знаю, что add()
добавляет указанное (подписанное) количество времени к заданному временному полю на основе правил календаря.
И roll()
добавляет указанную (подписанную) единицу времени в заданное поле времени без изменения больших полей.
Я не могу думать о повседневном использовании roll()
, я бы сделал все на add()
.
Можете ли вы помочь мне с примерами, когда мы используем roll()
и когда add()
?
РЕДАКТИРОВАТЬ 1
Ответы Joda не принимаются!
Ответы
Ответ 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);
}