ZoneOffset di Java

1. Pengenalan

Di dunia kita, setiap negara mengikuti zon waktu tertentu. Zon waktu ini sangat penting untuk menyatakan masa dengan senang dan berkesan. Walau bagaimanapun, zon waktu kadangkala tidak dapat dijelaskan kerana pemboleh ubah seperti penjimatan waktu siang, masuk ke dalam gambar.

Lebih-lebih lagi, semasa mewakili zon waktu ini dalam kod kami, perkara boleh membingungkan. Java telah menyediakan beberapa kelas seperti Date , Time dan DateTime pada masa lalu untuk juga mengurus zon waktu.

Namun, versi Java baru hadir dengan kelas yang lebih berguna dan ekspresif seperti ZoneId dan ZoneOffset , untuk menguruskan zon waktu.

Dalam artikel ini, kita akan membincangkan ZoneId dan ZoneOffset serta kelas DateTime yang berkaitan .

Kami juga dapat membaca mengenai set kelas DateTime baru yang diperkenalkan di Java 8, dalam catatan kami sebelumnya.

2. ZoneId dan ZoneOffset

Dengan munculnya JSR-310, beberapa API berguna telah ditambahkan untuk menguruskan tarikh, waktu dan zon waktu. Kelas ZoneId dan ZoneOffset juga ditambahkan sebagai sebahagian daripada kemas kini ini.

2.1. ZonId

Seperti yang dinyatakan di atas, ZoneId adalah representasi dari zon waktu seperti ' Eropah / Paris '.

Terdapat 2 pelaksanaan ZonId . Pertama, dengan ofset tetap berbanding GMT / UTC. Dan kedua, sebagai wilayah geografi, yang mempunyai sekumpulan peraturan untuk menghitung ofset dengan GMT / UTC.

Mari buat ZoneId untuk Berlin, Jerman:

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

2.2. ZonOffset

ZoneOffset memperluas ZoneId dan menentukan ofset tetap zon waktu semasa dengan GMT / UTC , seperti +02: 00.

Ini bermaksud bahawa nombor ini mewakili jam dan minit yang tetap, mewakili perbezaan antara waktu di zon waktu semasa dan GMT / UTC:

LocalDateTime now = LocalDateTime.now(); ZoneId zone = ZoneId.of("Europe/Berlin"); ZoneOffset zoneOffSet = zone.getRules().getOffset(now);

Sekiranya sebuah negara mempunyai 2 offset yang berbeza - pada musim panas dan musim sejuk, akan ada 2 implementasi ZoneOffset yang berbeda untuk wilayah yang sama, oleh itu perlunya menentukan LocalDateTime .

3. Kelas DateTime

Seterusnya mari kita bincangkan beberapa kelas DateTime , yang sebenarnya memanfaatkan ZoneId dan ZoneOffset .

3.1. ZonedDateTime

ZonedDateTime adalah perwakilan tidak berubah dari tarikh-waktu dengan zon waktu dalam sistem kalendar ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 Eropah / Pari s. A ZonedDateTime memegang negeri bersamaan dengan tiga objek yang berasingan, LocalDateTime , yang ZoneId dan diselesaikan ZoneOffset .

Kelas ini menyimpan semua bidang tarikh dan waktu, dengan ketepatan nanodetik, dan zon waktu, dengan ZonOffset , untuk menangani waktu-tarikh tempatan yang samar-samar. Sebagai contoh, ZonedDateTime dapat menyimpan nilai “2 Oktober 2007 pada jam 13.45.123456789 +02: 00 di zon waktu Eropah / Paris”.

Mari dapatkan ZonedDateTime semasa untuk wilayah sebelumnya:

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

ZonedDateTime juga menyediakan fungsi terbina dalam, untuk menukar tarikh tertentu dari satu zon waktu ke zon waktu yang lain:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime adalah perwakilan tidak berubah dari tarikh-waktu dengan ofset dalam sistem kalendar ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 .

Kelas ini menyimpan semua medan tarikh dan masa, dengan ketepatan nanodetik, serta pengimbangan dari GMT / UTC . Sebagai contoh, OffsetDateTime dapat menyimpan nilai “2 Oktober 2007 pada jam 13.45.123456789 +02: 00”.

Mari dapatkan OffsetDateTime semasa dengan 2 jam ofset dari GMT / UTC:

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

3.3. OffsetTime

OffsetTime adalah objek tarikh-waktu yang tidak berubah yang mewakili waktu, sering dilihat sebagai offset jam-minit-kedua, dalam sistem kalendar ISO-8601, seperti 10: 15: 30 + 01: 00 .

Kelas ini menyimpan medan sepanjang masa, dengan ketepatan nanodetik, dan juga pengimbangan zon . Sebagai contoh, OffsetTime dapat menyimpan nilai "13: 45.30.123456789 + 02: 00".

Mari dapatkan OffsetTime semasadengan ofset 2 jam:

ZoneOffset zoneOffSet = ZoneOffset.of("+02:00"); OffsetTime time = OffsetTime.now(zoneOffSet);

4. Kesimpulan

Kembali ke titik fokus, ZoneOffset adalah representasi zon waktu dari segi perbezaan antara GMT / UTC dan waktu yang ditentukan. Ini adalah cara yang berguna untuk mewakili zon waktu, walaupun terdapat perwakilan lain juga tersedia.

Lebih-lebih lagi, ZoneId dan ZoneOffset tidak hanya digunakan secara bebas tetapi juga oleh kelas Java DateTime tertentu seperti ZonedDateTime , OffsetDateTime , dan OffsetTime .

Seperti biasa, kod tersebut terdapat di repositori GitHub kami.