1. ZonedDateTimekelas

Terdapat satu lagi kelas yang sangat menarik dalam API Masa Tarikh: kelas ZonedDateTime. Tujuan utamanya adalah untuk memudahkan anda bekerja dengan tarikh dalam zon waktu yang berbeza.

LocalDatebagus untuk mewakili tarikh. Contohnya, hari lahir. Hari lahir saya 15 Mac tidak kira di mana saya berada. Ini adalah contoh tarikh.

LocalTimebagus untuk menggambarkan masa, seperti masa yang ditetapkan pada jam penggera: Saya menetapkan penggera pada 5:00 pagi dan tidak kira di mana saya berada. 5:00 pagi ialah 5:00 pagi. Ini adalah contoh bekerja dengan masa.

Sekarang katakan bahawa kami sedang menulis aplikasi yang menempah penerbangan. Pesawat berlepas dan tiba berdasarkan waktu tempatan. Pesawat berada di udara untuk masa yang tetap, tetapi zon waktu boleh berubah.

Zon masa

By the way, zon waktu adalah keadaan huru-hara. Dan jika anda fikir terdapat 24 zon waktu, anda silap besar.

Sebagai contoh, masa di India berbeza daripada Waktu Purata Greenwich sebanyak lima setengah jam: GMT+5:30. Sesetengah negara beralih kepada masa penjimatan siang, dan yang lain tidak. Apatah lagi, negara yang berbeza bertukar kepada waktu musim panas pada masa yang berbeza dalam setahun.

Dan sesetengah negara meluluskan undang-undang yang membatalkan masa penjimatan siang, atau memperkenalkannya semula, atau membatalkannya semula.

Walau apa pun, dunia mempunyai zon waktu, dan dalam setiap zon waktu terdapat satu masa. Masa di zon berbeza mungkin bertepatan dalam tempoh tertentu dalam setahun, dan kemudian berbeza dalam tempoh lain. Zon waktu biasanya dinamakan sempena bandar utama yang terletak di dalamnya: Europe/Monaco, Asia/Singapore, tetapi terdapat juga pengecualian — US/Pacific.

Secara rasmi, terdapat 599 zon waktu pada masa ini. Fikirkanlah: 599. Itu jauh dari 24. Selamat datang ke dunia global.

Kelas ZoneIddaripada java.timepakej digunakan untuk menyimpan zon waktu di Jawa.

Dengan cara ini, ia mempunyai getAvailableZoneIds()kaedah statik, yang mengembalikan set semua zon waktu yang diketahui sekarang. Untuk mendapatkan senarai semua zon, anda perlu menulis kod berikut:

Kod Output konsol (separa)
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()kaedah statik;

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


2. Mencipta ZonedDateTimeobjek

Apabila mencipta ZonedDateTimeobjek, anda perlu memanggil kaedah statik kelas now()dan menghantar ZoneIdobjek kepadanya.

Kod Output 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 menghantar ZoneIdobjek ke now()kaedah (dan itu dibenarkan), maka zon waktu ditentukan secara automatik berdasarkan tetapan komputer yang menjalankan program.

Contoh:

Kod Output konsol
ZonedDateTime time = ZonedDateTime.now();
System.out.println(time);

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

Menukar tarikh global kepada tarikh tempatan

Salah satu ciri menarik ZonedDateTimeialah keupayaannya untuk menukar kepada tarikh dan masa tempatan. 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 masa

Seperti LocalDateTimekelas, ZonedDateTimekelas mempunyai banyak cara untuk mendapatkan elemen individu tarikh dan masa. Berikut ialah senarai kaedah ini:

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

Semua kaedah adalah serupa dengan kaedah kelas LocalDateTime. Dan, sudah tentu, ZonedDateTimekelas mempunyai kaedah yang membolehkan anda bekerja dengan tarikh dan masa. Yang berkata, objek di mana kaedah dipanggil tidak berubah. Sebaliknya, mereka mengembalikan ZonedDateTimeobjek baharu:

Kaedah Penerangan
plusYears(int)
Menambah tahun pada tarikh
plusMonths(int)
Menambah bulan pada tarikh
plusDays(int)
Menambah hari pada tarikh
plusHours(int)
Menambah jam
plusMinutes(int)
Menambah minit
plusSeconds(int)
Menambah detik
plusNanos(int)
Menambah nanosaat
minusYears(int)
Menolak tahun dari tarikh
minusMonths(int)
Menolak bulan dari tarikh
minusDays(int)
Menolak hari dari tarikh
minusHours(int)
Menolak jam
minusMinutes(int)
Menolak minit
minusSeconds(int)
Menolak saat
minusNanos(int)
Menolak nanosaat

Kami tidak akan memberikan sebarang contoh, kerana kami fikir semuanya di sini jelas dengan analogi dengan kelas yang baru kami pertimbangkan.