Perbedaan Antara ZonedDateTime dan OffsetDateTime

1. Ikhtisar

ZonedDateTime dan OffsetDateTime adalah kelas yang cukup populer di Java 8 DateTime API . Selain itu, keduanya menyimpan sekejap di timeline hingga presisi nanodetik . Dan, pada awalnya, mungkin membingungkan untuk memilih di antara keduanya.

Dalam tutorial singkat ini, kita akan melihat perbedaan antara ZonedDateTime dan OffsetDateTime .

2. ZonedDateTime

Sebuah ZonedDateTime adalah representasi berubah dari tanggal-waktu dengan zona waktu dalam sistem kalender ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 Eropa / Pari s. Ini memegang status yang setara dengan tiga objek terpisah: LocalDateTime , ZoneId , dan ZoneOffset yang diselesaikan .

Di sini, ZoneId menentukan bagaimana dan kapan offset berubah. Jadi, offset tidak dapat disetel secara bebas, karena zona mengontrol offset mana yang valid.

Untuk mendapatkan ZonedDateTime saat ini untuk wilayah tertentu, kami akan menggunakan:

ZoneId zone = ZoneId.of("Europe/Berlin"); ZonedDateTime zonedDateTime = ZonedDateTime.now(zone);

Kelas ZonedDateTime juga menyediakan metode bawaan untuk mengonversi tanggal tertentu dari satu zona waktu ke zona waktu lainnya:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

Terakhir, ini sepenuhnya sadar DST dan menangani penyesuaian waktu musim panas. Ini sering kali berguna saat kita ingin menampilkan bidang tanggal-waktu dalam zona waktu tertentu.

3. OffsetDateTime

Sebuah OffsetDateTime adalah representasi berubah dari tanggal-waktu dengan offset dari UTC / Greenwich dalam sistem kalender ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 . Dengan kata lain, ini menyimpan semua bidang tanggal dan waktu, dengan presisi nanodetik, serta offset dari GMT / UTC .

Mari kita dapatkan OffsetDateTime saat ini dengan offset dua jam dari GMT / UTC:

ZoneOffset zoneOffSet= ZoneOffset.of("+02:00"); OffsetDateTime offsetDateTime = OffsetDateTime.now(zoneOffSet);

4. Perbedaan Utama

Pertama, tidak masuk akal (tanpa konversi) untuk membandingkan secara langsung dua tanggal dengan informasi zona waktu penuh. Oleh karena itu, kita harus selalu lebih suka menyimpan OffsetDateTime dalam database daripada ZonedDateTime , karena tanggal dengan offset waktu lokal selalu mewakili waktu yang sama.

Selain itu, tidak seperti ZonedDateTime , menambahkan indeks di atas kolom yang menyimpan OffsetDateTime tidak akan mengubah arti tanggal.

Mari kita ringkas perbedaan utamanya.

ZonedDateTime :

  • menyimpan semua bidang tanggal dan waktu, dengan presisi nanodetik, dan zona waktu, dengan offset zona yang digunakan untuk menangani waktu tanggal lokal yang ambigu
  • tidak dapat dengan bebas mengatur offset, karena zona mengontrol nilai offset yang valid
  • sepenuhnya sadar DST dan menangani penyesuaian penghematan siang hari
  • berguna untuk menampilkan bidang tanggal-waktu dalam zona waktu khusus pengguna

OffsetDateTime :

  • menyimpan semua bidang tanggal dan waktu, dengan presisi nanodetik, serta offset dari GMT / UTC (tidak ada informasi zona waktu)
  • harus digunakan untuk menyimpan tanggal dalam database atau mengkomunikasikannya melalui jaringan

5. Kesimpulan

Dalam tutorial ini, kami membahas perbedaan antara ZonedDateTime dan OffsetDateTime .

Seperti biasa, kode sumber lengkap tersedia di Github.