Calender.roll() vs. Calendar.add()

Die Klasse java.util.Calendar ist scheiße mächtig. Gerade beschäftige ich mich wieder ein bißchen damit und bin auf folgendes gestoßen

Was ist der Unterschied? Letztendlich machen beide etwas Ähnliches, nämlich das Erhöhen/Erniedrigen eines Datums um einen Wert. Bei roll() werden nur die „größeren“ Einheiten so gelassen wie sie sind. D.h. (laut API) das beim 31. August 1999 ein roll(Calendar.MONTH, 8 ) im 30. April 1999 endet (weil die Jahres-Einheit „größer“ ist als die Monats-Einheit). Der Tag wird nur deshalb verändert, weil der 31. April nicht existiert und so das Nächstbeste genommen wird.

Ein add(Calender.MONTH, 8 ) führt allerdings dazu, dass die nächst größere Einheit bei Bedarf angepasst wird, d.h. aus dem 31. August 1999 wird dann der 30. April 2000.

Ein Kollege merkt sich den Unterschied so: Wie beim Zahlenschloß. Das hilft nicht bei add(), aber bei roll() wird ja auch jeweils nur der eine Ring des Zahlenschloß weiterge“roll“t und der Rest bleibt unbeeinflußt.

Zusätzlich noch ein Hinweis: Calendar.MONTH ist null-basiert, d.h. geht von 0-11 und 2 ist der März. Ein Calendar.getInstance().getTime().toLocaleString() passt das allerdings „intern“ an und bei der Ausgabe ist dann der März wieder der 3. Monat des Jahres.