Sa wakas, ang Java ay may intuitive, maaasahang paraan upang gumana sa mga petsa at oras. Ang mga prinsipyo ng petsa at oras ay mahalaga sa maraming aplikasyon. Iba't ibang bagay tulad ng mga petsa ng kapanganakan, petsa ng pagrenta, oras ng kaganapan, at oras ng pagbubukas ng tindahan ay lahat ay nakabatay sa mga petsa at oras, ngunit hindi nagbigay ang Java SE ng maginhawang paraan upang makipagtulungan sa kanila. Simula sa Java SE 8 , nagkaroon ng set ng java.time packages - na nagbibigay ng mahusay na istrukturang API para sa pagtatrabaho sa mga petsa at oras.
Narito ang isang maliit na listahan ng mga kasalukuyang problema sa pagpapatupad nito:
Background
Noong unang lumabas ang Java , sa bersyon 1.0 , ang tanging klase para sa pagtatrabaho sa mga petsa at oras ay java.util.Date . Ang unang bagay na napansin ng mga developer ay hindi ito kumakatawan sa isang "petsa". Sa katunayan, ito ay kumakatawan sa isang sandali sa oras, tumpak sa millisecond, na sinusukat mula sa petsa ng Enero 1, 1970. Gayunpaman, batay sa katotohanan na ang Date ’s toString() method ay nagpapakita ng petsa at oras sa time zone na tinukoy sa mga setting ng java ng makina , nagkamali ang ilang developer na napagpasyahan na ang Date ay maaaring gumana sa mga time zone. Ang pag-aayos sa klase na ito ay naging napakahirap (o sobrang tamad) na sa bersyon 1.1 kailangan naming magdagdag ng bagong klase - java.util.Calendar . Sa kasamaang palad, ang klase ng Calendar ay naging hindi mas mahusay kaysa sa Petsa .- Nababago. Ang mga klase tulad ng petsa at oras ay dapat na hindi nababago.
- Mga offset. Ang mga taon sa Petsa ay nagsisimula sa 1900, ang mga buwan sa parehong klase ay nagsisimula sa zero.
- Mga pangalan. Ang petsa ay hindi talaga isang "petsa", at ang Kalendaryo ay hindi isang kalendaryo.
- Pag-format. Gumagana lang ang pag-format sa Petsa, hindi sa Kalendaryo, at hindi ligtas sa thread.
Pagsusuri
Ang bagong java.time API ay naglalaman ng 5 pakete:- java.time - ang batayang pakete na naglalaman ng mga bagay upang mag-imbak ng mga halaga
- java.time.chrono - nagbibigay ng access sa iba't ibang mga kalendaryo
- java.time.format - pag-format at pagkilala ng petsa at oras
- java.time.temporal - mababang antas ng mga aklatan at advanced na pagpapagana
- java.time.zone - mga klase para sa pagtatrabaho sa mga time zone
Petsa
Ang klase ng LocalDate ay isa sa pinakamahalaga sa bagong API . Naglalaman ito ng hindi nababagong halaga na kumakatawan sa isang petsa. Hindi mo maaaring itakda ang oras o time zone. Ang pangalang "lokal" ay maaaring pamilyar sa iyo mula sa Joda-Time , at orihinal na nagmula sa ISO-8601 standard . Nangangahulugan ito ng tiyak na kawalan ng time zone. Sa pangkalahatan, ang LocalDate ay isang paglalarawan ng isang petsa, gaya ng "ika-5 ng Abril, 2014". Ang aktwal na oras ng petsang ito ay mag-iiba depende sa iyong time zone. Halimbawa, sa Australia ang petsang ito ay magiging 10 oras na mas maaga kaysa sa London, at 18 oras na mas maaga kaysa sa San Francisco. Ang klase ng LocalDate ay mayroong lahat ng karaniwang kinakailangang pamamaraan: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 (не високосный год)
Sa aming halimbawa, nakikita namin ang isang petsa na ginawa gamit ang isang factory method (lahat ng mga constructor ay pribado). Susunod na hinihiling namin ang bagay para sa ilang data. Pakitandaan na
ang mga enumerasyon ng Buwan at
DayOfWeek ay idinisenyo upang gawing mas nababasa at maaasahan ang code. Sa sumusunod na halimbawa ay makikita natin kung paano baguhin ang petsa. Dahil ang klase ay hindi nababago, ang resulta ay magiging mga bagong bagay, ngunit ang orihinal ay mananatiling tulad ng dati.
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
Ang mga ito ay medyo simpleng mga pagbabago, ngunit madalas na kailangan mong gumawa ng mas kumplikadong mga pagbabago sa petsa. Mayroong espesyal na mekanismo para dito sa
java.time API - TemporalAdjuster . Ang layunin nito ay magbigay ng built-in na tool na nagbibigay-daan sa iyong manipulahin ang mga petsa, halimbawa, pagkuha ng isang bagay na naaayon sa huling araw ng buwan. Ang ilan sa mga ito ay kasama sa
API , ngunit maaari mong idagdag ang iyong sarili. Napakadali ng paggamit ng mga modifier, ngunit nangangailangan ito ng mga static na pag-import:
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));
Ang paggamit ng mga modifier ay lubos na nagpapasimple sa iyong code. Walang gustong makakita ng maraming manu-manong pagmamanipula ng petsa. Kung ang ilang uri ng pagmamanipula ng petsa ay nangyari nang ilang beses sa iyong proyekto, isulat ang iyong sariling modifier at magagamit ito ng iyong koponan bilang isang nakasulat at nasubok na bahagi.
GO TO FULL VERSION