Java 8: Berechnen des Unterschieds zwischen zwei LocalDateTime

Ich versuche zur Berechnung der Differenz zwischen zwei LocalDateTime.

Die Ausgabe muss dem format y years m months d days h hours m minutes s seconds. Hier ist, was ich geschrieben habe:

import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.ZoneId;

public class Main {

    static final int MINUTES_PER_HOUR = 60;
    static final int SECONDS_PER_MINUTE = 60;
    static final int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;

    public static void main(String[] args) {
        LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 9, 19, 46, 45);
        LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);

        Period period = getPeriod(fromDateTime, toDateTime);
        long time[] = getTime(fromDateTime, toDateTime);

        System.out.println(period.getYears() + " years " + 
                period.getMonths() + " months " + 
                period.getDays() + " days " +
                time[0] + " hours " +
                time[1] + " minutes " +
                time[2] + " seconds.");


    }

    private static Period getPeriod(LocalDateTime dob, LocalDateTime now) {
        return Period.between(dob.toLocalDate(), now.toLocalDate());
    }

    private static long[] getTime(LocalDateTime dob, LocalDateTime now) {
        LocalDateTime today = LocalDateTime.of(now.getYear(),
                now.getMonthValue(), now.getDayOfMonth(), dob.getHour(), dob.getMinute(), dob.getSecond());
        Duration duration = Duration.between(today, now);

        long seconds = duration.getSeconds();

        long hours = seconds / SECONDS_PER_HOUR;
        long minutes = ((seconds % SECONDS_PER_HOUR) / SECONDS_PER_MINUTE);
        long secs = (seconds % SECONDS_PER_MINUTE);

        return new long[]{hours, minutes, secs};
    }
}

Den Ausgang, bin ich immer 29 years 8 months 24 days 12 hours 0 minutes 50 seconds. Ich habe mein Ergebnis von dieser website (mit Werten 12/16/1984 07:45:55 und 09/09/2014 19:46:45). Der folgende screenshot zeigt die Ausgabe:

Java 8: Berechnen des Unterschieds zwischen zwei LocalDateTime

Ich bin mir ziemlich sicher, dass die Felder nach dem Monat Wert ist kommen falsch von meinem code. Jeder Vorschlag wäre sehr hilfreich.

Update

Habe ich getestet, mein Ergebnis von einer anderen website und das Ergebnis bekam ich, anders. Hier ist es: Berechnen Sie die Dauer zwischen zwei Datumsangaben (Ergebnis: 29 Jahre, 8 Monaten, 24 Tagen, 12 Stunden, 0 Minuten und 50 Sekunden).

Update

Da hab ich zwei verschiedene Ergebnisse mit zwei verschiedenen Seiten, ich Frage mich, ob der Algorithmus meiner Berechnung legitim ist oder nicht. Wenn ich folgende zwei LocalDateTime Objekte:

LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);

Dann die Ausgabe kommen: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.

Aus diesem link es sollte 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds. So muss der Algorithmus zu handhaben, die negative zahlen zu.

Hinweis: die Frage ist nicht, über die Website gab mir, was ich wissen müssen, den richtigen Algorithmus und müssen das Recht haben, die Ergebnisse.

  • Nur eine Vermutung, aber könnte Period.between() gelten einige der Rundung?
  • Ich sah den code noch einmal ein und es scheint, dass die Webseite falsch ist (Versuchen Sie die Berechnung selbst). Wenn du weglassen, das Datum, d.h. Unterschiede in der Jahr, Monat und Tag, erhalten Sie die Startzeit 7:45:55 und das Ende der Zeit 19:46:45 (oder 7:46:45 Uhr). Also der Unterschied zwischen denen zwei mal 12 Stunden, 0 Minuten und 50 Sekunden und nie 23 Stunden, 34 Minuten und 12 Sekunden. Also deine Berechnung actualle scheint richtig zu sein, zumindest auf den Teil der Zeit.
  • Interessantes Phänomen auf dieser website: hinzufügen von 10 Jahren ab Datum und die Differenz in Stunden änderungen von 23 auf 8 - sicher ein Zeichen für Fehler.
  • Hinzugefügt vor 1 Jahr, 4 und 10 - keine Veränderung in Stunden
  • hast du den zweiten link in meinem update?
  • Beachten Sie, dass seit LocalDateTime hat kein Zeit-zone, könnte es nicht sein, eine eindeutige Antwort. Auch wenn Sie davon ausgehen, die start-und end-Zeit-Zonen sind die gleichen, in bestimmten Zonen Termine wie 2014-09-09 werden in der Sommerzeit oder Sommerzeit, in anderen nicht. Dies mag throw-off Dinge, indem Sie eine Stunde. Also das berechnen der Differenz der zweite ist sinnlos, es sei denn, dies ist gelöst.
  • "ich habe getestet, mein Ergebnis von einer anderen website und das Ergebnis bekam ich, anders" > So, dass die mit Ihrem Java-code. Scheint, wie diese Frage ist nun überflüssig - die andere website ist gebrochen.
  • bitte siehe update, die Frage ist nicht redundant.
  • dann muss ich verwenden ZonedDateTime; richtig?
  • wenn man sich den code für das Datum abrufen Zeit werden Sie feststellen, dass der Teil entfernt wird und somit nur das Datum betrachtet. Das ist, warum Sie bekommen 24 Tage statt 23.
  • ZonedDateTime wird Ihnen helfen zu vermeiden das bestimmte problem, das ich erwähnte.
  • Was java.time.Duration.between(Temporal a, Temporal b) ? Laut javadoc: Erhält eine Dauer der Vertretung die Dauer zwischen zwei zeitlichen Objekten. Dieser berechnet die Dauer zwischen zwei zeitlichen Objekten. Wenn die Objekte verschiedener Typen enthalten, dann wird die Dauer berechnet, basierend auf dem Typ des ersten Objekts. Zum Beispiel, wenn das erste argument ein LocalTime dann das zweite argument ist in einer LocalTime.
  • Verstehen Sie, dass die Verwendung LocalDateTime Erträge unrealistischen Ergebnisse, wie die Klasse absichtlich fehlt jede Vorstellung von Zeit zone oder offset-von-UTC? Für realistische Werte, weisen eine Zeitzone über ZoneId zu verwenden ZonedDateTime.

InformationsquelleAutor Tapas Bose | 2014-09-09
Schreibe einen Kommentar