2017-07-07 2 views
3

Es gibt zahlreiche Antworten gegeben, aber ich finde nicht kompatibel mit meiner Situation. Ich muss den Unterschied von 8 Stunden in der Zeit sowie am Datumswechsel auch finden. Wenn die Zeit länger als 8 Stunden ist, führe nichts aus.Wie berechne ich den Zeitunterschied zwischen zwei Daten mit LocalDateTime in Java 8?

Haben wir irgendeine Methode, die dasselbe in LocalDateTime in Java-8 erreichen?

Ich habe versucht, folgende zu verwenden, aber nicht das gleiche zu erreichen.

LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55); 
LocalDateTime toDateTime = LocalDateTime.now(); 
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime); 

long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS); 
tempDateTime = tempDateTime.plusYears(years); 

long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS); 
tempDateTime = tempDateTime.plusMonths(months); 

long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS); 
tempDateTime = tempDateTime.plusDays(days); 

long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS); 
tempDateTime = tempDateTime.plusHours(hours); 

long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES); 
tempDateTime = tempDateTime.plusMinutes(minutes); 

long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS); 

System.out.println("" + java.time.Duration.between(tempDateTime, toDateTime).toHours()); 

System.out.println(years + " years " 
     + months + " months " 
     + days + " days " 
     + hours + " hours " 
     + minutes + " minutes " 
     + seconds + " seconds."); 

Es ist schwierig, Zeit und Datum separat zu überprüfen.

Zunächst codiert ich es wie aber es sieht nicht richtig:

return openBrat!=null 
     && openBrat.until(LocalDateTime.now(), ChronoUnit.DAYS) == 0 && 
      openBrat.until(LocalDateTime.now(), ChronoUnit.HOURS) >= 8 
     && openBrat.until(LocalDateTime.now(), ChronoUnit.Minutes) >= 0; 

Könnte jemand bitte vorschlagen, wie wie zu subtrahieren:

2017 07 06 23:30:00 - 2017 07 07 01:30:00 - Should return 2 hours. 
+2

Sie können auch 'ChronoUnit.HOURS.between (date1, date2)' –

+3

Verwenden Sie bewusst, dass 'LocalDateTime' absichtlich kein Konzept der Zeitzone hat? Wenn Sie diese Klasse verwenden, ignorieren Sie alle Anomalien wie Sommerzeit (DST). Wenn Sie solche Realitäten berücksichtigen möchten, verwenden Sie 'ZonedDateTime'. –

+0

Mögliches Duplikat von [Java 8: Berechnen Sie den Unterschied zwischen zwei LocalDateTime] (https://stackoverflow.com/questions/25747499/java-8-calculate-difference-between-two-localdatetime) – rogerdpack

Antwort

6

Die folgenden druckt 2, so wie man es erwarten würde .

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00); 
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00); 
System.out.println(Duration.between(ldt1, ldt2).toHours()); 

Es ist nichts falsch mit Ihrem Code. Wenn Sie das erwartete Ergebnis nicht erhalten, müssen Sie möglicherweise überprüfen, ob Ihre Erwartungen korrekt sind.


, etwas zu tun, wenn der Unterschied weniger als 8 Stunden ist, können Sie etwas tun können:

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00); 
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00); 
Duration d1 = Duration.between(ldt1, ldt2); 
Duration d2 = Duration.ofHours(8); 

if (d1.compareTo(d2) > 0) { 
    System.out.println("do nothing"); 
} else { 
    System.out.println("do something"); 
} 
+0

Wie können wir es in Stunden Minuten überprüfen und Sekunden? Da Bedingung prüfen ist, dass, wenn Zeit mehr als 8 Stunden ist, dann etwas so ausführen = und> arbeitet an ToHours aber nicht Minuten und Sekunden. – Harpreet

+1

@Harpreet So erhalten Sie die Dauer in Sekunden oder Millisekunden oder was immer Sie brauchen, und überprüfen Sie, ob es mehr als 8 Stunden im Wert von Sekunden (oder Millisekunden, etc.) ist. –

+0

@Harpreet Meine Antwort wurde mit ein wenig extra Code aktualisiert –

5

Mein Verständnis ist, dass Sie den Unterschied zwischen diesen zwei Tage, und „Pause erhalten möchten "Es ist in Bezug auf wie viele Stunden, Minuten und Sekunden dieser Unterschied ist.

Sie können die Klasse Duration wie bereits erläutert verwenden. Aber die Duration berechnet die Differenz in Sekunden und Nanosekunden, so dass Sie etwas Mathematik zu tun haben, diese Anzahl von Sekunden in getrennten Feldern zu erhalten:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0); 
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55); 

Duration duration = Duration.between(d1, d2); 
// total seconds of difference (using Math.abs to avoid negative values) 
long seconds = Math.abs(duration.getSeconds()); 
long hours = seconds/3600; 
seconds -= (hours * 3600); 
long minutes = seconds/60; 
seconds -= (minutes * 60); 
System.out.println(hours + " hours " + minutes + " minutes " + seconds + " seconds"); 

In Java 9 und höher, können Sie die neuen Duration::to…Part nennen Methoden zu get number of days, hours, minutes, or seconds anstatt die Zahlen selbst zu berechnen.

wird der Ausgang sein:

7 Stunden 30 Minuten 55 Sekunden

und die Variablen hours, minutes und seconds werden die jeweiligen Werte von 7, 30 und 55 haben. Wenn Sie auch die Nanosekunden möchten, rufen Sie einfach duration.getNano() an, um den entsprechenden Wert zu erhalten (im obigen Beispiel ist es 0).

Wenn ich testen, mit unterschiedlichen Werten:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0); 
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0); 

Das Ergebnis wird:

2 hours 0 minutes 0 seconds


Wenn Sie nur den Unterschied wollen in Stunden, können Sie verwenden:

ChronoUnit.HOURS.between(d1, d2); 

Sie können optional Math.abs verwenden, um negative Werte zu vermeiden.

Dadurch wird die Differenz in Stunden zurück, um die verbleibenden Minuten und Sekunden ignoriert: im ersten Beispiel (d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55)) es wird 7 zurückkehren und in dem zweiten Beispiel (d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0)) es wird 2 zurückzukehren.

Verwandte Themen