java - programar - Calendario add() vs roll() ¿cuándo lo usamos?
jdate java (4)
Aquí hay un ejemplo que no funcionará. La condición en el ciclo nunca será satisfecha, porque la tirada, una vez que llegue al 31 de enero de 2014, se remontará al 1 de enero de 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);
}
Sé que add()
agrega la cantidad de tiempo especificada (firmada) al campo de tiempo dado, según las reglas del calendario.
Y roll()
agrega la unidad de tiempo única especificada (firmada) en el campo de tiempo dado sin cambiar los campos más grandes.
No puedo pensar en un uso diario de roll()
Haría todo por add()
.
¿Me pueden ayudar con ejemplos cuando usamos roll()
y cuando add()
?
EDIT 1
¡Las respuestas de Joda no son aceptadas!
Encontrado en jGuru
- Calendar.roll ()
Cambia una unidad específica y deja sin cambios a las unidades "más grandes" (en términos de tiempo-mes es "mayor" que el día). El ejemplo de la API es que, dada la fecha del 31 de agosto de 1999, el 30 de abril de 1999 (calendario.MONTH) cede el 30 de abril de 1999. Es decir, el DÍA se modificó para cumplir con el máximo de abril, pero la unidad ''más grande'', AÑO, no se modificó
roll(): Rolls up 8 months here ie, adding 8 months to Aug will result in Apr but year remains unchanged(untouched).
- Calendar.add ()
Hará que cambie la siguiente unidad "más grande", si es necesario. Es decir, dada una fecha del 31 de agosto de 1999, add (Calendar.MONTH, 8) cede el 30 de abril de 2000. add () también fuerza un recálculo de milisegundos y todos los campos.
add(): Adds months to the current date ie, adding 8 months to Aug will give Apr of Next Year, hence forces the Year change.
Estaba haciendo la misma pregunta (que es cómo encontré esta página) y alguien en mi lugar de trabajo (bien hecho, DCK) sugirió:
Los selectores de fecha en muchos teléfonos inteligentes (y otras interfaces similares) "pasarán" el día del 31 al 1. ° sin alterar el mes, de forma similar para el campo del mes.
No puedo pensar en otro uso de ATM y este podría implementarse de otras maneras, ¡pero al menos es un ejemplo!
Tim
-
add()
- casi siempre, como dijiste -
roll()
: por ejemplo, desea "dispensar" eventos en un mes. El algoritmo puede proceder varios días y colocar el evento, luego continuar. Cuando se llega al final del mes, debe comenzar desde el principio. Por lo tanto,roll()
.