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.
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");
}
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
.