Die Java-Klassenbibliothek hat eine Klasse namens DateTime. DateTime hat diese Methode:
int daysBetween(DateTime other)
Dies gibt die Anzahl der Tage zwischen diesem und dem Parameter zurück. Es gibt keine Methode
int secondsBetween(DateTime other)
was ich zufällig brauche. Gibt es eine Klasse, die DateTime ähnelt, aber eine solche Methode hat?
Antworten:
Nicht vertraut mit DateTime ...
Wenn Sie zwei Daten haben, können Sie getTime aufrufen, um Millsekunden abzurufen, den Diff abzurufen und durch 1000 zu dividieren. Zum Beispiel
Date d1 = ...; Date d2 = ...; long seconds = (d2.getTime()-d1.getTime())/1000;
Wenn Sie Kalenderobjekte haben, können Sie anrufen
und mach das gleiche
quelle
Integer.MAX_VALUE
kann aber in Sekunden fast 70 Jahre darstellen. Das hat mir gereicht.Ich möchte die moderne Antwort geben. Die anderen Antworten waren in Ordnung, als diese Frage gestellt wurde, aber die Zeit vergeht. Heute empfehle ich Ihnen die Verwendung
java.time
der modernen Java-API für Datum und Uhrzeit .ZonedDateTime aDateTime = ZonedDateTime.of(2017, 12, 8, 19, 25, 48, 991000000, ZoneId.of("Europe/Sarajevo")); ZonedDateTime otherDateTime = ZonedDateTime.of(2017, 12, 8, 20, 10, 38, 238000000, ZoneId.of("Europe/Sarajevo")); long diff = ChronoUnit.SECONDS.between(aDateTime, otherDateTime); System.out.println("Difference: " + diff + " seconds");
Dies druckt:
Difference: 2689 seconds
ChronoUnit.SECONDS.between()
arbeitet mit zweiZonedDateTime
Objekten oder zweiOffsetDateTime
s, zweiLocalDateTime
s usw.Wenn Sie etwas anderes als nur die Sekunden benötigen, sollten Sie die
Duration
Klasse in Betracht ziehen :Duration dur = Duration.between(aDateTime, otherDateTime); System.out.println("Duration: " + dur); System.out.println("Difference: " + dur.getSeconds() + " seconds");
Dies druckt:
Duration: PT44M49.247S Difference: 2689 seconds
Die erste der beiden Zeilen gibt die Dauer im ISO 8601-Format aus. Die Ausgabe bedeutet eine Dauer von 44 Minuten und 49,247 Sekunden.
Warum java.time?
Die
Date
in mehreren anderen Antworten verwendete Klasse ist längst veraltet. Joda-Time, das auch in einigen Fällen (und möglicherweise in der Frage) verwendet wird, befindet sich jetzt im Wartungsmodus. Es sind keine größeren Verbesserungen geplant, und die Entwickler empfehlen offiziell die Migration aufjava.time
JSR-310, auch bekannt als JSR-310.Frage: Kann ich die moderne API mit meiner Java-Version verwenden?
Wenn Sie mindestens Java 6 verwenden , können Sie.
quelle
ChronoUnit.SECONDS.between(oldDate.toInstant(), newDate.toInstant())
jedoch ziemlich leicht zu merken.Du solltest tun
quelle
Seconds.secondsBetween(start, end).getSeconds()
Das sollte es tun:
Date a = ...; Date b = ...; Math.abs(a.getTime()-b.getTime())/1000;
Hier die entsprechende Dokumentation: Date.getTime () . Beachten Sie, dass dies nur für Daten nach dem 1. Januar 1970, 00:00:00 GMT funktioniert
quelle
Es gibt keine Klasse wie
DateTime
in der Standard-Java SE-API. Obwohl es eine in der Joda-Zeit gibt, hat auch das keinedaysBetween
Methode.Mit der Standard-Java-API können Sie am einfachsten Sekunden zwischen zwei
java.util.Date
Objekten abrufen, indem Sie deren Zeitstempel subtrahieren und durch 1000 dividieren:int secondsBetween = (date1.getTime() - date2.getTime()) / 1000;
quelle
Es wird nicht empfohlen, verstrichene Zeiten zu verwenden
java.util.Date
oderSystem.currentTimeMillis()
zu messen. Es ist nicht garantiert, dass diese Daten monoton sind, und es treten Änderungen auf, wenn die Systemuhr geändert wird (z. B. wenn sie vom Server korrigiert werden). Wahrscheinlich wird dies selten vorkommen, aber warum nicht eine bessere Lösung codieren, anstatt sich über möglicherweise negative oder sehr große Änderungen Gedanken zu machen?Stattdessen würde ich empfehlen, zu verwenden
System.nanoTime()
.long t1 = System.nanoTime(); long t2 = System.nanoTime(); long elapsedTimeInSeconds = (t2 - t1) / 1000000000;
BEARBEITEN
Weitere Informationen zur Monotizität finden Sie in der Antwort auf eine verwandte Frage, die ich gestellt habe. NanoTime verwendet nach Möglichkeit eine monotone Uhr. Ich habe aber nur mit Windows XP, Java 1.6 getestet und die Uhr modifiziert, wobei
nanoTime
monoton und monoton warcurrentTimeMillis
nicht.Auch aus Javas Echtzeit-Dokumenten :
quelle
Wenn Sie Joda verwenden (das in JDK 7 möglicherweise als jsr 310 geliefert wird, trennen Sie die Open Source-API bis dahin), gibt es eine Seconds-Klasse mit einer secondBetween-Methode.
Hier ist der Javadoc-Link: http://joda-time.sourceforge.net/api-release/org/joda/time/Seconds.html#secondsBetween(org.joda.time.ReadableInstant,%20org.joda.time.ReadableInstant)
quelle
Sie können es verwenden
org.apache.commons.lang.time.DateUtils
, um es sauberer zu machen:quelle
Welche Klasse ? Meinen Sie die Joda DateTime- Klasse? In diesem Fall können Sie einfach
getMillis()
jeden aufrufen und die entsprechende Subtraktion / Skalierung durchführen.Ich würde Joda übrigens für Datums- / Zeitarbeit empfehlen, da es eine nützliche und intuitive API und Thread-Sicherheit für Formatierungs- / Analyseoptionen bietet.
quelle
Nur ein Hinweis: Wenn Sie die Differenz zwischen zwei java.util.Date berechnen, ist der Ansatz, beide Daten zu subtrahieren und durch 1000 zu dividieren, sinnvoll. Seien Sie jedoch besonders vorsichtig, wenn Sie Ihre java.util.Date-Referenz von einem Kalenderobjekt erhalten . In diesem Fall müssen Sie die Sommerzeit Ihrer TimeZone berücksichtigen, da eines der von Ihnen verwendeten Daten möglicherweise in einer Sommerzeit liegt.
Das wird auf Prasoons Link erklärt. Ich empfehle, sich etwas Zeit zu nehmen, um es zu lesen.
quelle
Verwenden Sie diese Methode:
private Long secondsBetween(Date first, Date second){ return (second.getTime() - first.getTime())/1000; }
quelle