Programm gefolgt von Ausgabe. Jemand bitte erklären Sie mir, warum 10.000.000 Millisekunden vom 1. Januar 1970 der 31. November 1969 ist. Nun, jemand bitte erklären, was falsch ist mit meiner Annahme, dass der erste Test eine Zeit 10.000.000 Millisekunden vom 1. Januar 1970 produzieren sollte. Zahlen kleiner als 10.000.000 produzieren das gleiche Ergebnis.
%Vor%Langer Wert: 10000000
Kalenderzeit in Millis: 10000000
Datum im JJJJ-MM-TT-Format: 1969-11-31
Langer Wert: 1000000000000
Kalenderzeit in Millis: 1000000000000
Datum im JJJJ-MM-TT-Format: 2001-8-8
Die Daten, die Sie aus Calendar
drucken, sind lokal in Ihrer Zeitzone, während die Epoche als Mitternacht des 1970-01-01 in UTC definiert ist. Wenn Sie also in einer Zeitzone westlich von UTC leben, wird Ihr Datum als 1969-12-31 angezeigt, obwohl (in UTC) immer noch 1970-01-01.
Zuerst gibt c.get (Calendar.MONTH) 0 für Jan, 1 für Feb usw. zurück.
Zweitens verwenden Sie DateFormat, um Datumsangaben auszugeben.
Drittens sind Ihre Probleme ein gutes Beispiel dafür, wie umständlich das Java-Date-API ist. Verwenden Sie Joda Time API, wenn Sie können. Es wird dein Leben etwas einfacher machen.
Hier ist ein besseres Beispiel Ihres Codes, der die Zeitzone anzeigt:
%Vor%Kalender # setTimeInMillis () setzt die Kalenderzeit auf die Anzahl der Millisekunden nach dem 1. Januar 1970 GMT .
Kalender # get () gibt das angeforderte Feld zurück, das für die Zeitzone des Kalenders angepasst wurde und standardmäßig lokale Zeitzone des Geräts ist.
Dies sollte wie erwartet funktionieren, wenn Sie beim Erstellen des Kalenders die Zeitzone "GMT" angeben:
%Vor% Traurigerweise waren java.util.Date
und java.util.Calendar
schlecht entworfen, was zu dieser Art von Verwirrung führte.
Ihre Zeitzone ist am wahrscheinlichsten hinter GMT zurück (zB GMT-5), also 10.000.000ms von der Epoche ist der 31. Dezember 1969 in Ihrer Zeitzone, aber da Monate Null-basiert sind in java.util.Calendar Ihr Kalender- & gt; Textumwandlung ist fehlerhaft und Sie erhalten 1969-11-31 statt der erwarteten 1969-12-31.