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