Java akhirnya memiliki cara yang intuitif dan andal untuk menangani tanggal dan waktu. Prinsip tanggal dan waktu merupakan hal mendasar dalam banyak penerapan. Berbagai hal seperti tanggal lahir, tanggal sewa, waktu acara, dan jam buka toko semuanya berdasarkan tanggal dan waktu, namun Java SE tidak menyediakan cara yang nyaman untuk bekerja dengannya. Dimulai dengan Java SE 8 , ada satu set paket java.time - yang menyediakan API terstruktur dengan baik untuk bekerja dengan tanggal dan waktu.
Berikut daftar kecil permasalahan yang ada dalam implementasinya:
Latar belakang
Ketika Java pertama kali keluar, pada versi 1.0 , satu-satunya kelas yang bekerja dengan tanggal dan waktu adalah java.util.Date . Hal pertama yang diperhatikan pengembang adalah bahwa itu tidak mewakili “tanggal”. Faktanya, ini mewakili momen dalam waktu, akurat hingga milidetik, diukur sejak tanggal 1 Januari 1970. Namun, berdasarkan fakta bahwa metode toString() Date menampilkan tanggal dan waktu dalam zona waktu yang ditentukan dalam pengaturan java mesin , beberapa pengembang secara keliru menyimpulkan bahwa Date dapat bekerja dengan zona waktu. Memperbaiki kelas ini ternyata sangat sulit (atau sangat malas) sehingga di versi 1.1 kami harus menambahkan kelas baru - java.util.Calendar . Sayangnya, kelas Calendar ternyata tidak jauh lebih baik dari Date .- Dapat diubah. Kelas seperti tanggal dan waktu tidak boleh diubah.
- offset. Tahun dalam Tanggal dimulai dari tahun 1900, bulan di kedua kelas dimulai dari nol.
- Nama. Tanggal sebenarnya bukan "tanggal", dan Kalender bukanlah kalender.
- Pemformatan. Pemformatan hanya berfungsi dengan Tanggal, bukan Kalender, dan tidak aman untuk thread.
Tinjauan
Java.time API baru berisi 5 paket:- java.time - paket dasar yang berisi objek untuk menyimpan nilai
- java.time.chrono - menyediakan akses ke kalender yang berbeda
- java.time.format - pemformatan dan pengenalan tanggal dan waktu
- java.time.temporal - perpustakaan tingkat rendah dan fungsionalitas tingkat lanjut
- java.time.zone - kelas untuk bekerja dengan zona waktu
tanggal
Kelas LocalDate adalah salah satu yang paling penting dalam API baru . Ini berisi nilai abadi yang mewakili tanggal. Anda tidak dapat mengatur waktu atau zona waktu. Nama "lokal" mungkin asing bagi Anda dari Joda-Time , dan aslinya berasal dari standar ISO-8601 . Artinya justru tidak adanya zona waktu. Pada dasarnya, LocalDate adalah deskripsi suatu tanggal, seperti "5 April 2014". Waktu sebenarnya pada tanggal ini akan berbeda tergantung pada zona waktu Anda. Misalnya, di Australia tanggal ini akan terjadi 10 jam lebih awal dibandingkan di London, dan 18 jam lebih awal dibandingkan di San Francisco. Kelas LocalDate memiliki semua metode yang umum dibutuhkan:LocalDate date = LocalDate.of(2014, Month.JUNE, 10); int year = date.getYear(); // 2014 Month month = date.getMonth(); // Июнь int dom = date.getDayOfMonth(); // 10 DayOfWeek dow = date.getDayOfWeek(); // Вторник int len = date.lengthOfMonth(); // 30 (дней в Июне) boolean leap = date.isLeapYear(); // false (не високосный год)
Dalam contoh kita, kita melihat tanggal dibuat menggunakan metode pabrik (semua konstruktor bersifat pribadi). Selanjutnya kita meminta beberapa data pada objek tersebut. Harap dicatat bahwa enumerasi
Month dan
DayOfWeek dirancang untuk membuat kode lebih mudah dibaca dan diandalkan. Dalam contoh berikut kita akan melihat cara mengubah tanggal. Karena kelasnya tidak dapat diubah, hasilnya akan berupa objek baru, namun objek asli akan tetap seperti semula.
LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.withYear(2015); // 2015-06-10 date = date.plusMonths(2); // 2015-08-10 date = date.minusDays(1); // 2015-08-09
Ini adalah perubahan yang relatif sederhana, namun sering kali Anda perlu melakukan modifikasi tanggal yang lebih rumit. Ada mekanisme khusus untuk ini di
java.time API - TemporalAdjuster . Tujuannya adalah untuk menyediakan alat bawaan yang memungkinkan Anda memanipulasi tanggal, misalnya mendapatkan objek yang sesuai dengan hari terakhir dalam sebulan. Beberapa di antaranya disertakan dalam
API , tetapi Anda dapat menambahkannya sendiri. Menggunakan pengubah sangat mudah, tetapi memerlukan impor statis:
import static java.time.DayOfWeek.* import static java.time.temporal.TemporalAdjusters.* LocalDate date = LocalDate.of(2014, Month.JUNE, 10); date = date.with(lastDayOfMonth()); date = date.with(nextOrSame(WEDNESDAY));
Menggunakan pengubah sangat menyederhanakan kode Anda. Tidak seorang pun ingin melihat banyak manipulasi tanggal manual. Jika semacam manipulasi tanggal terjadi beberapa kali dalam proyek Anda, tulis pengubah Anda sendiri dan tim Anda dapat menggunakannya sebagai komponen yang sudah ditulis dan diuji.
GO TO FULL VERSION