Asli: http://it.deepinmind.com/java/2015/03/17/20-examples-date-ndate-di-from-java8.html
Selain ekspresi Lambda, streaming dan beberapa perbaikan kecil, Java 8 juga memperkenalkan serangkaian API waktu dan tanggal baru. Tanggal, kalender, dan pemrosesan waktu Java selalu dikritik, terutama yang memutuskan untuk mendefinisikan java.util.Date sebagai dimodifikasi dan menggunakan SimplateFormat menjadi keamanan non -thread. Tampaknya Java telah menyadari bahwa mereka perlu memberikan dukungan yang lebih baik untuk fungsi waktu dan tanggal, yang juga merupakan hal yang baik bagi masyarakat yang terbiasa menggunakan database Joda Time. Keuntungan terbesar dari perpustakaan waktu dan tanggal baru ini adalah mendefinisikan beberapa konsep yang terkait dengan waktu dan tanggal. dan titik. Pada saat yang sama, ia juga meminjam beberapa keuntungan dari Perpustakaan Joda, seperti membedakan antara orang dan mesin untuk membedakan tanggal waktu. Java 8 masih menggunakan sistem kalender ISO, dan tidak seperti pendahulunya, kelas -kelas dalam paket java.time tidak dapat diratakan dan utas -aman. API Waktu dan Tanggal baru terletak di paket Java.Time.
Perpustakaan baru juga menambahkan ZoneOffset dan dikategorikan untuk memberikan dukungan yang lebih baik untuk zona waktu. Dengan DatetImeformatter baru, analisis dan pemformatan tanggal setelah tanggal menjadi baru. Sebutkan saja, saya sedang menulis artikel ini ketika Java akan meluncurkan fitur baru ini saat ini, jadi Anda akan menemukan bahwa waktu dalam contoh tahun lalu. Jika Anda menjalankan contoh -contoh ini, nilai -nilai yang mereka kembalikan harus benar.
Seseorang bertanya kepada saya apa cara terbaik untuk mempelajari perpustakaan baru? Jawaban saya adalah menggunakannya dalam proyek aktual. Akan ada berbagai kebutuhan dalam proyek nyata, yang akan mempromosikan pengembang untuk mengeksplorasi dan mempelajari perpustakaan baru ini. Singkatnya, hanya tugas itu sendiri yang benar -benar akan mempromosikan Anda untuk mengeksplorasi dan belajar. API Tanggal dan Waktu baru Java 8 adalah sama. Untuk mempelajari perpustakaan baru Java 8 ini, saya membuat 20 contoh berorientasi tugas di sini. Mari kita mulai dengan tugas sederhana. mengatakan bahwa dikatakan bahwa mengembangkan aplikasi pengingat untuk mengetahui beberapa tanggal spesifik seperti ulang tahun, ulang tahun Minggu, tanggal akun berikutnya, berapa hari yang ada untuk tanggal premi berikutnya atau waktu kedaluwarsa kartu kredit.
Ada kelas yang disebut LocalDate di Java 8, yang dapat digunakan untuk mewakili tanggal hari ini. Kelas ini sedikit berbeda dari java.util.date, karena hanya berisi tanggal dan tidak punya waktu. Karena itu, jika Anda hanya perlu menunjukkan tanggal alih -alih waktu, Anda dapat menggunakannya.
Localdate hari ini = localdate.now ();
Anda dapat melihat bahwa itu membuat hari ini tetapi tidak termasuk informasi waktu. Ini juga membentuk format tanggal dan mengeluarkannya.
Kelas LocalDate menyediakan beberapa cara yang sangat nyaman untuk menggunakan tanggal dan atribut tanggal lainnya yang dapat digunakan untuk mengekstrak. Menggunakan metode ini, Anda bisa mendapatkan atribut tanggal yang Anda butuhkan, dan tidak perlu lagi menggunakan kelas seperti java.util.calendar:
Localdate hari ini = localdate.now (); Tahun, Bulan, Hari);
Dapat dilihat bahwa sangat mudah untuk mendapatkan informasi tahunan di Java 8. Ia hanya perlu menggunakan metode pengambil yang sesuai, tidak ada memori, sangat intuitif. Anda dapat membandingkannya dengan penulisan bulan dan hari saat ini di Java.
Dalam contoh pertama, kami melihat bahwa sangat sederhana untuk menghasilkan tanggal hari melalui metode statis, tetapi melalui metode pabrik lain yang sangat berguna localdate.of (), Anda dapat membuat tanggal apa pun. Tahun, bulan, dan kemudian mengembalikan instance LocalDate yang setara. Kabar baik lainnya tentang metode ini adalah bahwa itu tidak membuat kesalahan di API sebelumnya. Apa yang Anda tulis di sini adalah apa yang Anda tulis di sini, misalnya, dalam contoh berikut, itu mewakili 14 Januari, tidak ada logika tersembunyi.
LocalDate DateOfBIRTH = LocalDate.OF (2010, 01, 14);
Dapat dilihat bahwa tanggal dibuat adalah apa yang kami tulis, 14 Januari 2014.
Berbicara tentang tugas dan tanggal pemrosesan yang sebenarnya dalam kenyataan, orang biasa memeriksa apakah dua tanggal sama. Anda mungkin sering menemukan apakah akan menilai apakah hari ini adalah hari yang istimewa, seperti ulang tahun, hari jadi, atau hari libur. Terkadang, Anda akan memberi Anda kencan sehingga Anda dapat memeriksa apakah itu hari tertentu. Contoh berikut akan membantu Anda menyelesaikan tugas -tugas tersebut di Java 8. Seperti yang Anda pikirkan, LocalDate menulis ulang metode yang sama untuk membandingkan tanggal, seperti yang ditunjukkan di bawah ini:
DateDate1 = localdate.of (2014, 01, 14); 2014-01-14 dan Date1 2014-01-14 adalah tanggal yang sama
Dalam contoh ini, perbandingan dua tanggal kami sama. Pada saat yang sama, jika Anda mendapatkan string tanggal yang diformat dalam kode, Anda harus menyelesaikannya sebagai tanggal sebelum Anda dapat membandingkannya. Anda dapat membandingkan contoh ini untuk membandingkan perbandingan Java yang sebelumnya, dan Anda akan menemukan bahwa itu jauh lebih baik.
Ada juga tugas praktis yang terkait dengan tanggal waktu di Java untuk memeriksa acara duplikat. Jika Anda bekerja di perusahaan e -commerce, maka akan ada modul seperti itu yang akan mengirimkan harapan ulang tahun kepada pengguna dan memberi mereka salam pada setiap liburan penting, seperti Natal, Thanksgiving, di India, mungkin dimungkinkan di India adalah Deepawali. Bagaimana cara menentukan apakah itu festival atau insiden berulang di Java? Gunakan kelas bulan. Kategori ini dikombinasikan berdasarkan bulan dan tidak termasuk informasi tahunan, yang berarti Anda dapat menggunakannya untuk mewakili beberapa hari yang tampak diulang setiap tahun. Tentu saja, ada beberapa kombinasi lain, seperti kelas tahun. Ini juga tidak dapat berubah dan menyentuh dengan aman sebagai jenis lain di perpustakaan waktu baru, dan juga merupakan kelas nilai. Mari kita lihat cara menggunakan bulan bulan untuk memeriksa tanggal duplikat:
LocalDate Dtealday Birthday.of (2010, 01, 14); println ("Banyak pengembalian yang bahagia hari ini !!");Meskipun tahun ini berbeda, hari ini adalah hari ulang tahun, jadi Anda akan melihat berkah ulang tahun dalam output. Anda dapat menyesuaikan waktu sistem dan menjalankan program untuk melihat apakah itu dapat mengingatkan Anda saat ulang tahun berikutnya.
Ini sangat mirip dengan tanggal saat ini dalam contoh pertama. Kali ini kami menggunakan kelas yang disebut LocalTime. Di sini Anda juga dapat menggunakan metode pabrik statis sekarang () untuk mendapatkan waktu saat ini. Format default adalah HH: mm: ss: nnn, dan nnn di sini adalah nanodetik. Ini dapat dibandingkan dengan cara mendapatkan waktu saat ini dengan Java 8.
Waktu Local = LocalTime.Now ();
Dapat dilihat bahwa waktu saat ini tidak termasuk tanggal, karena LocalTime hanya memiliki waktu dan tidak ada tanggal.
Sering kali kita perlu meningkatkan waktu di masa depan di setiap menit atau kedua. Java 8 tidak hanya menyediakan kelas -kelas yang tidak berubah dan beralih, tetapi juga menyediakan beberapa metode yang lebih nyaman seperti plushours () untuk menggantikan metode add () asli. Ngomong -ngomong, metode ini mengembalikan referensi ke instance LocalTime baru, karena LocalTime tidak dapat diubah, jangan lupa untuk menyimpan referensi baru ini.
Localtime Time = LocalTime.Now (); : 33.369
Anda dapat melihat bahwa setelah 2 jam waktu saat ini, itu adalah 16: 33: 33.369. Sekarang Anda dapat membandingkannya dengan cara lama untuk menambah atau mengurangi cara lama di Java. Sekilas, Anda tahu cara mana yang lebih baik.
Ini mirip dengan contoh sebelumnya dari dua jam sebelumnya. LocalDate digunakan untuk menunjukkan tanggal tanpa waktu. Karena LocalDate juga dapat diubah, operasi modifikasi apa pun akan mengembalikan contoh baru, jadi jangan lupa untuk menyimpannya.
Localdate nextweek = hari ini.plus (1, chroneunit.weeks); IS: 2014-01-14 Tanggal Setelah 1 Minggu: 2014-01-21
Anda dapat melihat tanggal berapa setelah 7 hari. Anda dapat menggunakan metode ini untuk meningkatkan satu bulan, satu tahun, satu jam, satu menit, atau bahkan sepuluh tahun, memeriksa kelas Chroneunit di Java API untuk mendapatkan lebih banyak opsi.
Ini adalah sekuel dari contoh sebelumnya. Dalam contoh di atas, kami belajar cara menggunakan metode plus () LocalDate untuk meningkatkan tanggal, minggu atau bulan sekarang.
LocalDate Prefinyear = Today.minus (1, Chronousit.ears); " + NextYear); Output: Tanggal Sebelum 1 Tahun: 2013-01-14 Tanggal Setelah 1 Tahun: 2015-01-14
Dapat dilihat bahwa ada dua tahun secara total, satu adalah 2013, dan yang lainnya adalah 2015, yang merupakan tahun sebelum dan setelah 2014.
Java 8 dilengkapi dengan kelas jam, Anda dapat menggunakannya untuk mendapatkan waktu, tanggal atau waktu instan di zona waktu tertentu. Anda dapat menggunakan jam untuk mengganti metode System.currentTimeInmillis () dan timezone.getDefault ().
// Mengembalikan waktu saat ini berdasarkan jam sistem Anda dan diatur ke UTC. .Systemdefaultzone ();
Anda dapat menggunakan tanggal yang ditentukan untuk membandingkan dengan jam ini, misalnya, sebagai berikut:
Kelas publik myclass {jam pribadi jam; // suntikan ketergantungan ... proses public void (localdate eventDate) {if (eventDate.isbefore (localdate.now (c lock)) {...}}}Jika Anda perlu berurusan dengan tanggal zona waktu yang berbeda, ini cukup nyaman.
Ini juga merupakan tugas umum dalam proyek aktual. Bagaimana Anda menilai apakah tanggal tertentu ada di depan atau di belakang tanggal lain, atau sama? Di Java 8, kelas LocalDate memiliki metode isbefore () dan isafter () yang dapat digunakan untuk membandingkan dua tanggal. Jika tanggal metode panggilan lebih awal dari tanggal yang diberikan, metode isBefore () akan mengembalikan true.
Localdate tomomorring = localdate.of (2014, 1, 15); ;
Dapat dilihat bahwa tanggal di Java 8 relatif sederhana. Tidak perlu menggunakan kelas lain seperti kalender untuk menyelesaikan tugas serupa.
Java 8 tidak hanya memisahkan tanggal dan waktu, tetapi juga kadang -kadang daerah. Sudah ada beberapa kelompok yang terkait dengan zona waktu. Ini setara dengan kelas Gregoriancalendar sebelum Java 8. Menggunakan kelas ini, Anda dapat mengubah waktu setempat menjadi waktu yang sesuai di zona waktu lain, seperti contoh berikut:
// Tanggal dan waktu dengan zona waktu di java 8 zonaid Amerika = zonaid.of ("Amerika/berita"); TimeZone: " + DataAnDtimeInnewyork); Output: Tanggal dan Waktu Saat Ini dalam Zona Waktu tertentu: 2014-01-14T16: 33.373-05: 00 [Amerika/new_york]Ini dapat dibandingkan dengan waktu untuk mengubah waktu setempat menjadi waktu GMT. Ngomong -ngomong, seperti sebelum Java 8, teks di zona waktu yang sesuai tidak boleh salah, jika tidak, Anda akan menemukan pengecualian seperti itu:
Pengecualian di Thread "Main" java.time.zone.zonerseException: ID zona waktu yang tidak diketahui: Asia/Tokyo di lesprovider.java:272) di java.time.zone.zonerulesprovider.getrules (zonerulesprovider.java:227) di Java:227. time.zoneregy.ofid (zoneregy.java:120) di java.time.zoneid.of (zonaid.java:403) di java.time.zoneid.o f (zonaid.java: 351)
Sama seperti hari bulan mengungkapkan hari duplikat, Yearmonth adalah kombinasi lain. Anda dapat menggunakan kelas ini untuk mengetahui berapa hari itu bulan itu, lengthofonth () Metode ini mengembalikan berapa hari contoh tahun ini, yang sangat berguna untuk memeriksa apakah itu 28 hari di bulan Februari atau 29 hari.
Yearmonth Currentyearmorth = Yearmonth.now (); ;;
Ini tidak rumit. Jika Anda masih ingin mengulangi roda, Anda dapat melihat kode ini.
if (Today.isleapyear ()) {System.out.println ("Tahun ini adalah tahun lompatan");Anda dapat memeriksa beberapa tahun untuk melihat apakah hasilnya benar.
Tugas umum lainnya adalah menghitung berapa hari, berapa minggu atau tahun dimasukkan antara dua tanggal yang diberikan. Anda dapat menggunakan Java.Time. Dalam contoh berikut, kami akan menghitung total beberapa bulan sebelum tanggal saat ini dan tanggal mendatang.
Localdate java8release = localdate.of (2014, bulan. ));
Dapat dilihat bahwa bulan ini adalah Januari, dan tanggal rilis Java 8 adalah Maret, jadi terpisah 2 bulan.
Di Java 8, Anda dapat menggunakan kelas ZoneOffset untuk mewakili zona waktu tertentu. Selama Anda mendapatkan offset ini, Anda dapat menggunakan LocalDateTime dan offset ini untuk membuat OfficeTateTime.
Localdaletime dotetime = localdatetime.of (2014, bulan. January, 14, 19, 30); .println ("Tanggal dan Waktu dengan TimeZone Offset di Java:" + Tanggal);Dapat dilihat bahwa tanggal saat ini dikaitkan dengan zona waktu. Poin lain adalah bahwa OfficetDateTime terutama dipahami oleh mesin.
Jika Anda masih ingat cara mendapatkan cap waktu saat ini sebelum Java 8, maka ini hanyalah hidangan kecil. Kelas instan memiliki metode pabrik statis sekarang () untuk mengembalikan cap waktu saat ini, sebagai berikut:
Timestamp = Instant.now ();
Dapat dilihat bahwa cap waktu saat ini mencakup tanggal dan waktu, yang mirip dengan java.util.date. ke java.util.date, dan date.toinstant () mengubah tanggal menjadi instan.
Sebelum Java 8, pemformatan tanggal waktu adalah pekerjaan teknis. Berkat variabel lokal utas, itu telah membuatnya berguna di lingkungan multi -utara, tetapi sudah lama bagi Java untuk mempertahankan keadaan ini. Kali ini memperkenalkan format tanggal dan waktu keamanan utas baru. Ini juga dilengkapi dengan beberapa format yang telah ditentukan, yang berisi format tanggal yang umum digunakan. Misalnya, dalam contoh ini, kami menggunakan format tanggal ISO dasar yang telah ditentukan, yang akan diformat 14 Februari 2014 hingga 20140114.
String DayAfterTommorring = "20140116"; -16
Anda dapat melihat bahwa tanggal pembuatan dicocokkan dengan nilai string yang ditentukan, yang sedikit berbeda dalam format tanggal.
Dalam contoh di atas, kami menggunakan format waktu dan tanggal yang dibangun untuk menyelesaikan string tanggal. Tentu saja, format yang telah ditentukan benar -benar bagus, tetapi kadang -kadang Anda mungkin masih perlu menggunakan format tanggal khusus. Format tanggal dalam contoh ini adalah "mmm dd yyyy". Anda dapat meneruskan metode statis OFPATTER () ke metode statis PERTAMA DATETIMEFORMATTER (), dan itu akan mengembalikan contoh. Misalnya, M masih mewakili bulan, dan M masih terbagi. Mode yang tidak valid akan melempar anomali datetimeparseexception, tetapi jika itu adalah kesalahan logis, misalnya, itu harus digunakan sebagai m ketika m, jadi tidak ada cara.
GoodFriday = "April 2014"; ", GoodFriday, Holiday);} catch (DatetimeParsException ex) {System.out.printf ("%s tidak dapat diuraikan!%n ", GoodFriday); Ex.PrintStacktr ACE ();} output: berhasil diuraikan string Apr 18 2014 , Tanggal 2014-04-18Dapat dilihat bahwa nilai tanggal memang konsisten dengan string yang lewat, tetapi formatnya berbeda.
Dalam dua contoh sebelumnya, meskipun kami menggunakan kelas DateTimeformatter, kami terutama menguraikan string tanggal. Dalam contoh ini, apa yang harus kita lakukan adalah sebaliknya. Di sini kami memiliki contoh kelas LocalDateTime, dan kami ingin mengubahnya menjadi string tanggal yang diformat. Ini adalah cara paling sederhana dan paling nyaman untuk mengubah tanggal menjadi string di Java sejauh ini. Contoh berikut akan mengembalikan string yang diformat. Seperti contoh sebelumnya, kita masih perlu menggunakan string mode yang ditentukan untuk membuat instance dari kelas DatetImeformatter, tetapi metode parse dari kelas LocalDate tidak, tetapi metode format (). Metode ini akan mengembalikan string yang mewakili tanggal saat ini, dan mode yang sesuai adalah yang didefinisikan dalam instance DatetImeformatter yang diperkenalkan.
Localdaletime kedatangan = localDateTime.now (); System.out.printf ("%s tidak dapat diformat!%n", kedatangan);Dapat dilihat bahwa waktu saat ini diwakili oleh mode "mmm dd yyyy hh: mm a".
Setelah membaca contoh -contoh ini, saya yakin Anda memiliki pemahaman tertentu tentang waktu dan tanggal baru Java 8. Sekarang kita melihat kembali beberapa elemen kunci dari API baru ini.
Setiap pengembang Java setidaknya harus memahami lima kategori API baru ini:
Kantung utama perpustakaan ini adalah java.time, yang berisi kelas, waktu, sesaat dan durasi tanggal perwakilan, waktu, sesaat dan durasi. Ini memiliki dua sub -paket, satu adalah java.time.foramt.
Zona waktu mengacu pada area yang memiliki waktu standar yang sama di planet ini. Ada pengidentifikasi unik di setiap zona waktu, serta format wilayah/kota (Asia/Tokyo) dan waktu offset mulai dari waktu Greenwich. Misalnya, waktu offset Tokyo adalah +09: 00.
Kelas OfficedateTime sebenarnya berisi LocalDateTime dan ZoneOffset. Ini digunakan untuk menunjukkan tanggal lengkap (+06: 00 atau -08: 00) yang berisi waktu Greenwita (+/- jam: poin, seperti +06: 00 atau -08: 00)
Kelas DateTimeFormatter digunakan untuk memformat dan analisis tanggal di Java. Tidak seperti SimpledateFormat, itu tidak berubah dan aman. Kelas DateTimEformatter menyediakan banyak format yang telah ditentukan sebelumnya, dan Anda juga dapat menyesuaikan format yang Anda inginkan. Tentu saja, menurut perjanjian, ia juga memiliki metode parse () untuk mengubah string menjadi tanggal. Demikian pula, kelas DateFormatter juga memiliki metode format () untuk tanggal pemformatan.
Katakanlah, dua format tanggal "mmm d yyyy" dan "mmm dd yyyy" juga sedikit berbeda. Dalam "Jan 2 2014" akan melaporkan kesalahan karena mengharapkan dua karakter untuk berlalu di bulan ini. Untuk menyelesaikan masalah ini, dalam kasus jumlah digit, Anda harus membuat 0 di depan.
Ini tentang tanggal waktu baru Java 8. Contoh -contoh singkat ini sudah cukup untuk memahami beberapa API baru di API baru ini. Karena dijelaskan berdasarkan tugas yang sebenarnya, ketika ditemui di Java, tidak perlu mencari waktu dan tanggal. Kami telah belajar cara membuat dan memodifikasi tanggal waktu. Kami juga memahami perbedaan antara tanggal murni, tanggal waktu, dan zona waktu zona waktu. Banyak hari di hari jadi atau hari asuransi. Kami juga telah belajar cara menganalisis dan memformat tanggal dalam metode keamanan utas di Java 8 tanpa harus menggunakan variabel lokal utas atau perpustakaan pihak ketiga. API baru kompeten untuk tugas apa pun yang terkait dengan tanggal waktu.
Jika Anda juga tertarik dengan tutorial Java 8, Anda dapat melihat tutorial berikut:
Tautan asli bahasa Inggris