2016-09-15 4 views

Répondre

60

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 
6

Si vous mettez tous les deux dans la chaîne, 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 la même chose, mais avec la IDZone vous obtenez un supplémentaire [UTC]

EDIT: Vérifiez @DVarga s répondez afin de l'obtenir comme vous le souhaitez