La réponse vient de la javadoc of ZoneId
...
Un IDZone est utilisé pour identifier les règles utilisées pour convertir entre un instantané et un LocalDateTime. Il existe deux types distincts de ID:
- décalages fixes - un entièrement résolu décalés par rapport à UTC/Greenwich, qui utilise le même décalage pour toutes les dates-heures locales
- régions géographiques - une zone où un ensemble spécifique de règles pour trouver le décalage d'UTC/Greenwich s'appliquent
La plupart des offsets fixes sont représentés par ZoneOffset. L'appel normalisé() sur n'importe quel ZoneId garantira qu'un ID de décalage fixe sera représenté en tant que ZoneOffset.
... et du javadoc of ZoneId#of
:
Cette méthode parse l'ID ou la production d'un IDZone ZoneOffset. A ZoneOffset est renvoyé si l'ID est 'Z' ou commence par '+' ou '-'.
L'identifiant de l'argument est spécifié comme "UTC"
, par conséquent, il renvoie un ZoneId
avec un décalage, ce qui a également présenté sous forme de 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]
Comme vous utilisez la méthode equals
pour la comparaison, vous vérifiez l'équivalence d'objet. En raison de la différence décrite, le résultat de l'évaluation est false
.
Lorsque la méthode normalized()
est utilisé comme proposé dans la documentation, la comparaison à l'aide equals
retournera true
, comme normalized()
renverra le correspondant ZoneOffset
:
normalise l'ID de fuseau horaire, retour d'un ZoneOffset si possible .
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
Comme l'indique la documentation, si vous utilisez "Z"
ou "+0"
comme id d'entrée, of
renverra directement le ZoneOffset
et il n'y a pas besoin 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érifiez s'ils stockent la même heure de date, vous pouvez utiliser la méthode isEqual
à la place:
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