Perbezaan Antara ZonedDateTime dan OffsetDateTime

1. Gambaran keseluruhan

ZonedDateTime dan OffsetDateTime adalah kelas yang cukup popular di Java 8 DateTime API . Selanjutnya, kedua-duanya menyimpan sekejap pada garis masa hingga ketepatan nanodetik . Dan, pada mulanya, mungkin membingungkan untuk memilih antara mereka.

Dalam tutorial ringkas ini, kita akan melihat perbezaan antara ZonedDateTime dan OffsetDateTime .

2. ZonedDateTime

A ZonedDateTime merupakan perwakilan yang tetap tarikh-masa dengan zon waktu dalam sistem kalendar ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 Eropah / Pari s. Ia menahan keadaan bersamaan dengan tiga objek yang terpisah: LocalDateTime , ZoneId , dan ZoneOffset yang diselesaikan .

Di sini, ZoneId menentukan bagaimana dan kapan ofset berubah. Jadi, ofset tidak dapat diatur secara bebas, kerana zon mengawal offset mana yang sah.

Untuk mendapatkan ZonedDateTime semasa untuk wilayah tertentu, kami akan menggunakan:

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

The ZonedDateTime kelas juga menyediakan terbina dalam kaedah untuk menukarkan tarikh yang diberikan dari satu zon waktu yang lain:

ZonedDateTime destZonedDateTime = sourceZonedDateTime.withZoneSameInstant(destZoneId);

Akhirnya, ia sepenuhnya menyedari DST dan menangani penyesuaian waktu menjimatkan waktu siang. Selalunya sangat berguna apabila kita mahu memaparkan bidang waktu-tarikh dalam zon waktu tertentu.

3. OffsetDateTime

An OffsetDateTime merupakan perwakilan yang tetap tarikh masa dengan mengimbangi daripada UTC / Greenwich dalam sistem kalendar ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 . Dengan kata lain, ia menyimpan semua medan tarikh dan waktu, hingga ketepatan nanodetik, serta pengimbangan dari GMT / UTC .

Mari dapatkan OffsetDateTime semasa dengan offset dua jam dari GMT / UTC:

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

4. Perbezaan Utama

Pertama, tidak masuk akal (tanpa penukaran) untuk membandingkan dua tarikh secara langsung dengan maklumat zon waktu penuh. Oleh itu, kita harus lebih suka menyimpan OffsetDateTime dalam pangkalan data berbanding ZonedDateTime , kerana tarikh dengan ofset waktu tempatan selalu mewakili instan yang sama dalam masa.

Lebih-lebih lagi, tidak seperti dengan ZonedDateTime , menambahkan indeks pada lajur yang menyimpan OffsetDateTime tidak akan mengubah makna tarikh.

Mari kita ringkas perbezaan utama.

ZonedDateTime :

  • menyimpan semua medan tarikh dan waktu, dengan ketepatan nanodetik, dan zon waktu, dengan pengimbangan zon yang digunakan untuk menangani tarikh-tarikh tempatan yang samar-samar
  • tidak dapat mengatur offset secara bebas, kerana zon mengawal nilai ofset yang sah
  • sedar sepenuhnya DST dan menangani penyesuaian penjimatan siang
  • sangat berguna untuk memaparkan bidang waktu-tarikh di zon waktu khusus pengguna

OffsetDateTime :

  • menyimpan semua medan tarikh dan masa, dengan ketepatan nanodetik, serta pengimbangan dari GMT / UTC (tiada maklumat zon waktu)
  • harus digunakan untuk menyimpan tarikh dalam pangkalan data atau menyampaikannya melalui rangkaian

5. Kesimpulan

Dalam tutorial ini, kita membahas perbezaan antara ZonedDateTime dan OffsetDateTime .

Seperti biasa, kod sumber lengkap boleh didapati di Github.