J'essaie de calculer la différence entre deux LocalDateTime
.
La sortie doit être au format y years m months d days h hours m minutes s seconds
. Voici ce que j'ai écrit:
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};
}
}
La sortie que j'obtiens est 29 years 8 months 24 days 12 hours 0 minutes 50 seconds
. J'ai vérifié mon résultat sur ce site (avec les valeurs 12/16/1984 07:45:55
et 09/09/2014 19:46:45
). La capture d'écran suivante montre la sortie:
Je suis presque sûr que les champs après la valeur du mois ne correspondent pas à mon code. Toute suggestion serait très utile.
Mettre à jour
J'ai testé mon résultat sur un autre site Web et le résultat que j'ai obtenu est différent. La voici: calculer la durée entre deux dates (résultat: 29 ans, 8 mois, 24 jours, 12 heures, 0 minute et 50 secondes).
Mettre à jour
Comme j'ai obtenu deux résultats différents sur deux sites différents, je me demande si l'algorithme de mon calcul est légitime ou non. Si j'utilise les deux LocalDateTime
objets suivants:
LocalDateTime toDateTime = LocalDateTime.of(2014, 9, 10, 6, 40, 45);
LocalDateTime fromDateTime = LocalDateTime.of(1984, 12, 16, 7, 45, 55);
Ensuite, la sortie arrive: 29 years 8 months 25 days -1 hours -5 minutes -10 seconds.
De ce lien, il devrait être 29 years 8 months 24 days 22 hours, 54 minutes and 50 seconds
. Donc, l'algorithme doit également gérer les nombres négatifs.
Notez que la question n'est pas de savoir quel site m'a donné quel résultat, j'ai besoin de connaître le bon algorithme et d'avoir les bons résultats.
7:45:55
et l'heure de fin 19:46:45
(ou 7:46:45
PM). La différence entre ces deux temps est donc de 12 heures, 0 minute et 50 secondes et jamais de 23 heures, 34 minutes et 12 secondes. Votre calcul semble donc être correct, du moins sur la partie temps.
LocalDateTime
n'y a pas de fuseau horaire, il se peut qu'il n'y ait pas de réponse unique. Même si vous supposez que les fuseaux horaires de début et de fin sont les mêmes, dans certaines zones, comme le 2014-09-09, l'heure d'été ou l'heure d'été sera la même dans d'autres. Cela pourrait gâcher les choses d'une heure. Donc, calculer la différence avec la seconde n'a de sens que si cela est résolu.
LocalDateTime
donne des résultats irréalistes, car cette classe n'a délibérément aucun concept de fuseau horaire ou de décalage par rapport à l'UTC? Pour des valeurs réalistes, attribuez un fuseau horaire via ZoneId
à utiliser ZonedDateTime
.
Period.between()
appliquer un arrondi?