1. Paglipat mula sa Dateklase patungo sa Calendarklase

Gustung-gusto ng mga programmer ang Dateklase para sa pagiging simple at suporta nito para sa mga pamantayan ng Unix, ngunit tulad ng alam mo, bawat rosas ay may mga tinik nito.

Gusto ng mga programmer ng "matalinong" Dateklase. At nakuha nila ang gusto nila sa anyo ng Calendarklase. Ito ay ipinaglihi bilang isang paraan upang hindi lamang mag-imbak ng mga petsa, kundi pati na rin upang magsagawa ng mahihirap na operasyon na may mga petsa.

Ang buong pangalan ng Calendarklase ay java.util.Calendar. Huwag kalimutang idagdag ito sa isang import statement kung magpasya kang gamitin ito sa iyong code.

Maaari kang lumikha ng isang Calendarbagay gamit ang command na ito:

Calendar date = Calendar.getInstance();

Ang static getInstance()na paraan ng Calendarklase ay lumilikha ng isang Calendarbagay na sinimulan sa kasalukuyang petsa. Ang kalendaryong gusto mo ay malilikha batay sa mga setting ng computer na nagpapatakbo ng program.

O mas tumpak, ang kalendaryong makukuha mo... Iyon ay dahil ang mga tao sa Earth ay hindi limitado sa isang kalendaryo. Sa halip, marami silang ginagamit. At halos bawat isa sa kanila ay nauugnay sa ilang relihiyon o bansa. Sinusuportahan ng Calendarklase ang 3 sa kanila:

Kalendaryo Paglalarawan
GregorianCalendar Kristiyanong Gregorian na kalendaryo
BuddhistCalendar kalendaryong Buddhist
JapaneseImperialCalendar Kalendaryong imperyal ng Hapon

Ngunit mayroon ding Chinese at Arabic na kalendaryo. Karaniwan, ang pagtatrabaho sa oras ay hindi kasingdali ng tila.

Sa kalendaryong Tsino, ang taon ay opisyal na 4716 sa panahon ng pagsulat ng araling ito. At ayon sa kalendaryong Muslim, ang taon ay 1398. Maligayang pagdating sa malaking mundo, kaibigan kong programmer.

2. Paglikha ng isang bagay sa kalendaryo

Gagamitin natin ang kalendaryong Gregorian, dahil ito ang pinakakaraniwan sa mundo. Hindi bababa sa hanggang sa bumili ng Oracle ang China at gawing pangunahing kalendaryo ang Chinese.

Maaari kang lumikha ng isang bagay sa kalendaryo na may anumang petsa gamit ang isang pahayag na tulad nito:

Calendar date = new GregorianCalendar(year, month, day);

Oo, kailangan mong magsulat GregorianCalendarsa bawat oras. Sa halip na Calendar, maaari ka ring sumulat GregorianCalendar— gagana rin iyon. Ngunit ang pagsusulat lamang Calendaray mas maikli.

Ang taon ay dapat isulat nang buo, hal. hindi ka maaaring sumulat ng 19 sa halip na 2019. Ang mga buwan ay binibilang pa rin mula sa zero. Ngunit tulad ng dati, ang mga araw ng buwan ay hindi binibilang mula sa zero. Mga nerd!

Upang itakda ang oras pati na rin ang petsa, kailangan mong ipasa ang oras bilang mga karagdagang argumento:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

Maaari ka ring pumasa sa mga millisecond kung kinakailangan. Sila ang parameter pagkatapos ng bilang ng mga segundo.

3. Pagpapakita ng bagay sa kalendaryo sa screen

Kung magpi-print ka lang ng bagay sa kalendaryo sa screen, hindi ka masyadong masisiyahan sa resulta.

Code
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Output ng console
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

Ang bagay na dapat tandaan dito ay ang isang kalendaryo ay isang kalendaryo, hindi isang petsa : mayroon itong lahat ng uri ng mga setting na lahat ay ipapakita sa screen.

Tamang gumamit ng isang SimpleDateFormatbagay upang magpakita ng kalendaryo, ngunit hanggang sa pag-aaralan natin ito, maaari mong gamitin ang life hack na ito.

Date date = calendar.getTime();

Ang isang Calendarbagay ay madaling ma-convert sa isang Datebagay, at alam mo na kung paano magpakita ng isang Datebagay. Maaari mong gamitin ang code na tulad nito upang i-convert ang isang Calendarbagay sa isang Date:

Gamit ang getTime()pamamaraan:

Code Output ng console
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Ibang usapan iyon, di ba?

4. Paggawa gamit ang mga elemento ng isang petsa

Upang makakuha ng partikular na elemento ng isang petsa (hal. taon, buwan, ...), ang Calendarklase ay may get()pamamaraan. Ito ay isang solong pamamaraan, ngunit mayroon itong mga parameter:

int month = calendar.get(Calendar.MONTH);

Kung saan calendarang isang Calendarvariable, at MONTHito ay isang pare-parehong larangan ng Calendarklase.

Ipapasa mo ang isa sa mga Calendarpare-parehong field ng klase bilang argumento sa getpamamaraan, at makukuha mo ang nais na halaga bilang resulta.

Mga halimbawa

Code Paglalarawan
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


panahon (bago o pagkatapos ng karaniwang panahon)
taon
buwan
araw ng buwan

araw ng linggo
oras
minuto
segundo

Upang baguhin ang isang elemento ng isang petsa, gamitin ang setpamamaraan:

calendar.set(Calendar.MONTH, value);

Kung saan calendarang isang Calendarvariable, at MONTHito ay isang pare-parehong larangan ng Calendarklase.

Kapag nagtatrabaho sa setpamamaraan, ipinapasa mo ang isa sa Calendarmga pare-parehong field ng klase bilang unang argumento, at ang bagong halaga bilang pangalawang argumento.

Mga halimbawa

Code Paglalarawan
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


taon = 2019
buwan = Hulyo (numero mula 0)
ika-4 na araw
oras
minuto
segundo

5. Constants ng Calendarklase

Ang mga permanenteng field ng Calendarklase ay hindi limitado sa mga para sa pagbibigay ng pangalan sa mga elemento ng isang petsa. Tila may mga patlang para sa bawat okasyon.

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

Halimbawa, may mga pare-parehong field na tumutukoy sa mga buwan:

At gayundin ang mga araw ng linggo:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

Hindi namin ililista ang lahat. Ayaw lang namin na mabigla ka kung makakita ka ng mga pare-parehong tulad nito sa code.

Ang paggamit ng mga constant ay ginagawang mas nababasa ang code, kaya naman ginagamit ito ng mga programmer. At ang mga buwan ay binibilang mula sa zero din upang mapabuti ang pagiging madaling mabasa. O hindi.

6. Pagbabago ng petsa sa isang Calendarbagay

Ang Calendarklase ay may paraan na nagbibigay-daan sa iyong magpatakbo sa isang petsa sa mas matalinong paraan. Halimbawa, maaari kang magdagdag ng isang taon, isang buwan, o ilang araw sa isang petsa. O ilayo sila. Ang pamamaraang ito ay tinatawag na add(). Ang paggawa nito ay ganito ang hitsura:

calendar.add(Calendar.MONTH, value);

Kung saan calendarang isang Calendarvariable, at MONTHito ay isang pare-parehong larangan ng Calendarklase.

Kapag nagtatrabaho sa addpamamaraan, ipinapasa mo ang isa sa Calendarmga pare-parehong field ng klase bilang unang argumento, at bilang pangalawang argumento — ang bagong halaga na idaragdag.

Ito ay isa pang matalinong pamamaraan. Tingnan natin kung gaano ito katalino:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
Output ng console
Fri Mar 01 00:00:00 EET 2019

Nauunawaan ng paraang ito na mayroon lamang 28 araw sa Pebrero 2019, kaya ang resultang petsa ay Marso 1.

Ngayon mag-alis tayo ng 2 buwan! Ano ang dapat nating makuha? Disyembre 27, 2018! Suriin natin ngayon.

Upang magsagawa ng operasyon na nagreresulta sa mas maagang petsa, kailangan mong magpasa ng negatibong halaga sa add()pamamaraan:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Output ng console
Thu Dec 27 00:00:00 EET 2018

Gumagana siya!

Isinasaalang-alang ng pamamaraang ito ang magkakaibang haba ng mga buwan pati na rin ang mga leap year. Sa kabuuan, isang mahusay na pamamaraan. Ito ang eksaktong kailangan ng karamihan sa mga programmer na nagtatrabaho sa mga petsa.

7. Rolling elements ng isang petsa

Ngunit minsan may mga sitwasyon na hindi natin gusto ang matalinong pag-uugali na ito, hal. gusto mong gumawa ng isang bagay sa isang bahagi ng petsa nang hindi binabago ang lahat ng iba pa.

Ang Calendarklase ay may espesyal roll()na pamamaraan para dito. Ang lagda nito ay katulad ng add()pamamaraan, ngunit ang pamamaraang ito ay nagbabago lamang ng isang elemento ng petsa, na iniiwan ang natitira na hindi nagbabago.

Halimbawa:

Code
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
Output ng console
Fri Dec 27 00:00:00 EET 2019

Binago namin ang buwan, ngunit ang taon at petsa ay nanatiling hindi nagbabago.