Sto cercando di calcolare la differenza tra due LocalDateTime
.
L'output deve essere del formato y years m months d days h hours m minutes s seconds
. Ecco cosa ho scritto:
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};
}
}
L'output che sto ottenendo è 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. Ho controllato il mio risultato da questo sito Web (con valori 12/16/1984 07:45:55
e 09/09/2014 19:46:45
). La seguente schermata mostra l'output:
Sono abbastanza sicuro che i campi dopo il valore del mese vengono errati dal mio codice. Qualsiasi suggerimento sarebbe molto utile.
Aggiornare
Ho testato il mio risultato da un altro sito Web e il risultato ottenuto è diverso. Eccolo: calcola la durata tra due date (risultato: 29 anni, 8 mesi, 24 giorni, 12 ore, 0 minuti e 50 secondi).
Aggiornare
Dato che ho ottenuto due risultati diversi da due siti diversi, mi chiedo se l'algoritmo del mio calcolo sia legittimo o meno. Se uso i seguenti due LocalDateTime
oggetti:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Quindi l'output sta arrivando: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
Da questo link dovrebbe essere 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Quindi l'algoritmo deve gestire anche i numeri negativi.
Nota che la domanda non riguarda quale sito mi ha dato quale risultato, ho bisogno di sapere l'algoritmo giusto e ho bisogno di avere i risultati giusti.
7:45:55
e l'ora di fine 19:46:45
(o 7:46:45
PM). Quindi la differenza tra queste due volte è di 12 ore, 0 minuti e 50 secondi e mai 23 ore, 34 minuti e 12 secondi. Quindi il tuo calcolo attuale sembra essere corretto, almeno sulla parte temporale.
LocalDateTime
non ha un fuso orario, potrebbe non esserci una risposta unica. Anche se si presume che i fusi orari di inizio e fine siano gli stessi, in alcune zone date come il 09-09-2014 saranno in Ora legale o in ora legale e in altre no. Questo potrebbe far cadere le cose di un'ora. Quindi calcolare la differenza con il secondo non ha senso a meno che non sia risolto.
LocalDateTime
produce risultati non realistici, dal momento che quella classe è intenzionalmente priva di qualsiasi concetto di fuso orario o offset da UTC? Per valori realistici, assegnare un fuso orario tramite ZoneId
per l'uso ZonedDateTime
.
Period.between()
applicare un arrotondamento?