225 votes

Pourquoi ZoneOffset.UTC! = ZoneId.of ("UTC")?

Pourquoi

 ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
 

imprimer false ?

Je m'attendrais à ce que les deux instances ZonedDateTime soient égales.

276voto

DVarga Points 14186

La réponse vient de la javadoc de l' ZoneId (l'emphase est mienne) ...

Un ZoneId est utilisé pour identifier les règles utilisées pour convertir entre une Instantanée et un LocalDateTime. Il existe deux types distincts de ID:

  • Fixe les décalages, totalement résolu décalage UTC/gmt, Greenwich, qui utilise le même décalage pour tous les locaux de la date et l'heure
  • Régions géographiques - une zone où un ensemble de règles spécifiques pour trouver le décalage par rapport à UTC/gmt, Greenwich appliquer

La plupart des offsets fixes sont représentés par Écartfuseau. Appel normalisé() sur toute ZoneId veillera à ce qu'un fixe décalage ID seront représentés comme un Écartfuseau.

... et de la javadoc de l' ZoneId#of (l'emphase est mienne):

Cette méthode d'analyse de l'ID de la production d'un ZoneId ou Écartfuseau. Un Écartfuseau est renvoyée si l'ID est 'Z', ou commence par '+' ou '-'.

L'argument l'id est spécifié en tant que "UTC", donc il sera de retour une ZoneId avec un décalage, qui a également présenté dans la forme d'une chaîne:

System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));

Sorties:

2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]

Lorsque vous utilisez l' equals méthode de comparaison, vous vérifiez pour objet d'équivalence. En raison de l'décrit la différence, le résultat de l'évaluation est - false.

Lorsque l' normalized() méthode est utilisée comme proposé dans la documentation, de la comparaison à l'aide de equals sera de retour true, normalized() sera de retour correspondantes ZoneOffset:

Normalise le temps-ID de zone, de retour d'un Écartfuseau lorsque cela est possible.

now.withZoneSameInstant(ZoneOffset.UTC)
    .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true

Comme les états de documentation, si vous utilisez "Z" ou "+0" comme id d'entrée, of sera de retour l' ZoneOffset directement et il n'est pas nécessaire d'appeler normalized():

now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true

Pour vérifier si ils gardent la même date, l'heure, vous pouvez utiliser l' isEqual méthode de:

now.withZoneSameInstant(ZoneOffset.UTC)
    .isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true

Exemple

System.out.println("equals - ZoneId.of(\"UTC\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
System.out.println("equals - ZoneId.of(\"UTC\").normalized(): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())));
System.out.println("equals - ZoneId.of(\"Z\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("Z"))));
System.out.println("equals - ZoneId.of(\"+0\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("+0"))));
System.out.println("isEqual - ZoneId.of(\"UTC\"): "+ nowZoneOffset
        .isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))));

Sortie:

equals - ZoneId.of("UTC"): false
equals - ZoneId.of("UTC").normalized(): true
equals - ZoneId.of("Z"): true
equals - ZoneId.of("+0"): true
isEqual - ZoneId.of("UTC"): true

7voto

fad3d Points 548

Si vous mettez les deux en String, vous verrez que le premier est 2016-09-15T09: 01: 13.816Z et le second est 2016-09-15T09: 01: 13.816Z [UTC], ils sont en fait les mêmes mais le avec zoneID vous obtenez un extra [UTC]

EDIT: Cochez la réponse de @DVarga pour la faire comme vous le souhaitez

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X