JavaRush /Blog Jawa /Random-JV /Pustaka sing intuisi lan kuat kanggo nggarap wektu lan ta...
theGrass
tingkat
Саратов

Pustaka sing intuisi lan kuat kanggo nggarap wektu lan tanggal pungkasane kasedhiya ing Jawa (Bagian 1).

Diterbitake ing grup
Jawa     pungkasane duwe cara sing intuisi lan dipercaya kanggo nggarap tanggal lan wektu. Prinsip tanggal lan wektu minangka dhasar ing pirang-pirang aplikasi. Macem-macem kaya tanggal lair, tanggal sewa, wektu acara, lan jam buka toko kabeh adhedhasar tanggal lan wektu, nanging Java SE ora nyedhiyakake cara sing trep kanggo nggarap. Diwiwiti karo Java SE 8 , ana paket java.time - sing nyedhiyakake API sing terstruktur kanthi apik kanggo nggarap tanggal lan wektu.
Latar mburi
    Nalika Java pisanan metu, ing versi 1.0 , mung kelas kanggo nggarap tanggal lan wektu yaiku java.util.Date . Wangsulan: Bab ingkang pisanan pangembang ngeweruhi iku ora makili "tanggal". Nyatane, iki nggambarake wektu, akurat nganti milidetik, diukur wiwit tanggal 1 Januari 1970. Nanging, adhedhasar kasunyatan sing Date 's toString () cara nampilake tanggal lan wektu ing zona wektu sing ditemtokake ing setelan java mesin , sawetara pangembang salah nyimpulake yen Tanggal bisa digunakake karo zona wektu. Ndandani kelas iki dadi angel banget (utawa kesed) yen ing versi 1.1 kita kudu nambah kelas anyar - java.util.Calendar . Sayange, kelas Tanggalan ternyata ora luwih apik tinimbang Date . Mangkene dhaptar cilik masalah sing ana ing implementasine:
  • Bisa diganti. Kelas kayata tanggal lan wektu kudu ora bisa diganti.
  • Offsets. Taun ing Tanggal diwiwiti saka 1900, sasi ing loro kelas diwiwiti saka nol.
  • Jeneng. Tanggal dudu "tanggal", lan Tanggalan dudu tanggalan.
  • Formatting. Formatting mung bisa digunakake karo Tanggal, dudu Tanggalan, lan ora aman thread.
    Ing taun 2001, proyek Joda-Time digawe . Tujuane gampang - nggawe perpustakaan sing berkualitas kanggo nggarap tanggal lan wektu ing Jawa . Butuh sawetara wektu, nanging versi 1.0 pungkasane dirilis lan cepet banget populer lan akeh digunakake. Suwe-suwe, para pangembang tambah akeh nuntut supaya perpustakaan sing padha bisa diwenehake minangka bagean saka JDK . Kanthi partisipasi Michael Nascimento Santos saka Brasil, proyek JSR-310 diluncurake , yaiku proses resmi kanggo nggawe lan nggabungake API anyar kanggo nggarap tanggal lan wektu ing JDK .
Review
java.time API anyar ngemot 5 paket:
  • java.time - paket dhasar ngemot obyek kanggo nyimpen nilai
  • java.time.chrono - menehi akses menyang tanggalan beda
  • java.time.format - format tanggal lan wektu lan pangenalan
  • java.time.temporal - perpustakaan tingkat rendah lan fungsi sing luwih maju
  • java.time.zone - kelas kanggo nggarap zona wektu
    Umume pangembang bakal nggunakake paket dhasar lan format, lan bisa uga java.time.temporal . Dadi, sanajan 68 jinis anyar wis ditambahake, pangembang mung bakal nggunakake sekitar sapratelune.
Tanggal
    Kelas LocalDate minangka salah sawijining sing paling penting ing API anyar . Isine nilai immutable sing makili tanggal. Sampeyan ora bisa nyetel wektu utawa zona wektu. Jeneng "lokal" bisa uga sampeyan kenal karo Joda-Time , lan asale saka standar ISO-8601 . Tegese persis ora ana zona wektu. Ateges, LocalDate minangka katrangan tanggal, kayata "5 April 2014". Wektu nyata tanggal iki bakal beda-beda gumantung saka zona wektu sampeyan. Contone, ing Australia tanggal iki bakal 10 jam luwih awal tinimbang ing London, lan 18 jam luwih awal tinimbang ing San Francisco. Kelas LocalDate duwe kabeh cara sing umum dibutuhake: 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 (не високосный год)     Ing conto kita, kita ndeleng tanggal digawe nggunakake metode pabrik (kabeh konstruktor pribadi). Sabanjure kita takon obyek kanggo sawetara data. Elinga yen enumerasi Wulan lan DayOfWeek dirancang kanggo nggawe kode luwih bisa diwaca lan dipercaya. Ing conto ing ngisor iki kita bakal weruh carane ngowahi tanggal. Wiwit kelas ora bisa diganti, asil bakal dadi obyek anyar, nanging sing asli bakal tetep kaya saiki. 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     Iki minangka owah-owahan sing relatif prasaja, nanging asring sampeyan kudu nggawe modifikasi tanggal sing luwih rumit. Ana mekanisme khusus kanggo iki ing java.time API - TemporalAdjuster . Tujuane kanggo nyedhiyakake alat sing dibangun sing ngidini sampeyan ngapusi tanggal, umpamane entuk obyek sing cocog karo dina pungkasan sasi. Sawetara kalebu ing API , nanging sampeyan bisa nambah dhewe. Nggunakake modifiers gampang banget, nanging mbutuhake 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));     Nggunakake modifiers nyederhanakake kode sampeyan. Ora ana sing pengin ndeleng akeh manipulasi tanggal manual. Yen sawetara jinis manipulasi tanggal kedadeyan kaping pirang-pirang ing proyek sampeyan, tulisake modifikasi sampeyan dhewe lan tim sampeyan bisa nggunakake minangka komponen sing wis ditulis lan diuji.
Wektu lan tanggal minangka nilai
    Iku worth mbuwang sethitik wektu kanggo mangerteni apa LocalDate nilai. Nilai minangka jinis data sing gampang diijolake; yen padha, identitas obyek dadi ora ana gunane. Conto klasik saka kelas nilai yaiku String . Kita mbandhingaké strings nggunakake witjaksono () , lan kita ora Care apa obyek padha yen dibandhingake karo operator == . Umume kelas kanggo nggarap tanggal lan wektu uga minangka nilai. Dadi, mbandhingake nggunakake operator == minangka gagasan ala, kaya sing kasebut ing dokumentasi. Kanggo sing kepengin sinau luwih akeh, priksa definisi VALJOs sing paling anyar , sing njlentrehake aturan sing ketat sing kudu dipatuhi obyek ing Jawa , kalebu immutability, cara pabrik, lan definisi sing tepat saka equals() , hashCode , toString() , lan mbandhingakeKanggo .() .
Tanggalan alternatif
    Kelas LocalDate , kaya kabeh kelas utama ing java.time , kaiket ing siji tanggalan - kaya sing diterangake ing standar ISO-8601 . Standar 8601 nggambarake kalender standar donya, uga dikenal minangka kalender Gregorian. Taun standar kalebu 365 dina, taun kabisat - 366. Saben taun kaping papat minangka taun kabisat kajaba bisa dibagi 100 utawa dibagi 400. Taun sadurunge taun pisanan jaman anyar dianggep nol kanggo gampang ngitung. Konsekuensi pisanan saka iki minangka sistem standar yaiku asil ora mesthi cocog karo sing diwilang nggunakake GregorianCalendar . Kelas GregorianCalendar duwe saklar built-in menyang sistem Julian kanggo kabeh tanggal sadurunge 15 Oktober 1582. Ing sistem Julian, saben taun kaping papat minangka taun kabisat, tanpa pangecualian. Pitakonan, amarga transisi saka siji sistem menyang liyane minangka kasunyatan sajarah, kok java.time ora model? Ya, amarga macem-macem negara ngalih menyang sistem Gregorian ing wektu sing beda-beda, lan mung nimbang tanggal transisi Vatikan, kita bakal entuk data sing salah kanggo umume negara liya. Contone, Kakaisaran Inggris, kalebu koloni ing Amerika Utara, pindhah menyang kalender Gregorian tanggal 14 September 1752, meh 200 taun sabanjure. Rusia ora ngganti tanggalan nganti 14 Februari 1918, lan transisi Swedia umume dadi masalah sing surem. Akibaté, makna nyata saka tanggal sadurunge 1918 beda-beda gumantung saka kahanan. Penulis kode LocalDate nggawe keputusan sing rasional supaya ora nggawe model transisi saka kalender Julian menyang kalender Gregorian, supaya ora ana bedo. Konsekuensi kapindho nggunakake ISO-8601 minangka tanggalan gawan ing kabeh kelas inti yaiku set tambahan kelas dibutuhake kanggo nangani tanggalan sing isih ana. Antarmuka Kronologi minangka basis kanggo nggarap tanggalan alternatif, ngidini sampeyan nemokake tanggalan sing dikarepake miturut jeneng lokal. Java 8 dilengkapi 4 kalender tambahan - Thai Buddha, Mingguo (Taiwan), Jepang lan Islam. Tanggalan liyane bisa uga ana program. Saben tanggalan nduweni kelas tanggal khusus kayata ThaiBuddhistDate , MinguoDate , JapaneseDate lan HijrahDate . Iku ndadekake pangertèn kanggo nggunakake aplikasi kasebut ing aplikasi lokal banget, kayata kanggo pamrentah Jepang. Antarmuka tambahan, ChronoLocalDate , digunakake minangka abstraksi inti saka papat kelas ing ndhuwur bebarengan karo LocalDate, sing ngidini sampeyan nulis kode bebas saka jinis tanggalan sing digunakake. Sanajan abstraksi iki ana, panggunaane ora dianjurake. Ngerteni kenapa abstraksi iki ora dianjurake, penting kanggo mangerteni carane kabeh java.time API bisa dianggo . Ing ngisor iki umume kode sing ditulis tanpa referensi menyang tanggalan tartamtu dadi ora bisa digunakake. Contone, sampeyan ora bisa yakin yen ana 12 sasi ing setahun, nanging sawetara pangembang nambahake 12 sasi lan mikir yen wis nambah setahun. Sampeyan ora bisa yakin manawa kabeh wulan ngemot jumlah dina sing padha - ing kalender Koptik ana 12 wulan 30 dina, lan 1 wulan lima utawa enem dina. Kajaba iku, sampeyan ora bisa yakin manawa jumlah taun ngarep bakal luwih 1 tinimbang sing saiki, amarga ing kalender Jepang, taun diitung saka proklamasi kaisar sabanjure (ing kasus iki, malah 2 dina ing sasi sing padha. bisa beda-beda taun). Siji-sijine cara kanggo nulis kode sing apik lan bisa digunakake sing bisa digunakake karo sawetara tanggalan sekaligus yaiku inti saka kode sampeyan, sing nindakake kabeh operasi ing tanggal lan wektu, kudu ditulis nganggo tanggalan standar, lan mung nalika ngetik / metu tanggal. kudu diowahi menyang sistem tanggalan liyane. Yaiku, disaranake nggunakake LocalDate kanggo panyimpenan lan kabeh manipulasi tanggal ing aplikasi sampeyan. Lan mung nalika lokalisasi tanggal input lan output sampeyan kudu nggunakake ChronoLocalDate , sing biasane dipikolehi saka kelas tanggalan sing disimpen ing profil pangguna. Bener, umume aplikasi ora mbutuhake lokalisasi sing serius. Yen sampeyan butuh panjelasan sing luwih rinci babagan kabeh sing diterangake ing bab iki, welcome menyang dokumentasi kelas ChronoLocalDate .      Lanjutan saka artikel      Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION