Java -Kalendereinstellung falsch
-
15-10-2019 - |
Frage
Ich habe Probleme mit Javas Kalender. Ich analysiere einige Daten aus einer TXT -Datei und muss ein Datum erstellen. Nach Abschluss des folgenden Codes:
tmpYear = Double.parseDouble(row[yearIndex]);
tmpMonth = Double.parseDouble(row[monthIndex]);
tmpDay = Double.parseDouble(row[dayIndex]);
if(timeIndex != -1)
tmpTime = Double.parseDouble(row[timeIndex]);
if(secondsIndex != -1)
tmpSeconds = Double.parseDouble(row[secondsIndex]);
Ich kann debuggen und sehen, dass die Variablen wie folgt sind: tmpyear == 2010
tmpmonth == 12
tmpday == 30
tmptime == 15 (Dies ist die Stunde des Tages)
tmpseconds == 0
Aber beim Ausführen des folgenden Code:
cal.set((int)tmpYear,(int)tmpMonth,(int)tmpDay,(int)tmpTime,
(int)((tmpTime - (int)tmpTime)*100),(int)tmpSeconds);
System.out.println(cal.getTime().toString());
Ich bekomme das für eine Ausgabe:
Sonne 30. Januar 15:00:00 CST 2011
Kann jemand erklären, was ein möglicher Grund dafür wäre? Vielen Dank im Voraus für die Hilfe!
Lösung
Monate werden 0-11 anstelle von 1-12 indiziert.
0 = Januar
1 = Februar
...
11 = Dezember
Verwenden tmpMonth = value -1
stattdessen.
Andere Tipps
Ich glaube, der Wert des Monats beginnt bei 0 und nicht bei 1, also interpretiert er 0 als Jan, 1 als Februar ... und dann wieder als 12 Jan.
Aus der API:
Monat - Der Wert, der verwendet wird, um das Monatszeitfeld festzulegen. Der Monatswert ist 0 basiert. zB 0 für Januar.
Wenn Sie das Feld Kalender.month festlegen, ist es auf Null basiert. {Januar = 0 ... Dezember = 11}
Der Grund ist recht einfach: Entwurfsfehler in der Kalender -API. Deshalb ist der JSR 310 auf dem Weg, um die Java -Unterstützung für Daten zu verbessern.
Technisch gesehen hielten es die Autoren der Klasse für gut, nur statische Felder zu verwenden. Sie müssen also Folgendes verwenden:
calendar = ...
calendar.setMonth(Calendar.JANUARY);
Sie glaubten nicht, dass die Leute dynamische Einstellungen für einen Kalender benötigen, genau wie Sie es brauchen (und die meisten von uns, denn das ist wichtig).
Die Monatswerte gehen von 0 (Januar) bis 11 (Dezember). Versuchen Sie, ((int) tmpmonth) - 1 zu verwenden, wenn Sie den Monat für den Dezember festlegen.