Java 8 date-time: obtenir début de la journée de ZonedDateTime
Quelle est la différence entre ces:
zonedDateTime.truncatedTo(ChronoUnit.DAYS);
zonedDateTime.toLocalDate().atStartOfDay(zonedDateTime.getZone());
Aucune raison de préférer l'une contre l'autre?
Grâce
- Ne pouvait pas mettre en place la méthode
atStartOfDay()
dansZonedDataTime
classe?
Vous devez vous connecter pour publier un commentaire.
Mis à jour pour l'intérêt de la correction:
Dans la plupart des cas, oui le même, voir l'exemple suivant pour le Brésil lors du passage de l'hiver à l'heure d'été:
Tronquer qui se passe sur le locale de la timeline. Si vous choisissez de JOURS, alors vous optez pour minuit. Selon javadoc la
truncate()
-méthode enfin convertit à la nouvelleZonedDateTime
et décale le temps de l'avant par la taille de l'écart (1 heure).La conversion de la zdt premier à
LocalDate
(en coupant la partie du temps) et ensuite à la recherche de saZonedDateTime
-partie dans le fuseau horaire est effectivement la même chose pour cette situation.Cependant, pour le cas inverse de commutation de retour de l'heure d'été à l'heure d'hiver, il est une exception (merci beaucoup à @Austin qui a donné un contre-exemple). Le problème est en cours de chevauchement lors de décider qui offset à être utilisé. Habituellement, la classe
ZonedDateTime
est conçu et spécifié d'utiliser le décalage, voir aussi cet extrait de Javadoc:Si la classe
ZonedDateTime
serait, par conséquent, de suivre sa propre spécification, les deux procédures serait encore une signification équivalente à:devrait être équivalente à
Mais le comportement réel, selon l'exemple de @Austin et confirmé par mes propres tests est:
Ressemble à un caché d'une incohérence dans la classe
ZonedDateTime
, légèrement parlé. Si vous me demandez quelle méthode préférée, alors je préfère prôner la deuxième méthode, même si elle est beaucoup plus longue et nécessite plus de frappes. Mais il a le gros avantage d'être plus transparents sur ce qu'il fait. Une autre raison de préférer la seconde approche est la suivante:Il vraiment obtient le PREMIER instant où le temps local est égal au début de la journée. Sinon, lors de l'utilisation de la première méthode, vous devez écrire:
Elles sont légèrement différentes. Selon la documentation javadoc,
truncatedTo()
essaient de préserver le fuseau horaire dans le cas de chevauchement, maisatStartOfDay()
trouverez la première occurrence de minuit.Par exemple, Cuba revient de l'heure d'été à 1h du matin, pour retomber à 12h. Si vous commencez avec un temps après la transition,
atStartOfDay()
sera le retour de la première occurence de 12h, tandis quetruncatedTo()
sera de retour de la seconde occurence.Note il y a aussi une autre façon de le faire:
qui produit le même résultat que truncatedTo