Berechnen Sie den Datums-/Zeitunterschied in Java [duplicate]
Lesezeit: 5 Minuten
London
Ich möchte Differenz zwischen 2 Daten berechnen in Stunden/Minuten/Sekunden.
Ich habe ein kleines Problem mit meinem Code hier ist es:
String dateStart = "11/03/14 09:29:58";
String dateStop = "11/03/14 09:33:43";
// Custom date format
SimpleDateFormat format = new SimpleDateFormat("yy/MM/dd HH:mm:ss");
Date d1 = null;
Date d2 = null;
try {
d1 = format.parse(dateStart);
d2 = format.parse(dateStop);
} catch (ParseException e) {
e.printStackTrace();
}
// Get msec from each, and subtract.
long diff = d2.getTime() - d1.getTime();
long diffSeconds = diff / 1000;
long diffMinutes = diff / (60 * 1000);
long diffHours = diff / (60 * 60 * 1000);
System.out.println("Time in seconds: " + diffSeconds + " seconds.");
System.out.println("Time in minutes: " + diffMinutes + " minutes.");
System.out.println("Time in hours: " + diffHours + " hours.");
Dies sollte produzieren:
Time in seconds: 45 seconds.
Time in minutes: 3 minutes.
Time in hours: 0 hours.
Allerdings bekomme ich dieses Ergebnis:
Time in seconds: 225 seconds.
Time in minutes: 3 minutes.
Time in hours: 0 hours.
Kann jemand sehen, was ich hier falsch mache?
Eine ähnliche Frage gefunden: stackoverflow.com/questions/625433/…
– Yves Martin
7. Februar 2012 um 13:43 Uhr
Es gibt einen besseren Weg, dies zu tun: stackoverflow.com/a/15541322/562769
– Martin Thoma
21. März 2013 um 7:52 Uhr
Für Java 8+ gibt es einen wirklich einfachen Weg: stackoverflow.com/a/23176621/1548776
– ᴠɪɴᴄᴇɴᴛ
7. August 2018 um 15:09 Uhr
Ich würde es vorziehen, vorgeschlagen zu verwenden java.util.concurrent.TimeUnit Klasse.
long diff = d2.getTime() - d1.getTime();//as given
long seconds = TimeUnit.MILLISECONDS.toSeconds(diff);
long minutes = TimeUnit.MILLISECONDS.toMinutes(diff);
@Mark Ich stimme nicht zu. Sie haben den Punkt der Frage verfehlt. Trotz der Tatsache, dass er im Rest des Beitrags den Ausdruck “Zeit in Sekunden” verwendet, macht er deutlich, dass er eigentlich keine einfache Konvertierung will, sondern Reste. Dies ist weniger effizient als die akzeptierte Antwort (unter Verwendung eines Methodenaufrufs, der selbst im JVM-Bytecode aus einigen Anweisungen besteht), weniger klar (es ist länger und ehrlich gesagt, wenn etwas “1000” oder “60” in diesem Kontext als magische Zahlen findet , sie arbeiten nicht mit einem vollen Deck) und entscheidend ist, dass es nicht das tut, was das OP wollte.
– Partherschuss
8. August 2014 um 17:25 Uhr
Es gibt eine Möglichkeit, eine generische Methode dafür zu schreiben. Siehe stackoverflow.com/a/10650881/82609
– Sebastian Lorber
29. Januar 2016 um 10:20 Uhr
wenn ich will, unterschied für wochen, monate, jahre?
– jose920405
15. September 2016 um 16:51 Uhr
@ jose920405 in diesem Fall brauchst du Joda-Zeit
– Johann Henckel
29. Juni 2017 um 21:13 Uhr
Dies gibt die Antwort, die das OP angegeben hat, dass es nicht möchte.
– Peter Lawrey
3. November 2018 um 15:33 Uhr
Peter Lawrey
Versuchen
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000);
HINWEIS: Dies setzt voraus diff ist nicht negativ.
@vels4j Ich habe die dritte Zeile aus dem Originalcode angenommen, den ich gerade hinzugefügt habe. Vielen Dank für den Hinweis.
– Peter Lawrey
3. November 2018 um 11:43 Uhr
aber immer noch die diffMinutes ist falsch
– vels4j
3. November 2018 um 12:10 Uhr
@vels4j auf welche Weise?
– Peter Lawrey
3. November 2018 um 15:32 Uhr
Ich habe die Antwort aktualisiert, bitte überprüfen Sie sie. verwerfen Sie meine Bearbeitung nach der Klärung
– vels4j
8. November 2018 um 6:05 Uhr
@vels4j, was sagen Sie, ist falsch, weil 6 die richtige Antwort zu sein scheint, da Sie auch Stunden in der OP-Frage haben.
– Peter Lawrey
8. November 2018 um 9:47 Uhr
gehalten
Wenn Sie in der Lage sind, externe Bibliotheken zu verwenden, würde ich Ihnen die Verwendung empfehlen Joda-Zeitbemerken, dass:
Joda-Time ist die De-facto-Standard-Datums- und Zeitbibliothek für Java vor Java SE 8. Benutzer werden jetzt aufgefordert, auf java.time (JSR-310) zu migrieren.
Bitte beachten Sie, dass Sie Days.daysBetween(LocalDate.fromDateFields(startDate), LocalDate.fromDateFields(endDate)) verwenden müssen, wenn Sie mit 2 java.util.Date-Objekten arbeiten.
– Benutzer799188
9. Oktober 2012 um 3:00 Uhr
Ich habe ein Beispiel für die Verwendung der Joda-Zeit erstellt: stackoverflow.com/a/15541322/562769
– Martin Thoma
21. März 2013 um 7:53 Uhr
Was ist der aktuelle Weg, es zu tun? (mit JSR-310)
– static_rtti
29. März 2018 um 10:27 Uhr
Yves Martin
Seit Java 5 können Sie verwenden java.util.concurrent.TimeUnit um die Verwendung von magischen Zahlen wie 1000 und 60 in Ihrem Code zu vermeiden.
Übrigens sollten Sie bei Ihrer Berechnung auf Schaltsekunden achten: Die letzte Minute eines Jahres kann eine zusätzliche Schaltsekunde haben, sodass sie tatsächlich 61 Sekunden statt der erwarteten 60 Sekunden dauert. Die ISO-Spezifikation sieht sogar eventuell 61 Sekunden vor. Einzelheiten finden Sie in java.util.Date javadoc.
Yogev
Versuchen Sie dies für eine freundliche Darstellung von Zeitunterschieden (in Millisekunden):
on line long diffYears = (long) (timeDifferenceMillisekunden / (60 * 60 * 1000 * 24 * 365)); Sie müssen wenig später lang umwandeln, sonst ist der Divisor int und überläuft :diffYears = (timeDifferenceMilliseconds / ((long)60 * 60 * 1000 * 24 * 365));
– Pavel Niedoba
14. April 2016 um 13:38 Uhr
Ich habe den Code bereits korrigiert
– Pavel Niedoba
14. April 2016 um 14:13 Uhr
Joeri Hendrickx
Dies ist im Grunde eher ein mathematisches Problem als ein Java-Problem.
Das Ergebnis, das Sie erhalten, ist korrekt. Dies liegt daran, dass 225 Sekunden 3 Minuten sind (bei einer ganzzahligen Division). Was Sie wollen, ist dies:
Teilen Sie durch 1000, um die Anzahl der Sekunden zu erhalten -> Rest ist Millisekunden
Teilen Sie das durch 60, um die Anzahl der Minuten zu erhalten -> Rest sind Sekunden
Teilen Sie das durch 60, um die Anzahl der Stunden zu erhalten -> Rest sind Minuten
oder Java:
int millis = diff % 1000;
diff/=1000;
int seconds = diff % 60;
diff/=60;
int minutes = diff % 60;
diff/=60;
hours = diff;
on line long diffYears = (long) (timeDifferenceMillisekunden / (60 * 60 * 1000 * 24 * 365)); Sie müssen wenig später lang umwandeln, sonst ist der Divisor int und überläuft :diffYears = (timeDifferenceMilliseconds / ((long)60 * 60 * 1000 * 24 * 365));
– Pavel Niedoba
14. April 2016 um 13:38 Uhr
Ich habe den Code bereits korrigiert
– Pavel Niedoba
14. April 2016 um 14:13 Uhr
José Tepedino
Hier ist ein Vorschlag, mit TimeUnitum jedes Mal einen Teil zu erhalten und sie zu formatieren.
private static String formatDuration(long duration) {
long hours = TimeUnit.MILLISECONDS.toHours(duration);
long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) % 60;
long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) % 60;
long milliseconds = duration % 1000;
return String.format("%02d:%02d:%02d,%03d", hours, minutes, seconds, milliseconds);
}
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss,SSS");
Date startTime = sdf.parse("01:00:22,427");
Date now = sdf.parse("02:06:38,355");
long duration = now.getTime() - startTime.getTime();
System.out.println(formatDuration(duration));
Das Ergebnis ist: 01:06:15,928
9243100cookie-checkBerechnen Sie den Datums-/Zeitunterschied in Java [duplicate]yes
Eine ähnliche Frage gefunden: stackoverflow.com/questions/625433/…
– Yves Martin
7. Februar 2012 um 13:43 Uhr
Es gibt einen besseren Weg, dies zu tun: stackoverflow.com/a/15541322/562769
– Martin Thoma
21. März 2013 um 7:52 Uhr
Für Java 8+ gibt es einen wirklich einfachen Weg: stackoverflow.com/a/23176621/1548776
– ᴠɪɴᴄᴇɴᴛ
7. August 2018 um 15:09 Uhr