1. ZonedDateTimekelas

Ada kelas lain yang sangat menarik di Date Time API: kelas ZonedDateTime. Tujuan utamanya adalah untuk memudahkan bekerja dengan tanggal di zona waktu yang berbeda.

LocalDatesangat bagus untuk mewakili tanggal. Misalnya, ulang tahun. Ulang tahun saya 15 Maret di mana pun saya berada. Ini adalah contoh kencan.

LocalTimesangat bagus untuk mendeskripsikan waktu, seperti waktu yang disetel pada jam alarm: Saya menyetel alarm untuk jam 5 pagi dan di mana pun saya berada. 5:00 pagi adalah 5:00 pagi. Ini adalah contoh bekerja dengan waktu.

Sekarang katakanlah kita sedang menulis aplikasi yang memesan penerbangan. Pesawat lepas landas dan tiba berdasarkan waktu setempat. Pesawat berada di udara untuk waktu yang tetap, tetapi zona waktu dapat berubah.

Zona waktu

Omong-omong, zona waktu benar-benar berantakan. Dan jika Anda mengira ada 24 zona waktu, Anda salah besar.

Misalnya, waktu di India berbeda lima setengah jam dari Greenwich Mean Time: GMT+5:30. Beberapa negara beralih ke waktu musim panas, dan yang lainnya tidak. Terlebih lagi, berbagai negara beralih ke waktu musim panas pada waktu yang berbeda dalam setahun.

Dan beberapa negara mengeluarkan undang-undang yang membatalkan waktu musim panas, atau memperkenalkannya kembali, atau membatalkannya lagi.

Bagaimanapun, dunia memiliki zona waktu, dan dalam setiap zona waktu ada satu waktu. Waktu di zona yang berbeda mungkin bertepatan selama periode tertentu dalam setahun, dan kemudian berbeda selama periode lainnya. Zona waktu biasanya dinamai berdasarkan kota-kota besar yang terletak di dalamnya: Europe/Monaco, Asia/Singapore, tetapi ada juga pengecualian — US/Pacific.

Secara resmi, ada 599 zona waktu saat ini. Coba pikirkan: 599. Itu jauh dari 24. Selamat datang di dunia global.

Kelas ZoneIddari java.timepaket digunakan untuk menyimpan zona waktu di Jawa.

Omong-omong, ini memiliki getAvailableZoneIds()metode statis, yang mengembalikan kumpulan semua zona waktu yang diketahui saat ini. Untuk mendapatkan daftar semua zona, Anda perlu menulis kode berikut:

Kode Keluaran konsol (sebagian)
for (String s: ZoneId.getAvailableZoneIds())
   System.out.println(s);
Asia/Aden
America/Cuiaba
Etc/GMT+9
Etc/GMT+8

Untuk mendapatkan ZoneIdobjek dengan namanya, Anda perlu menggunakan of()metode statis;

Kode Catatan
ZoneId zone = ZoneId.of("Africa/Cairo");
Cairo


2. Membuat ZonedDateTimeobjek

Saat membuat ZonedDateTimeobjek, Anda perlu memanggil metode statis kelas now()dan meneruskan ZoneIdobjek ke sana.

Kode Keluaran konsol
ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime time = ZonedDateTime.now(zone);
System.out.println(time);


2019-02-22T11:37:58.074816+02:00[Africa/Cairo]

Jika Anda tidak meneruskan ZoneIdobjek ke now()metode (dan itu diperbolehkan), maka zona waktu ditentukan secara otomatis berdasarkan pengaturan komputer yang menjalankan program.

Contoh:

Kode Keluaran konsol
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

2019-02-22T13:39:05.70842+02:00[Europe/Helsinki]

Mengubah tanggal global menjadi tanggal lokal

Salah satu fitur menariknya ZonedDateTimeadalah kemampuannya untuk mengonversi ke tanggal dan waktu lokal. Contoh:

ZoneId zone = ZoneId.of("Africa/Cairo");
ZonedDateTime cairoTime = ZonedDateTime.now(zone);

LocalDate localDate = cairoTime.toLocalDate();
LocalTime localTime = cairoTime.toLocalTime();
LocalDateTime localDateTime = cairoTime.toLocalDateTime();

3. Bekerja dengan waktu

Seperti LocalDateTimekelas, ZonedDateTimekelas memiliki banyak cara untuk mendapatkan elemen individu dari tanggal dan waktu. Berikut adalah daftar metode tersebut:

int getYear()
Mengembalikan tahun dari tanggal tertentu
Month getMonth()
Mengembalikan bulan tanggal: salah satu dari beberapa konstanta —JANUARY, FEBRUARY, ...;
int getMonthValue()
Mengembalikan indeks bulan tanggal. Januari == 1
int getDayOfMonth()
Mengembalikan indeks hari dalam sebulan
DayOfWeek getDayOfWeek()
Mengembalikan hari dalam seminggu: salah satu dari beberapa konstanta —MONDAY, TUESDAY, ...;
int getDayOfYear()
Mengembalikan indeks hari dalam setahun
int getHour()
Mengembalikan jam
int getMinute()
Mengembalikan menit
int getSecond()
Mengembalikan detik
int getNano()
Mengembalikan nanodetik

Semua metode sangat mirip dengan metode kelas LocalDateTime. Dan, tentu saja, ZonedDateTimekelas tersebut memiliki metode yang memungkinkan Anda bekerja dengan tanggal dan waktu. Meskipun demikian, objek tempat metode dipanggil tidak berubah. Sebaliknya, mereka mengembalikan objek baru ZonedDateTime:

Metode Keterangan
plusYears(int)
Menambahkan tahun ke tanggal
plusMonths(int)
Menambahkan bulan ke tanggal
plusDays(int)
Menambahkan hari ke tanggal
plusHours(int)
Menambahkan jam
plusMinutes(int)
Menambahkan menit
plusSeconds(int)
Menambahkan detik
plusNanos(int)
Menambahkan nanodetik
minusYears(int)
Kurangi tahun dari tanggal
minusMonths(int)
Mengurangi bulan dari tanggal
minusDays(int)
Mengurangi hari dari tanggal
minusHours(int)
Mengurangi jam
minusMinutes(int)
Mengurangi menit
minusSeconds(int)
Mengurangi detik
minusNanos(int)
Mengurangi nanodetik

Kami tidak akan memberikan contoh apa pun, karena menurut kami semuanya di sini jelas dengan analogi dengan kelas yang baru saja kami pertimbangkan.