Hallo,
Die erste zwei java-Fragmente haben wirklich merkwürdige
und falsche Ausgaben.
Nein, nur die zweite Ausgabe ist falsch, die erste Ausgabe ist richtig.
Bei der resten Aufgabe hast Du ja folgende Codeziele:
d = new GregorianCalendar(1582, 9, (1+i));
Das heißt, Du legst ein Objekt des Types "GregorianCalendar" an und übergibst ihm nacheinander folgende Parameter:
Zähler| Eingabe | Ausgabe
------------------------------------
i = 1: 1582, 10, 1 1.10.1582
i = 2: 1582, 10, 2 2.10.1582
i = 3: 1582, 10, 3 3.10.1582
i = 4: 1582, 10, 4 4.10.1582
i = 5: 1582, 10, 5 15.10.1582
i = 6: 1582, 10, 6 16.10.1582
...
i = 14: 1582, 10, 14 24.10.1582
i = 15: 1582, 10, 15 15.10.1582
i = 16: 1582, 10, 16 16.10.1582
...
Der Witz ist, dass der gregorianische Kalender erst ab dem 15. Oktober 1582 gültig ist. Java implementiert GregorianCalendar offensichtlich so, dass *vor* dem 15. Oktober 1582 der julianische Kalender genommen wird. Dummerweise ist der 4. Oktober 1582 JC der Tag vor dem 15. Oktober 1582 GC.
Wenn Du ihn jetzt mit Daten zwischen dem 5. und dem 14. Oktober 1582 fütterst, dann sind die offensichtlich *ungültig* für den gewählten Kalender. Was macht er also? Er interpoliert - sprich: genauso, wie er einen 32. März zu einem 1. April macht, macht er einen 5. Oktober 1582 zu "1 Tag nach dem 4 Oktober 1582" - sprich: 15 Oktober 1582. Das macht er bis einschließlich dem 14. Oktober 1582.
Ab dem 15. Oktober ist das Datum aber wieder gültig nach dem gewählten Kalender! Da fängt nämlich der gregorianische an. Er hat also wieder ein gültiges Datum und muss nicht mehr interpolieren, also kann er das Datum direkt nehmen.
Folglich: Die Klasse verhält sich vollkommen korrekt. Man könnte natürlich argumentieren, dass sie zwischen dem 5. und dem 14. Oktober eine Exception werfen könnte... Aber dann müsste sie konsequenterweise auch beim 0. März (als Behelfsangabe für den letzten Tag im Februar z.B.) eine Exception werfen - und damit macht man ein sehr nützliches Feature kaputt. Sprich: Das Verhalten ist absolut beabsichtigt - ich würde es genauso implementieren.
Dein zweites Beispiel zeigt aber wirklich offensichtlich einen Bug in der Implementierung in Java.
d = new GregorianCalendar(622, 6, (16+350720+i));
Bei dieser Zeile sollte er korrekt interpolieren, da Du *sowieso* eine viel zu große Tageszahl angibst, weswegen er sich einfach den 1. Juli 622 rauspicken sollte und dann einfach 15 + 350720 + i Tage addieren sollte - und dann auf das korrekte Ergebnis kommen sollte. Dieses Beispiel würde ich als Fehler an den Autor der Klasse melden.
Viele Grüße,
Christian