TimeUnit.DAYS.convert(
Math.abs(
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() -
new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
),
TimeUnit.MILLISECONDS)
Le résultat est 28, alors qu'il devrait être 29.
Le fuseau horaire / l'emplacement pourrait-il être le problème?
SimpleDateFormat
plus longtemps, car il est obsolète. Utilisezjava.time
plutôt des packages de . DansSimpleDateFormat
le cas, utilisezDateTimeFormatter
. Dans le cas de Java 7, voir le commentaire d'Andy Turner ci-dessous.java.time
[bien que je note que vous êtes sur Java 7], ThreeTenBp , Joda).TimeUnit
ne prétend rien savoir de l'heure d'été. Comme le dit le javadoc: Une nanoseconde est définie comme un millième de microseconde, une microseconde comme un millième de milliseconde, une milliseconde comme un millième de seconde, une minute comme soixante secondes, une heure comme soixante minutes et un jour comme vingt-quatre heures . --- Étant donné que l'heure d'été fait que 2 jours de l'année ne sont pas exactement 24 heures,TimeUnit
il se trompe lorsque l'heure d'été est impliquée.Réponses:
Le problème est qu'en raison du décalage horaire (le dimanche 8 mars 2020), il y a 28 jours et 23 heures entre ces dates.
TimeUnit.DAYS.convert(...)
tronque le résultat à 28 jours.Pour voir le problème (je suis dans le fuseau horaire US Eastern):
Production
Pour résoudre ce problème, utilisez un fuseau horaire sans heure d'été, par exemple UTC :
Production
la source
GregorianCalendar
objet et d'ajouter 1 jour à la fois jusqu'à la date de fin. Je paierais un prix élevé pour éviter cela. Et ajouter le backport d'une bibliothèque qui fait déjà partie de Java 8, 9, 10, 11, 12, 13,… n'est pas cher. Au contraire, la prochaine fois que vous devrez faire quelque chose avec la date ou l'heure, ce sera déjà un gain.La cause de ce problème est déjà mentionnée dans la réponse d'Andreas .
La question est de savoir exactement ce que vous voulez compter. Le fait que vous déclariez que la différence réelle devrait être de 29 au lieu de 28 et que vous demandez si «l'heure de l'emplacement / de la zone pourrait être un problème» révèle ce que vous voulez réellement compter. Apparemment, vous voulez vous débarrasser de toute différence de fuseau horaire.
Je suppose que vous souhaitez uniquement calculer les jours, sans heure ni fuseau horaire.
Java 8
Ci-dessous, dans l'exemple de la façon dont le nombre de jours entre les deux pourrait être calculé correctement, j'utilise une classe qui représente exactement cela - une date sans heure ni fuseau horaire -
LocalDate
.Notez que
ChronoUnit
,DateTimeFormatter
etLocalDate
nécessitent au moins Java 8, qui n'est pas disponible pour vous, selon la balise java-7 . Cependant, c'est peut-être pour les futurs lecteurs.Comme mentionné par Ole VV, il y a aussi le backport ThreeTen , qui rétroporte les fonctionnalités de l'API date et heure Java 8 vers Java 6 et 7.
la source
ThreeTen
;-), mais malheureusement, il est hors ligne au moment de la rédaction.) Je mettrai à jour le message.java.time
, car à l'école, ils utilisent toujours les anciennes classes. Mais l'API Java 8 Date and Time est très bien conçue - ce serait une perte de ne pas l'utiliser.