GregorianCalendar Methode add liefert komische Werte

Qwertzuiop

Mitglied
Hallo zusammen,

ich lese mit Java eine Excel-Zelle aus, welche als Datum formatiert ist. Excel übergibt hier ein Integer (bzw. Long) und nicht das Datum als String.
Das Datum 01.01.1900 entspricht dabei dem Integer 1, und dann weiter gezählt ist 02.01.1900 der Integer 2 usw.

Also bekomme ich jetzt von Excel einen int übergeben, z.B. 40544 (für 01.01.2011). Jetzt möchte ich aus dieser Zahl wieder ein Datum errechnen.
Ich hab dazu einen kleinen Test entworfen.
Ich erzeuge da immer eine Instanz des GregorianCalendar mit dem Datum 01.01.1900 und zähle dann eine Zahl dazu.

Doch bei der Ausgabe bekomme ich komische Daten wie 30.02.1900 oder es werden existierende daten wie 29.01.1900 garnicht ausgegeben. Das Ganze zieht sich die Jahre bis heute durch.

Hier mein Test Code:
Java:
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Main {
	public static void main(String[] args) {
		getYear();
	}
	private static void getYear(){
		
		for (int x = 1; x < 1001; x++){
			Calendar calendar = new GregorianCalendar(1900, 1, 1);
			calendar.add(Calendar.DAY_OF_MONTH, xy - 1);
			System.out.println(x + ":" + calendar.get(Calendar.DATE) + "." + calendar.get(Calendar.MONTH) + "." + calendar.get(Calendar.YEAR));
		}
	}
}

Wenn ich jetzt vergleiche, was mir Excel bei einer Zahl für ein Datum gibt und was mit der GregorianCalendar gibb, dann stimmen diese oft nicht überein.

Kann mir jemand sagen warum das so ist.
Mache ich einen groben fehler.

Vielen Dank schonmal fürs Lesen

Grüße

Felix

PS: Ich hab auch herausgefunden, dass Excel im Jahr 1900 das Datum falsch ausgibt, denn dieses Jar ist gar kein Schaltjahr. Folglich gibt es den 29.02.1900 in Wirklichkeit garnicht. Darum hab ich mich aber noch nicht gekümmert, weil ich erstmal das oben beschriebene Problem in Angriff nehmen wollte.
 
Der Kalender rechnet mit 0 als Januar und 11 als Dezember ... wenn du z.b. beim Start Calendar calendar = new GregorianCalendar(1900, 0, 1);angibst siehst du, dass es dort den 29. gibt und 30.02.1900 eigentl. März is 😀
 
Zuletzt bearbeitet:
Wofür verwendest Du die Schleife ?

Ich hab Dein Programm ein wenig geändert:

Java:
import java.util.Calendar;
import java.util.GregorianCalendar;
 
public class Test5 {
    public static void main(String[] args) {
        getYear();
    }
    private static void getYear(){
        
    	int xy = 40544;
    	
        //for (int x = 1; x < 1001; x++){
            Calendar calendar = new GregorianCalendar(1900, 0, 1);
            calendar.add(Calendar.DAY_OF_MONTH, xy-1);
            System.out.println("" + calendar.get(Calendar.DATE) + "." + calendar.get(Calendar.MONTH) + "." + calendar.get(Calendar.YEAR));
        //}
    }
}

und bekomme folgende Ausgabe:
[EDIT]2.0.2011[/EDIT]

Das Format ist Tag Monat Jahr, wobei das Monat bei 0 losgeht.
Die Anzeige wäre dann der 2.Jänner 2012.

Pentalon
 
Hallo pl4gu33, Hallo Pentalon,

danke für eure Ratschläge.🙂 Jerder weiß, dass der Informatiker bei 0 anfängt zu zählen, aber dass dies auch bei einem Kalender und dan nur der Monat ist, das hätte ich nicht gedacht.

Immer blöd wenn man die ganze Zeit auf dem schlauch steht und nichts funktioniert und dann ist die Lösung so einfach.

Merci auch an dich, Pentalon, dass du mein kleines Testprogramm abgeändert hast, den genau das ist der code wie er dann im Programm ausgeführt werden soll. Bis auf das syso halt, was durch ein return ersetzt wird.

Grüße und Servus

Felix
 

Zurück
Oben