1. Memperkenalkan Date Time API

Memperkenalkan Date Time API

Pembuat Java tidak menyukai situasi dengan kelas Tanggal dan Kalender. Mereka bagus di zaman mereka, tetapi waktu berubah. Dan sesuatu yang sederhana, kuat, dan andal menjadi perlu. Dan dengan dirilisnya Java 8 (15 tahun setelah Calendarkemunculannya), Java Date Time API diperkenalkan. Ini adalah sekumpulan kelas yang harus dapat menyelesaikan setiap kemungkinan tugas yang berhubungan dengan waktu.

Ada begitu banyak kelas yang dibagi menjadi beberapa paket:

Paket tersebut java.timeadalah paket dasar untuk Java Date Time API: berisi kelas-kelas seperti LocalDate, LocalTime, LocalDateTime, Instant, Period, dan Duration. Semua objek dari kelas ini adalah immutable, yang artinya tidak dapat diubah setelah dibuat.

Paket tersebut java.time.formatberisi kelas-kelas untuk pemformatan waktu, yaitu mengonversi waktu (dan tanggal) menjadi string dan sebaliknya. Misalnya, berisi DateTimeFormatterkelas serbaguna, yang menggantikan SimpleDateFormatkelas.

Paket java.time.zoneberisi kelas untuk bekerja dengan zona waktu. Ini berisi kelas-kelas seperti TimeZonedan ZonedDateTime. Jika Anda menulis kode server untuk klien yang berlokasi di berbagai belahan dunia, Anda akan sangat membutuhkan kelas-kelas ini.


2. LocalDatekelas

Kelas pertama dan paling berguna dari Date Time API yang akan kita lihat adalah kelasnya LocalDate. Seperti yang mungkin bisa Anda tebak dari namanya, kelas ini dirancang untuk bekerja dengan tanggal.

Objek kelas ini tidak berubah setelah dibuat, artinya kelas LocalDatetidak dapat diubah. Tetapi properti ini menambah kesederhanaan dan keandalan kelas. Apalagi jika beberapa utas (utas eksekusi) berinteraksi dengan objek seperti itu pada saat yang bersamaan.

Untuk membuat LocalDateobjek baru, Anda perlu menggunakan salah satu metode statis. Berikut adalah daftar yang utama.

Mendapatkan tanggal saat ini

Untuk mendapatkan tanggal saat ini, Anda perlu menggunakan now()metode statis. Ini jauh lebih mudah daripada yang terlihat:

LocalDate today = LocalDate.now();

Di mana todayvariabel LocalDate, dan LocalDate.now()merupakan panggilan ke now()metode statis kelas LocalDate.

Contoh:

Kode Keluaran konsol
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Mendapatkan tanggal di zona waktu tertentu

Kelas LocalDatejuga memiliki variasi metode now(ZoneId)yang memungkinkan Anda mendapatkan tanggal saat ini di zona waktu tertentu.

Untuk melakukan ini, kita memerlukan kelas lain — ZoneIdkelas (java.time.ZoneId). Ini memiliki of()metode yang mengembalikan ZoneIdobjek yang diberi nama zona waktu.

Untuk menentukan tanggal sekarang di Shanghai, Anda perlu menulis kode berikut:

Kode Keluaran 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 dapat menemukan daftar nama semua zona waktu di Internet.


3. Mendapatkan tanggal tertentu

Untuk mendapatkan LocalDateobjek yang mewakili tanggal tertentu, Anda perlu menggunakan of()metode statis. Semuanya di sini juga sangat sederhana dan jelas:

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

Di mana datevariabel LocalDate, dan merupakan panggilan ke metode statis kelas .LocalDate.of()of()LocalDate

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

Anda juga dapat menentukan bulan dengan cara kuno — menggunakan angka:

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

Dua? Bukan Februari? Apakah itu berarti bulan sekali lagi diberi nomor dari satu?

Ya, hampir 20 tahun setelah pembuatan Java, bulan akhirnya berhenti diberi nomor dari nol.

Contoh:

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

Today = 2019-02-22

Mendapatkan tanggal berdasarkan indeks hari ini

Ada cara lain yang menarik untuk membuat tanggal: dengan menggunakan ofYearDaymetode ini, Anda bisa mendapatkan tanggal hanya berdasarkan angka tahun dan indeks hari dalam setahun. Berikut tampilan umumnya:

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

Di mana yearangka tahun dan daymerupakan indeks hari dalam setahun.

Contoh:

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

Today = 2019-04-10

Hari ke-100 tahun 2019 adalah 10 April.

Mendapatkan tanggal Unix

Ingatkah Anda bahwa Dateobjek selalu menyimpan waktu dalam hitungan milidetik sejak 1 Januari 1970? Untuk memastikan pemrogram tidak akan melewatkan masa lalu yang indah, LocalDatekelas mendapatkan sebuah ofEpochDay()metode, yang mengembalikan tanggal yang dihitung dari 1 Januari 1970. Berikut tampilan umumnya:

LocalDate date = LocalDate.ofEpochDay(day);

Dimana dayjumlah hari yang telah berlalu sejak 1 Januari 1970.

Contoh:

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

Today = 1970-01-02

4. Mendapatkan elemen kencan

Tidak mungkin mengubah LocalDateobjek, tetapi Anda bisa mendapatkan elemen individual dari tanggal yang disimpan. LocalDateobjek memiliki beberapa metode untuk ini:

metode Keterangan
int getYear()
Mengembalikan tahun dari tanggal tertentu
Month getMonth()
Mengembalikan tanggal bulan: salah satu dari beberapa konstanta
JANUARY, FEBRUARY, ...;
int getMonthValue()
Mengembalikan indeks bulan tanggal. 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 dari beberapa konstanta
MONDAY, TUESDAY, ...;
IsoEra getEra()
Mengembalikan era: baik BCE(Sebelum Era Saat Ini) dan CE(Era Saat Ini)

Contoh:

Kode Keluaran 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. Mengubah tanggal pada suatu LocalDateobjek

Kelas LocalDateberisi beberapa metode yang memungkinkan Anda bekerja dengan tanggal. Penerapan metode ini serupa dengan metode kelas String: mereka tidak mengubah LocalDateobjek yang ada, melainkan mengembalikan objek baru dengan data yang diinginkan.

Berikut adalah metode kelas LocalDate:

metode Keterangan
plusDays(int days)
Menambahkan jumlah hari tertentu ke tanggal
plusWeeks(int weeks)
Menambahkan minggu ke tanggal
plusMonths(int months)
Menambahkan bulan ke tanggal
plusYears(int years)
Menambahkan tahun ke tanggal
minusDays(int days)
Mengurangi hari dari tanggal
minusWeeks(int weeks)
Kurangi minggu dari tanggal
minusMonths(int months)
Mengurangi bulan dari tanggal
minusYears(int years)
Kurangi tahun dari tanggal

Contoh:

Kode Keluaran 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

Metode siapa birthday objectyang kita panggil tidak berubah. Sebaliknya, metodenya mengembalikan objek baru yang berisi data yang diinginkan.