Java akhirnya mempunyai cara yang intuitif dan boleh dipercayai untuk bekerja dengan tarikh dan masa. Prinsip tarikh dan masa adalah asas dalam banyak aplikasi. Pelbagai perkara seperti tarikh lahir, tarikh sewa, masa acara dan waktu buka kedai semuanya berdasarkan tarikh dan masa, tetapi Java SE tidak menyediakan cara yang mudah untuk bekerja dengan mereka. Bermula dengan Java SE 8 , terdapat satu set pakej java.time - yang menyediakan API yang tersusun dengan baik untuk bekerja dengan tarikh dan masa.
Berikut adalah senarai kecil masalah sedia ada dalam pelaksanaannya:
Latar belakang
Apabila Java mula-mula keluar, dalam versi 1.0 , satu-satunya kelas untuk bekerja dengan tarikh dan masa ialah java.util.Date . Perkara pertama yang diperhatikan oleh pembangun ialah ia tidak mewakili "tarikh". Malah, ia mewakili detik dalam masa, tepat kepada milisaat, diukur dari tarikh 1 Januari 1970. Walau bagaimanapun, berdasarkan fakta bahawa kaedah Date 's toString() memaparkan tarikh dan masa dalam zon waktu yang dinyatakan dalam tetapan java mesin , sesetengah pembangun tersilap membuat kesimpulan bahawa Date boleh berfungsi dengan zon waktu. Membetulkan kelas ini ternyata sangat sukar (atau sangat malas) sehingga dalam versi 1.1 kami terpaksa menambah kelas baharu - java.util.Calendar . Malangnya, kelas Kalendar ternyata tidak lebih baik daripada Date .- Boleh tukar. Kelas seperti tarikh dan masa hendaklah tidak berubah.
- Offset. Tahun dalam Tarikh bermula dari 1900, bulan dalam kedua-dua kelas bermula dari sifar.
- Nama. Tarikh sebenarnya bukan "tarikh", dan Kalendar bukan kalendar.
- Memformat. Pemformatan hanya berfungsi dengan Tarikh, bukan Kalendar, dan tidak selamat untuk urutan.
Semakan
API java.time baharu mengandungi 5 pakej:- java.time - pakej asas yang mengandungi objek untuk menyimpan nilai
- java.time.chrono - menyediakan akses kepada kalendar yang berbeza
- java.time.format - pemformatan dan pengecaman tarikh dan masa
- java.time.temporal - perpustakaan peringkat rendah dan fungsi lanjutan
- java.time.zone - kelas untuk bekerja dengan zon waktu
kurma
Kelas LocalDate ialah salah satu yang paling penting dalam API baharu . Ia mengandungi nilai tidak berubah yang mewakili tarikh. Anda tidak boleh menetapkan masa atau zon waktu. Nama "tempatan" mungkin biasa kepada anda daripada Joda-Time , dan asalnya berasal daripada standard ISO-8601 . Ia bermakna tepat ketiadaan zon waktu. Pada asasnya, LocalDate ialah perihalan tarikh, seperti "5 April 2014". Masa sebenar tarikh ini akan berbeza bergantung pada zon waktu anda. Sebagai contoh, di Australia tarikh ini akan menjadi 10 jam lebih awal daripada di London, dan 18 jam lebih awal daripada di San Francisco. Kelas LocalDate mempunyai semua kaedah yang biasa diperlukan: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 kami, kami melihat tarikh dibuat menggunakan kaedah kilang (semua pembina adalah peribadi). Seterusnya kami meminta objek untuk beberapa data. Sila ambil perhatian bahawa penghitungan
Bulan dan
DayOfWeek direka untuk menjadikan kod lebih mudah dibaca dan boleh dipercayai. Dalam contoh berikut kita akan melihat cara mengubah suai tarikh. Oleh kerana kelas tidak boleh diubah, hasilnya akan menjadi objek baharu, tetapi yang asal akan kekal seperti sedia ada.
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 agak mudah, tetapi selalunya anda perlu membuat pengubahsuaian tarikh yang lebih kompleks. Terdapat mekanisme khas untuk ini dalam
API java.time - TemporalAdjuster . Tujuannya adalah untuk menyediakan alat terbina dalam yang membolehkan anda memanipulasi tarikh, contohnya mendapatkan objek yang sepadan dengan hari terakhir bulan itu. Sebahagian daripadanya disertakan dalam
API , tetapi anda boleh menambah sendiri. Menggunakan pengubah suai adalah sangat mudah, tetapi ia memerlukan import statik:
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 suai sangat memudahkan kod anda. Tiada siapa yang mahu melihat banyak manipulasi tarikh manual. Jika beberapa jenis manipulasi tarikh berlaku beberapa kali dalam projek anda, tulis pengubah suai anda sendiri dan pasukan anda boleh menggunakannya sebagai komponen yang telah ditulis dan diuji.
GO TO FULL VERSION