TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
Das Ergebnis ist 28, während es 29 sein sollte.
Könnte die Zeitzone / der Ort das Problem sein?
SimpleDateFormat
mehr verwenden, da es veraltet ist. Verwenden Siejava.time
stattdessen Pakete von . In diesemSimpleDateFormat
Fall verwendenDateTimeFormatter
. Im Fall von Java 7 siehe Andy Turners Kommentar unten.java.time
[obwohl ich feststelle, dass Sie Java 7 verwenden], ThreeTenBp , Joda).TimeUnit
gibt nicht vor, etwas über die Sommerzeit zu wissen. Wie der Javadoc sagt: Eine Nanosekunde ist definiert als eine Tausendstel einer Mikrosekunde, eine Mikrosekunde als eine Tausendstel Millisekunde, eine Millisekunde als eine Tausendstelsekunde, eine Minute als sechzig Sekunden, eine Stunde als sechzig Minuten und ein Tag als vierundzwanzig Stunden . --- Da die Sommerzeit dazu führt, dass 2 Tage im Jahr nicht genau 24 Stunden sind, istTimeUnit
dies falsch, wenn die Sommerzeit betroffen ist.Antworten:
Das Problem ist, dass aufgrund der Sommerzeitverschiebung (am Sonntag, 8. März 2020) zwischen diesen Daten 28 Tage und 23 Stunden liegen .
TimeUnit.DAYS.convert(...)
schneidet das Ergebnis auf 28 Tage ab.Um das Problem zu sehen (ich bin in der Zeitzone US Eastern):
Ausgabe
Verwenden Sie zum Beheben eine Zeitzone ohne Sommerzeit, z. B. UTC :
Ausgabe
quelle
GregorianCalendar
Objekt zu verwenden und jeweils 1 Tag hinzuzufügen, bis das Enddatum erreicht ist. Ich würde einen hohen Preis zahlen, um das zu vermeiden. Das Hinzufügen des Backports einer Bibliothek, die bereits Teil von Java 8, 9, 10, 11, 12, 13, ... ist, ist kein hoher Preis. Im Gegenteil, wenn Sie das nächste Mal etwas mit Datum oder Uhrzeit tun müssen, ist dies bereits ein Gewinn.Die Ursache dieses Problems ist bereits in Andreas 'Antwort erwähnt .
Die Frage ist, was genau Sie zählen möchten. Die Tatsache, dass Sie angeben, dass der tatsächliche Unterschied 29 statt 28 betragen sollte, und fragen, ob "Ort / Zonenzeit ein Problem sein könnte" , zeigt, was Sie tatsächlich zählen möchten. Anscheinend möchten Sie Zeitzonenunterschiede beseitigen.
Ich gehe davon aus, dass Sie nur die Tage ohne Zeit und Zeitzone berechnen möchten.
Java 8
Im Beispiel, wie die Anzahl der Tage zwischen korrekt berechnet werden kann, verwende ich eine Klasse, die genau das darstellt - ein Datum ohne Zeit und Zeitzone
LocalDate
.Beachten Sie, dass
ChronoUnit
,DateTimeFormatter
undLocalDate
benötigt mindestens Java 8, die Sie nicht zur Verfügung steht, nach dem Java-7 - Tag. Es ist jedoch vielleicht für zukünftige Leser.Wie von Ole VV erwähnt, gibt es auch den ThreeTen Backport , der die Java 8-API-Funktionalität für Datum und Uhrzeit auf Java 6 und 7 zurückportiert .
quelle
ThreeTen
, aber leider ist sie zum Zeitpunkt des Schreibens offline.) Ich werde den Beitrag aktualisieren.java.time
, weil sie in der Schule immer noch die alten Klassen benutzen. Aber die Java 8 Datum und Uhrzeit API ist sehr gut gestaltet - es wäre ein Verlust nicht zu verwenden.