3 Stimmen

Das Konvertieren von Datum in Millisekunden liefert ein falsches Ergebnis.

Ich möchte zwei Daten in Millisekunden umwandeln, aber das angegebene Ergebnis ist falsch, stimmt etwas mit dem Code nicht? Wie kann man es sonst lösen...

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();

c1.set(2013, 01, 31, 16, 44, 49);
c2.set(2013, 02, 01, 12, 59, 55);

System.out.println("c1 = "+c1.getTimeInMillis()+"\nc2 = "+ c2.getTimeInMillis());

output:
c1 = 1362300289619
c2 = 1362113995619

Nach Berechnung der Zeit ergibt sich folgendes Ergebnis: 0Monate -2Tage -3Stunden -44Minuten -54Sekunden, was falsch ist. Es sollte eher so aussehen: 0Monate 0Tage 20Stunden 15Minuten 6Sekunden.

c1 ist größer als c2, weil es ein falsches Ergebnis liefert, aber warum ist es passiert, dass c1 größer als c2 ist? In einem solchen Fall ist es nicht möglich, die Zeit zwischen zwei Daten zu berechnen. Wenn jemand es weiß, bitte helfen Sie mir, vielen Dank im Voraus.

7voto

assylias Punkte 308529

Monate sind 0-basiert, so dass in deinem Beispiel c1 der 31. Februar ist, der als 3. März interpretiert wird (nur 28 Tage im Februar) und c2 ist am 1. März.

5voto

Jon Skeet Punkte 1325502

Dieser Code:

c1.set(2013, 01, 31, 16, 44, 49);

versucht den 31. Februar zu setzen, da die Monate in Java von 0 ausgehend nummeriert werden. Ich vermute, dass Sie am 3. März landen, 3 Tage nach dem 28. Februar. Das liegt eindeutig nach dem 1. März, zu dem Ihr c2 gesetzt ist.

Aus der Dokumentation von Calendar.set:

month - der Wert, der verwendet wird, um das calendar Feld MONTH zu setzen. Der Monatswert basiert auf 0. z.B. 0 für Januar.

Immer wenn Ihr Code sich merkwürdig verhält, überprüfen Sie immer die Details jedes API-Aufrufs, bei dem Sie sich nicht zu 100% sicher sind.

Als Alternative empfehle ich Ihnen dringend, wenn möglich, Joda Time zu verwenden - es ist eine viel vernünftigere API.

1voto

bdoughan Punkte 144925

Danke, Leute, für eure Antwort! Das Problem ist jetzt gelöst, nur durch das Subtrahieren von 1 von den Monaten, bevor ich nicht wusste, dass die Monate in Java bei Null beginnen ... so löst man das

c1.set(2013, (01-1), 31, 16, 44, 49);
c2.set(2013, (02-1), 01, 12, 59, 55);

Anstatt könntest du die Konstanten der java.util.Calendar Klasse verwenden, was deinen Code leichter lesbar macht.

c1.set(2013, Calendar.JANUARY, 31, 16, 44, 49);
c2.set(2013, Calendar.FEBRUARY, 01, 12, 59, 55);

0voto

Bahramdun Adil Punkte 5823

Danke euch für eure Antwort! Das Problem ist jetzt gelöst, nur durch Subtrahieren von 1 von den Monaten, bevor ich wusste, dass in Java die Monate bei Null beginnen... So wurde das Problem gelöst:

c1.set(2013, (01-1), 31, 16, 44, 49);
c2.set(2013, (02-1), 01, 12, 59, 55);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X