395 Stimmen

Java 8: Unterschied zwischen zwei LocalDateTime in mehreren Einheiten

Ich versuche, den Unterschied zwischen zwei LocalDateTime zu berechnen.

Die Ausgabe muss im Format y Jahre m Monate d Tage h Stunden m Minuten s Sekunden sein. 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() + " Jahre " + 
                period.getMonths() + " Monate " + 
                period.getDays() + " Tage " +
                time[0] + " Stunden " +
                time[1] + " Minuten " +
                time[2] + " Sekunden.");

    }

    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};
    }
}

Die Ausgabe, die ich erhalte, ist 29 Jahre 8 Monate 24 Tage 12 Stunden 0 Minuten 50 Sekunden. Ich habe mein Ergebnis von dieser Website überprüft (mit den Werten 16.12.1984 07:45:55 und 09.09.2014 19:46:45). Der folgende Screenshot zeigt die Ausgabe:

Epoch Converter

Ich bin ziemlich sicher, dass die Felder nach dem Monatswert in meinem Code falsch sind. Jeder Vorschlag wäre sehr hilfreich.

Aktualisierung

Ich habe mein Ergebnis von einer anderen Website getestet und das Ergebnis, das ich erhalten habe, ist anders. Hier ist es: Berechnen Sie die Dauer zwischen zwei Daten (Ergebnis: 29 Jahre, 8 Monate, 24 Tage, 12 Stunden, 0 Minuten und 50 Sekunden).

Aktualisierung

Da ich von zwei verschiedenen Websites zwei verschiedene Ergebnisse erhalten habe, frage ich mich, ob der Algorithmus meiner Berechnung legitim ist oder nicht. Wenn ich die folgenden zwei LocalDateTime-Objekte verwende:

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

Dann lautet die Ausgabe: 29 Jahre 8 Monate 25 Tage -1 Stunden -5 Minuten -10 Sekunden.

Wie aus diesem Link hervorgeht, sollte es 29 Jahre 8 Monate 24 Tage 22 Stunden, 54 Minuten und 50 Sekunden sein. Daher muss der Algorithmus auch mit negativen Zahlen umgehen können.

Bitte beachten Sie, dass es nicht um die Frage geht, welche Site mir welches Ergebnis gegeben hat. Ich möchte den richtigen Algorithmus kennen und die richtigen Ergebnisse haben.

0voto

excitedWithin Punkte 51

Für alle, die versuchen, die Minuten zwischen zwei LocalTime-Objekten zu zählen, denken Sie daran, dass das Ergebnis minus 1 sein wird.

Zum Beispiel,

long countMins = MINUTES.between( LocalTime.of(8,00),LocalTime.of(9,59) );
System.out.println("countMins = " + countMins );

wird die Ausgabe geben: countMins = 119 anstelle von 120

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X