Відповідь походить від javadocZoneId
(моє наголос) ...
ZoneId використовується для ідентифікації правил, які використовуються для перетворення між Instant і LocalDateTime. Існує два різних типи ідентифікатора:
- Фіксований зсув - повністю вирішений зсув від UTC / Грінвіч, який використовує однакове зміщення для всіх місцевих дат
- Географічні регіони - область, де застосовується специфічний набір правил для знаходження зрушення від UTC / Грінвіч
Більшість фіксованих компенсацій представлені ZoneOffset. Виклик нормалізований () на будь-якому ZoneId забезпечить, що фіксований ідентифікатор зміщення буде представлений як ZoneOffset.
... і від javadocZoneId#of
(наголос міни):
Цей метод аналізує ідентифікатор, створюючи ZoneId або ZoneOffset. Зона повернення повертається, якщо ідентифікатор "Z", або починається з "+" або "-" .
Ідентифікатор аргументу вказаний як "UTC"
, тому він поверне a ZoneId
зі зміщенням, яке також представлено у рядковій формі:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
Виходи:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
Використовуючи equals
метод для порівняння, ви перевіряєте на предмет еквівалентність . Через описану різницю результат оцінки є false
.
Коли normalized()
метод використовується, як запропоновано в документації, порівняння з використанням equals
повернеться true
, як normalized()
і поверне відповідне ZoneOffset
:
Нормалізує ідентифікатор часового поясу, повертаючи ZoneOffset, де це можливо.
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
Як зазначено в документації, якщо ви використовуєте "Z"
або "+0"
як вхідний ідентифікатор, of
буде повернено ZoneOffset
безпосередньо, і не потрібно телефонувати normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
Щоб перевірити, чи зберігають вони один і той же час , ви можете скористатися isEqual
методом:
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
Зразок
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"))));
Вихід:
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
ZoneId.of("Z")
дає вам,ZoneOffset.UTC
алеZoneId.of("UTC")
дає вамZoneId
(це не такZoneOffset.UTC
). Цей API не менш інтуїтивно зрозумілий.