Kenapa
ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
mencetak false
?
Saya berharap kedua ZonedDateTime
contoh sama.
Jawabannya berasal dari javadocZoneId
(penekanan saya) ...
ZoneId digunakan untuk mengidentifikasi aturan yang digunakan untuk mengonversi antara Instan dan LocalDateTime. Ada dua jenis ID yang berbeda:
- Offset tetap - offset yang diselesaikan sepenuhnya dari UTC / Greenwich, yang menggunakan offset yang sama untuk semua tanggal-waktu lokal
- Kawasan geografis - area di mana sekumpulan aturan khusus untuk menemukan pengimbangan dari UTC / Greenwich berlaku
Sebagian besar offset tetap diwakili oleh ZoneOffset. Memanggil normalized () pada ZoneId mana pun akan memastikan bahwa ID offset tetap akan direpresentasikan sebagai ZoneOffset.
... dan dari javadocZoneId#of
(penekanan saya):
Metode ini mem-parsing ID yang menghasilkan ZoneId atau ZoneOffset. ZoneOffset dikembalikan jika ID-nya adalah 'Z', atau dimulai dengan '+' atau '-' .
Id argumen ditentukan sebagai "UTC"
, oleh karena itu ia akan mengembalikan ZoneId
dengan offset, yang juga disajikan dalam bentuk string:
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));
Keluaran:
2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]
Saat Anda menggunakan equals
metode untuk perbandingan, Anda memeriksa kesetaraan objek . Karena perbedaan yang dijelaskan, hasil evaluasi adalah false
.
Ketika normalized()
metode digunakan seperti yang diusulkan dalam dokumentasi, perbandingan menggunakan equals
akan kembali true
, seperti yang normalized()
akan mengembalikan ZoneOffset
:
Menormalkan ID zona waktu, mengembalikan ZoneOffset jika memungkinkan.
now.withZoneSameInstant(ZoneOffset.UTC)
.equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
Seperti yang dinyatakan dalam dokumentasi, jika Anda menggunakan "Z"
atau "+0"
sebagai input id, of
akan mengembalikan ZoneOffset
secara langsung dan tidak perlu memanggil normalized()
:
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
Untuk memeriksa apakah mereka menyimpan waktu tanggal yang sama , Anda dapat menggunakan isEqual
metode ini sebagai gantinya:
now.withZoneSameInstant(ZoneOffset.UTC)
.isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true
Sampel
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"))));
Keluaran:
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")
memberi AndaZoneOffset.UTC
tetapiZoneId.of("UTC")
memberi AndaZoneId
(yang tidakZoneOffset.UTC
). API ini tidak intuitif, untuk sedikitnya.