2016-09-15 10 views

Odpowiedz

60

Odpowiedź pochodzi z javadoc of ZoneId ...

ZoneId służy do określenia zasad stosowanych do konwersji pomiędzy położeniem błyskawiczne oraz LocalDateTime. Istnieją dwa różne rodzaje ID:

  • Stałe przesunięcia - w pełni rozwiązany offsetowe z UTC/Greenwich, że używa tego samego przesunięcia dla wszystkich lokalnych Date-razy
  • regionów geograficznych - obszar, gdzie specyficzny zestaw zasady ustalania przesunięcia od czasu UTC/Greenwich mają zastosowanie

Większość stałych przesunięć jest reprezentowana przez ZoneOffset. Wywołanie znormalizowanego() dla każdego identyfikatora ZoneId zapewni, że ustalony identyfikator przesunięcia będzie reprezentowany jako jako ZoneOffset.

... i od javadoc of ZoneId#of:

Metoda ta analizuje identyfikator wytwarzającą ZoneId lub ZoneOffset. A ZoneOffset jest zwracany, jeśli identyfikator to "Z" lub zaczyna się od "+" lub "-".

Argument id jest określona jako "UTC" zatem powróci do ZoneId z offsetem, co również występować w postaci łańcucha:

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

Wyjścia:

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

Podczas korzystania z metody equals w celu porównania, należy sprawdzić, czy obiekt jest równoważny 0123.. Z powodu opisanej różnicy, wynikiem oceny jest false.

Gdy sposób normalized() jest używany, jak zaproponowano w dokumentacji porównanie stosując equals powróci true jak normalized() zwraca odpowiedni ZoneOffset:

Normalizuje ID strefy czasowej, przekazujących ZoneOffset w miarę możliwości .

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

Jak stwierdza dokumentacji, jeśli używasz "Z" lub "+0" jak id wejściowego, of zwróci ZoneOffset bezpośrednio i nie ma potrzeby, aby zadzwonić normalized():

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

Do sprawdź , jeśli przechowują ten sam czas na datę, możesz zamiast tego użyć metody isEqual:

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

Próbka

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")))); 

wyjściowa:

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

Jeśli umieścisz oboje w String widać, że pierwszy z nich jest 2016 -09-15T09: 01: 13.816Z a drugi jest 2016-09-15T09: 01: 13.816Z [UTC] rzeczywistości są takie same, ale z zoneID dostać jeden dodatkowy [UTC]

EDIT: Sprawdź @DVarga s odpowiedź, aby uzyskać go w taki sposób, w jaki chcesz