2016-07-16 28 views

Antwort

1

Blick in die Dokumentation der Ober java.util.Calendar, in dem Abschnitt "Feld Manipulation" (Hervorhebung von mir):

add(f, delta) fügt delta auf Feld f. Dies entspricht dem Aufruf von set(f, get(f) + delta) mit zwei Einstellungen:

Regel 1 hinzufügen 1. Der Wert von Feld f nach dem Anruf abzüglich des Werts von Feld f vor dem Anruf ist delta, modulo jeder Überlauf, der in Feld f aufgetreten ist. Überlauf tritt auf, wenn ein Feldwert seinen Bereich überschreitet, und als Ergebnis wird das nächstgrößere Feld inkrementiert oder dekrementiert und der Feldwert wird wieder in seinen Bereich eingestellt.

So wird add(Calendar.DAY_OF_MONTH, 1) 31. Juli ändern 1. August.

Im Gegensatz dazu setzt die Dokumentation:

roll(f, delta)deltaf Feld fügt ohne größere Felder zu ändern. Dies entspricht dem Aufruf add(f, delta) mit folgender Einstellung:

Rollregel. Größere Felder sind unverändert nach dem Anruf. Ein größeres Feld repräsentiert eine größere Zeiteinheit. DAY_OF_MONTH ist ein größeres Feld als HOUR.

So wird roll(Calendar.DAY_OF_MONTH, 1) 31. Juli ändern 1. Juli.

+0

Danke. Vielleicht gibt es einen gewissen Vorteil für Java, dem ein Replikat fehlt. Ich habe mehr von Ihrer Antwort erfahren, die ich von den Tests bekommen würde. Es ist auch gut über die Roll-Methode zu wissen. – kjl

0

Monate im Kalenderobjekt beginnen bei 0. 1 bedeutet also Februar. Und Sie wissen, Februar letzten Tag ist 28, so sollte Ausgabe 2 März sein.

0 = January = Calendar.JANUARY 
1 = february = Calendar.FEBRUARY 

so

Calendar calendar = new GregorianCalendar(); 

int year  = calendar.get(Calendar.YEAR); 
int month  = calendar.get(Calendar.MONTH); 
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1