ZoneOffset di Java

1. Perkenalan

Di dunia kita, setiap negara mengikuti zona waktu tertentu. Zona waktu ini sangat penting untuk mengekspresikan waktu dengan nyaman dan efektif. Namun, zona waktu terkadang bisa tidak eksplisit karena variabel seperti waktu musim panas, yang muncul.

Selain itu, saat merepresentasikan zona waktu ini dalam kode kami, banyak hal bisa membingungkan. Java telah menyediakan beberapa kelas seperti Date , Time dan DateTime di masa lalu untuk juga mengatur zona waktu.

Namun, versi Java baru telah hadir dengan kelas yang lebih berguna dan ekspresif seperti ZoneId dan ZoneOffset , untuk mengelola zona waktu.

Pada artikel ini, kita akan membahas ZoneId dan ZoneOffset serta kelas DateTime terkait .

Kita juga bisa membaca tentang set baru kelas DateTime yang diperkenalkan di Java 8, di posting kita sebelumnya.

2. ZoneId dan ZoneOffset

Dengan munculnya JSR-310, beberapa API yang berguna ditambahkan untuk mengelola tanggal, waktu, dan zona waktu. Kelas ZoneId dan ZoneOffset juga ditambahkan sebagai bagian dari pembaruan ini.

2.1. ZoneId

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

Ada 2 implementasi ZoneId . Pertama, dengan offset tetap dibandingkan dengan GMT / UTC. Dan kedua, sebagai wilayah geografis, yang memiliki seperangkat aturan untuk menghitung offset dengan GMT / UTC.

Mari buat ZoneId untuk Berlin, Jerman:

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

2.2. ZoneOffset

ZoneOffset memperluas ZoneId dan mendefinisikan offset tetap dari zona waktu saat ini dengan GMT / UTC , seperti +02: 00.

Artinya, angka ini mewakili jam dan menit tetap, mewakili perbedaan antara waktu dalam zona waktu saat ini dan GMT / UTC:

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

Jika suatu negara memiliki 2 offset berbeda - di musim panas dan musim dingin, akan ada 2 implementasi ZoneOffset berbeda untuk wilayah yang sama, oleh karena itu perlu menentukan LocalDateTime .

3. Kelas DateTime

Selanjutnya mari kita bahas beberapa kelas DateTime , yang benar-benar memanfaatkan ZoneId dan ZoneOffset .

3.1. ZonedDateTime

ZonedDateTime adalah representasi tanggal-waktu yang tidak dapat diubah dengan zona waktu dalam sistem kalender ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 Europe / Pari s. Sebuah ZonedDateTime memegang negara setara dengan tiga objek terpisah, LocalDateTime , sebuah ZoneId dan diselesaikan ZoneOffset .

Kelas ini menyimpan semua bidang tanggal dan waktu, dengan presisi nanodetik, dan zona waktu, dengan ZoneOffset , untuk menangani waktu tanggal lokal yang ambigu. Misalnya, ZonedDateTime dapat menyimpan nilai "2 Oktober 2007 pukul 13: 45.30.123456789 +02: 00 di zona waktu Eropa / Paris".

Mari kita dapatkan ZonedDateTime saat ini untuk wilayah sebelumnya:

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

ZonedDateTime juga menyediakan fungsi bawaan , untuk mengonversi tanggal tertentu dari satu zona waktu ke zona waktu lainnya:

ZonedDateTime destDate = sourceDate.withZoneSameInstant(destZoneId);

3.2. OffsetDateTime

OffsetDateTime adalah representasi tanggal-waktu yang tidak dapat diubah dengan offset dalam sistem kalender ISO-8601, seperti 2007-12-03T10: 15: 30 + 01: 00 .

Kelas ini menyimpan semua bidang tanggal dan waktu, dengan presisi nanodetik, serta offset dari GMT / UTC . Misalnya, OffsetDateTime dapat menyimpan nilai "2 Oktober 2007 pukul 13: 45.30.123456789 +02: 00".

Mari kita dapatkan OffsetDateTime saat ini dengan 2 jam ofset dari GMT / UTC:

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

3.3. OffsetTime

OffsetTime adalah objek tanggal-waktu tetap yang mewakili waktu, sering kali dilihat sebagai offset jam-menit-detik, dalam sistem kalender ISO-8601, seperti 10: 15: 30 + 01: 00 .

Kelas ini menyimpan semua bidang waktu, dengan presisi nanodetik, serta offset zona . Misalnya, OffsetTime dapat menyimpan nilai "13: 45.30.123456789 + 02: 00".

Mari kita dapatkan OffsetTime saat inidengan offset 2 jam:

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

4. Kesimpulan

Kembali ke titik fokus, ZoneOffset adalah representasi zona waktu dalam hal perbedaan antara GMT / UTC dan waktu tertentu. Ini adalah cara praktis untuk merepresentasikan zona waktu, meskipun ada representasi lain yang juga tersedia.

Selain itu, ZoneId dan ZoneOffset tidak hanya digunakan secara independen tetapi juga oleh kelas Java DateTime tertentu seperti ZonedDateTime , OffsetDateTime , dan OffsetTime .

Seperti biasa, kode tersedia di repositori GitHub kami.