1. Memperkenalkan API Masa Tarikh

Memperkenalkan API Masa Tarikh

Pencipta Java tidak menyukai situasi dengan kelas Tarikh dan Kalendar. Mereka baik pada zaman mereka, tetapi masa berubah. Dan sesuatu yang mudah, berkuasa dan boleh dipercayai menjadi perlu. Dan dengan keluaran Java 8 (15 tahun selepas Calendarmuncul), Java Date Time API telah diperkenalkan. Ia adalah satu set kelas yang sepatutnya dapat menyelesaikan setiap kemungkinan tugas yang berkaitan dengan masa.

Terdapat begitu banyak kelas sehingga mereka dibahagikan kepada beberapa pakej:

Pakej tersebut java.timeialah pakej asas untuk Java Date Time API: ia mengandungi kelas seperti LocalDate, LocalTime, LocalDateTime, Instant, Period, dan Duration. Semua objek kelas ini adalah immutable, yang bermaksud ia tidak boleh ditukar selepas penciptaan.

Pakej ini java.time.formatmengandungi kelas untuk pemformatan masa, iaitu menukar masa (dan tarikh) kepada rentetan dan sebaliknya. Sebagai contoh, ia mengandungi DateTimeFormatterkelas serba boleh, yang menggantikan SimpleDateFormatkelas.

Pakej ini java.time.zonemengandungi kelas untuk bekerja dengan zon waktu. Ia mengandungi kelas seperti TimeZonedan ZonedDateTime. Jika anda menulis kod pelayan untuk pelanggan yang terletak di bahagian lain di dunia, anda benar-benar memerlukan kelas ini.


2. LocalDatekelas

Kelas pertama dan paling berguna daripada API Masa Tarikh yang akan kita lihat ialah kelas LocalDate. Seperti yang anda mungkin boleh meneka dari namanya, kelas ini direka bentuk untuk berfungsi dengan tarikh.

Objek kelas ini tidak berubah selepas ia dicipta, iaitu kelas LocalDatetidak boleh diubah. Tetapi sifat ini menambah kesederhanaan dan kebolehpercayaan kepada kelas. Terutama jika beberapa utas (benang pelaksanaan) berinteraksi dengan objek sedemikian pada masa yang sama.

Untuk mencipta LocalDateobjek baharu, anda perlu menggunakan salah satu kaedah statik. Berikut adalah senarai yang utama.

Mendapat tarikh semasa

Untuk mendapatkan tarikh semasa, anda perlu menggunakan now()kaedah statik. Ini lebih mudah daripada yang kelihatan:

LocalDate today = LocalDate.now();

Di mana todaypembolehubah LocalDate, dan LocalDate.now()merupakan panggilan kepada now()kaedah statik kelas LocalDate.

Contoh:

Kod Output konsol
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Mendapatkan tarikh dalam zon waktu tertentu

Kelas LocalDatejuga mempunyai variasi kaedah now(ZoneId)yang membolehkan anda mendapatkan tarikh semasa dalam zon waktu tertentu.

Untuk melakukan ini, kita memerlukan kelas lain — ZoneIdkelas (java.time.ZoneId). Ia mempunyai of()kaedah yang mengembalikan ZoneIdobjek yang diberi nama zon waktu.

Untuk menentukan tarikh semasa di Shanghai, anda perlu menulis kod berikut:

Kod Output konsol
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Anda boleh mencari senarai nama semua zon waktu di Internet.


3. Mendapat tarikh tertentu

Untuk mendapatkan LocalDateobjek yang mewakili tarikh tertentu, anda perlu menggunakan of()kaedah statik. Segala-galanya di sini juga sangat mudah dan jelas:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Di mana datepembolehubah LocalDate, dan merupakan panggilan kepada kaedah statik kelas .LocalDate.of()of()LocalDate

Di sini kita melihat FEBRUARYpemalar kelas Month(java.time.Month) digunakan untuk menentukan Februari sebagai bulan.

Anda juga boleh menentukan bulan dengan cara lama — menggunakan nombor:

LocalDate date = LocalDate.of(2019, 2, 22);

dua? Daripada bulan Februari? Adakah itu bermakna bulan sekali lagi dinomborkan daripada satu?

Ya, hampir 20 tahun selepas penciptaan Java, bulan akhirnya berhenti dinomborkan daripada sifar.

Contoh:

Kod Output konsol
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Mendapatkan tarikh mengikut indeks hari itu

Terdapat satu lagi cara yang menarik untuk membuat tarikh: menggunakan ofYearDaykaedah tersebut, anda boleh mendapatkan tarikh berdasarkan hanya pada bilangan tahun dan indeks hari dalam tahun tersebut. Berikut adalah penampilan umum:

LocalDate date = LocalDate.ofYearDay(year, day);

Di manakah yearbilangan tahun dan dayindeks hari dalam tahun tersebut.

Contoh:

Kod Output konsol
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Hari ke-100 tahun 2019 ialah 10 April.

Mendapat tarikh Unix

Adakah anda masih ingat bahawa Dateobjek sentiasa menyimpan masa sebagai bilangan milisaat sejak 1 Januari 1970? Untuk memastikan pengaturcara tidak akan terlepas zaman yang indah, LocalDatekelas mendapat ofEpochDay()kaedah, yang mengembalikan tarikh yang dikira dari 1 Januari 1970. Berikut ialah penampilan umum:

LocalDate date = LocalDate.ofEpochDay(day);

Di manakah daybilangan hari yang telah berlalu sejak 1 Januari 1970.

Contoh:

Kod Output konsol
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Mendapatkan unsur tarikh

Tidak mustahil untuk menukar LocalDateobjek, tetapi anda boleh mendapatkan elemen individu tarikh yang disimpan. LocalDateobjek mempunyai beberapa kaedah untuk ini:

Kaedah Penerangan
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
int getDayOfYear()
Mengembalikan indeks hari dari awal tahun
DayOfWeek getDayOfWeek()
Mengembalikan hari dalam seminggu: salah satu daripada beberapa pemalar
MONDAY, TUESDAY, ...;
IsoEra getEra()
Mengembalikan era: sama ada BCE(Sebelum Era Semasa) dan CE(Era Semasa)

Contoh:

Kod Output konsol
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Menukar tarikh dalam LocalDateobjek

Kelas LocalDatemengandungi beberapa kaedah yang membolehkan anda bekerja dengan tarikh. Pelaksanaan kaedah ini adalah serupa dengan kaedah kelas String: mereka tidak mengubah LocalDateobjek sedia ada, sebaliknya mengembalikan yang baru dengan data yang dikehendaki.

Berikut adalah kaedah kelas LocalDate:

Kaedah Penerangan
plusDays(int days)
Menambah bilangan hari yang ditentukan pada tarikh tersebut
plusWeeks(int weeks)
Menambah minggu ke tarikh
plusMonths(int months)
Menambah bulan pada tarikh
plusYears(int years)
Menambah tahun pada tarikh
minusDays(int days)
Menolak hari dari tarikh
minusWeeks(int weeks)
Menolak minggu dari tarikh
minusMonths(int months)
Menolak bulan dari tarikh
minusYears(int years)
Menolak tahun dari tarikh

Contoh:

Kod Output konsol
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Kaedah birthday objectyang kami panggil tidak berubah. Sebaliknya, kaedahnya mengembalikan objek baharu yang mengandungi data yang dikehendaki.