web-dev-qa-db-fra.com

Comment calculer la différence de temps entre deux dates en utilisant LocalDateTime dans Java 8?

Il existe de nombreuses réponses, mais je ne trouve pas compatible avec ma situation. J'ai besoin de trouver une différence de 8 heures dans le temps ainsi que le changement de date aussi. Comme si le temps est supérieur à 8 heures, n'exécutez rien.

Avons-nous une méthode qui réalise la même chose dans LocalDateTime dans Java-8?

J'ai essayé d'utiliser le suivant mais je n'ai pas réussi à faire la même chose.

LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55);
LocalDateTime toDateTime = LocalDateTime.now();
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);

long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);
tempDateTime = tempDateTime.plusYears(years);

long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);
tempDateTime = tempDateTime.plusMonths(months);

long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);
tempDateTime = tempDateTime.plusDays(days);

long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);
tempDateTime = tempDateTime.plusHours(hours);

long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);
tempDateTime = tempDateTime.plusMinutes(minutes);

long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);

System.out.println("" + Java.time.Duration.between(tempDateTime, toDateTime).toHours());

System.out.println(years + " years "
        + months + " months "
        + days + " days "
        + hours + " hours "
        + minutes + " minutes "
        + seconds + " seconds.");

Il est difficile de vérifier l'heure et la date séparément.

Au départ, je l'ai codé comme ça mais ça n'a pas l'air correct:

return openBrat!=null 
        && openBrat.until(LocalDateTime.now(), ChronoUnit.DAYS) == 0 &&  
          openBrat.until(LocalDateTime.now(), ChronoUnit.HOURS) >= 8
         && openBrat.until(LocalDateTime.now(), ChronoUnit.Minutes) >= 0;

Quelqu'un pourrait-il suggérer comment soustraire comme:

2017 07 06 23:30:00 - 2017 07 07 01:30:00 - Should return 2 hours.
7
Harpreet

Les impressions suivantes 2, comme vous vous en doutez.

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
System.out.println(Duration.between(ldt1, ldt2).toHours());

Il n'y a rien de mal avec votre code. Si vous n'obtenez pas le résultat escompté, vous devrez peut-être vérifier si votre attente est correcte.


Pour faire quelque chose lorsque la différence est inférieure à 8 heures, vous pouvez faire quelque chose comme ceci:

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
Duration d1 = Duration.between(ldt1, ldt2);
Duration d2 = Duration.ofHours(8);

if (d1.compareTo(d2) > 0) {
    System.out.println("do nothing");
} else {
    System.out.println("do something");
}
15
Robin Topper

Ma compréhension est que vous voulez obtenir la différence entre ces 2 dates et la "casser" en termes de combien d'heures, de minutes et de secondes cette différence est.

Vous pouvez utiliser la classe Duration comme déjà expliqué. Mais le Duration calcule la différence en secondes et en nanosecondes, vous devrez donc faire quelques calculs pour obtenir ce nombre de secondes dans des champs séparés:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55);

Duration duration = Duration.between(d1, d2);
// total seconds of difference (using Math.abs to avoid negative values)
long seconds = Math.abs(duration.getSeconds());
long hours = seconds / 3600;
seconds -= (hours * 3600);
long minutes = seconds / 60;
seconds -= (minutes * 60);
System.out.println(hours + " hours " + minutes + " minutes " + seconds + " seconds");

Dans Java 9 et versions ultérieures, vous pouvez appeler les nouvelles méthodes Duration::to…Part Pour obtenir le nombre de jours, heures, minutes, ou secondes plutôt que de calculer les nombres vous-même.

La sortie sera:

7 heures 30 minutes 55 secondes

Et les variables hours, minutes et seconds auront les valeurs respectives de 7, 30 Et 55. Si vous voulez également les nanosecondes, il suffit d'appeler duration.getNano() pour obtenir la valeur respective (dans l'exemple ci-dessus, c'est 0).

Si je teste avec des valeurs différentes:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0);

Le résultat sera:

2 heures 0 minutes 0 secondes


Si vous voulez juste la différence d'heures, vous pouvez utiliser:

ChronoUnit.HOURS.between(d1, d2);

Vous pouvez éventuellement utiliser Math.abs Pour éviter les valeurs négatives.

Cela retournera la différence en heures, en ignorant les minutes et les secondes restantes: dans le premier exemple (d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55)) il renverra 7 Et dans le second exemple (d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0) ) il renverra 2.

8
user7605325