Ich versuche die Differenz zwischen zwei zu berechnen LocalDateTime
.
Die Ausgabe muss das Format haben y years m months d days h hours m minutes s seconds
. Folgendes habe ich geschrieben:
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};
}
}
Die Ausgabe, die ich bekomme, ist 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Ich habe mein Ergebnis von dieser Website überprüft (mit Werten 12/16/1984 07:45:55
und 09/09/2014 19:46:45
). Der folgende Screenshot zeigt die Ausgabe:
Ich bin mir ziemlich sicher, dass die Felder nach dem Monatswert in meinem Code falsch sind. Jeder Vorschlag wäre sehr hilfreich.
Aktualisieren
Ich habe mein Ergebnis von einer anderen Website getestet und das Ergebnis 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).
Aktualisieren
Da ich zwei unterschiedliche Ergebnisse von zwei verschiedenen Standorten erhalten habe, frage ich mich, ob der Algorithmus meiner Berechnung legitim ist oder nicht. Wenn ich folgende 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 kommt die Ausgabe: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Von diesem Link sollte es sein 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Der Algorithmus muss also auch die negativen Zahlen verarbeiten.
Beachten Sie, dass es bei der Frage nicht darum geht, welche Site mir welches Ergebnis gebracht hat. Ich muss den richtigen Algorithmus kennen und die richtigen Ergebnisse erzielen.
7:45:55
und die Endzeit 19:46:45
(oder 7:46:45
PM). Der Unterschied zwischen diesen beiden Zeiten beträgt also 12 Stunden, 0 Minuten und 50 Sekunden und niemals 23 Stunden, 34 Minuten und 12 Sekunden. Ihre tatsächliche Berechnung scheint also zumindest zeitlich korrekt zu sein.
LocalDateTime
es möglicherweise keine eindeutige Antwort gibt , da es keine Zeitzone gibt. Selbst wenn Sie davon ausgehen, dass die Start- und Endzeitzonen gleich sind, werden in bestimmten Zonen Daten wie der 09.09.2014 in der Sommerzeit oder in der Sommerzeit angezeigt, in anderen nicht. Dies könnte die Dinge um eine Stunde abwerfen. Die Berechnung der Differenz zur Sekunde ist also bedeutungslos, es sei denn, dies wird behoben.
LocalDateTime
unrealistische Ergebnisse liefert, da dieser Klasse absichtlich ein Konzept der Zeitzone oder des Versatzes von UTC fehlt? Weisen Sie für realistische Werte eine ZoneId
zu verwendende Zeitzone über zu ZonedDateTime
.
Period.between()
eine Rundung anwenden?