Próbuję obliczyć różnicę między dwoma LocalDateTime
.
Dane wyjściowe muszą mieć format y years m months d days h hours m minutes s seconds
. Oto co napisałem:
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};
}
}
Otrzymuję wynik 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Sprawdziłem swój wynik z tej strony (z wartościami 12/16/1984 07:45:55
i 09/09/2014 19:46:45
). Poniższy zrzut ekranu pokazuje dane wyjściowe:
Jestem prawie pewien, że pola po wartości miesiąca są niepoprawne z mojego kodu. Wszelkie sugestie byłyby bardzo pomocne.
Aktualizacja
Przetestowałem swój wynik z innej strony internetowej i otrzymałem inny wynik. Oto on: Oblicz czas trwania między dwiema datami (wynik: 29 lat, 8 miesięcy, 24 dni, 12 godzin, 0 minut i 50 sekund).
Aktualizacja
Ponieważ otrzymałem dwa różne wyniki z dwóch różnych witryn, zastanawiam się, czy algorytm moich obliczeń jest prawidłowy, czy nie. Jeśli użyję następujących dwóch LocalDateTime
obiektów:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Potem nadchodzi wynik: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Z tego linku powinno być 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Dlatego algorytm musi również obsługiwać liczby ujemne.
Uwaga: pytanie nie dotyczy tego, która strona dała mi jaki wynik, muszę znać odpowiedni algorytm i mieć właściwe wyniki.
7:45:55
i godzinę zakończenia 19:46:45
(lub 7:46:45
PM). Różnica między tymi dwoma czasami wynosi 12 godzin, 0 minut i 50 sekund, a nigdy 23 godziny, 34 minuty i 12 sekund. Więc twoje obliczenia wydają się być poprawne, przynajmniej w części czasu.
LocalDateTime
nie ma strefy czasowej, odpowiedź może nie być jednoznaczna. Nawet jeśli założysz, że początkowa i końcowa strefa czasowa są takie same, w niektórych strefach daty, takie jak 2014-09-09 będą miały czas letni lub letni, a w innych nie. To może zrzucić rzeczy o godzinę. Zatem obliczenie różnicy w stosunku do drugiego jest bez znaczenia, chyba że zostanie to rozwiązane.
LocalDateTime
daje nierealistyczne wyniki, ponieważ tej klasie celowo brakuje jakiejkolwiek koncepcji strefy czasowej lub przesunięcia względem UTC? Aby uzyskać realistyczne wartości, przypisz strefę czasową za ZoneId
pomocą ZonedDateTime
.
Period.between()
zastosować jakieś zaokrąglenie?