1. Bytte fra Dateklassen til Calendarklassen

Programmerere elsket Dateklassen for sin enkelhet og støtte for Unix-standarder, men som du vet har hver rose sine torner.

Programmerere ønsket en "smart" Dateklasse. Og de fikk det de ville i form av klassen Calendar. Det ble tenkt som en måte å ikke bare lagre datoer, men også å utføre vanskelige operasjoner med datoer.

Det fulle navnet på Calendarklassen er java.util.Calendar. Ikke glem å legge den til i en importerklæring hvis du bestemmer deg for å bruke den i koden din.

Du kan lage et Calendarobjekt med denne kommandoen:

Calendar date = Calendar.getInstance();

Klassens statiske getInstance()metode Calendarlager et Calendarobjekt initialisert med gjeldende dato. Kalenderen du ønsker vil bli opprettet basert på innstillingene til datamaskinen som kjører programmet.

Eller mer nøyaktig, kalenderen du får... Det er fordi mennesker på jorden ikke er begrenset til en enkelt kalender. I stedet bruker de mange. Og nesten hver og en av dem er assosiert med en eller annen religion eller land. Klassen Calendarstøtter 3 av dem:

Kalender Beskrivelse
Gregorianske kalender Kristen gregoriansk kalender
Buddhistisk kalender Buddhistisk kalender
JapaneseImperialCalendar Japansk keiserlig kalender

Men det finnes også kinesiske og arabiske kalendere. I utgangspunktet er det ikke så lett å jobbe med tid som det ser ut til.

I den kinesiske kalenderen er året offisielt 4716 på tidspunktet for skriving av denne leksjonen. Og ifølge den muslimske kalenderen er året 1398. Velkommen til den store verden, min programmerervenn.

2. Opprette et kalenderobjekt

Vi vil bruke den gregorianske kalenderen, siden den er den vanligste i verden. I hvert fall inntil Kina kjøper Oracle og gjør den kinesiske kalenderen til den viktigste.

Du kan opprette et kalenderobjekt med en hvilken som helst dato ved å bruke en uttalelse som denne:

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

Ja, du må skrive GregorianCalendarhver gang. I stedet for Calendarkan du også skrive GregorianCalendar- det vil også fungere. Men å skrive Calendarer bare kortere.

Året må skrives i sin helhet, f.eks. kan du ikke skrive 19 i stedet for 2019. Måneder er fortsatt nummerert fra null. Men som før er ikke månedsdagene nummerert fra null. nerder!

For å angi klokkeslett og dato, må du sende inn tiden som tilleggsargumenter:

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

Du kan til og med passere på millisekunder om nødvendig. De er parameteren etter antall sekunder.

3. Vise et kalenderobjekt på skjermen

Hvis du bare skriver ut et kalenderobjekt på skjermen, vil du ikke bli særlig fornøyd med resultatet.

Kode
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konsollutgang
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=?]

Det du bør huske på her er at en kalender er en kalender, ikke en dato : den har alle slags innstillinger som alle vil vises på skjermen.

Det ville være riktig å bruke et SimpleDateFormatobjekt for å vise en kalender, men inntil vi studerer det, kan du bruke dette life hacket.

Date date = calendar.getTime();

Et Calendarobjekt kan enkelt konverteres til et Dateobjekt, og du vet allerede hvordan du viser et Dateobjekt. Du kan bruke kode som dette for å konvertere et Calendarobjekt til en Date:

Ved å bruke getTime()metoden:

Kode Konsollutgang
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

Det er en ganske annen sak, er det ikke?

4. Arbeide med elementer av en dato

For å få et spesifikt element av en dato (f.eks. år, måned, ...), Calendarhar klassen get()metoden. Det er en enkelt metode, men den har parametere:

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

Hvor calendarer en Calendarvariabel, og MONTHer et konstant felt i Calendarklassen.

Du sender et av Calendarklassens konstantfelt som argument til getmetoden, og du får ønsket verdi som resultat.

Eksempler

Kode Beskrivelse
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);


epoke (før eller etter den vanlige æra)
år
måned
dag i måneden

ukedag
timer
minutter
sekunder

For å endre et element i en dato, bruk setmetoden:

calendar.set(Calendar.MONTH, value);

Hvor calendarer en Calendarvariabel, og MONTHer et konstant felt i Calendarklassen.

Når du arbeider med setmetode, sender du ett av Calendarklassens konstantfelt som det første argumentet, og den nye verdien som det andre argumentet.

Eksempler

Kode Beskrivelse
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());


år = 2019
måned = juli (nummerert fra 0)
4. dag
timer
minutter
sekunder

Calendar5. Klassens konstanter

Klassens konstante felt Calendarer ikke begrenset til de for å navngi elementer i en dato. Det ser ut til å være felt for enhver anledning.

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

For eksempel er det konstante felt for å referere til måneder:

Og også ukedagene:

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

Vi vil ikke liste opp alt. Vi vil bare ikke at du skal bli overrasket hvis du ser konstanter som dette i koden.

Å bruke konstanter gjør koden mer lesbar, og det er derfor programmererne bruker dem. Og måneder er nummerert fra null også for å forbedre lesbarheten. Eller ikke.

6. Endre datoen i et Calendarobjekt

Klassen Calendarhar en metode som lar deg operere på en date på mer intelligente måter. Du kan for eksempel legge til et år, en måned eller flere dager til en dato. Eller ta dem bort. Denne metoden kalles add(). Å jobbe med det ser slik ut:

calendar.add(Calendar.MONTH, value);

Hvor calendarer en Calendarvariabel, og MONTHer et konstant felt i Calendarklassen.

Når du arbeider med addmetode, sender du ett av Calendarklassens konstantfelt som det første argumentet, og som det andre argumentet – den nye verdien som skal legges til.

Dette er en annen intelligent metode. La oss se hvor smart det er:

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

Denne metoden forstår at det bare er 28 dager i februar 2019, så den resulterende datoen er 1. mars.

La oss nå ta unna 2 måneder! Hva bør vi få? 27. desember 2018! La oss sjekke nå.

For å utføre en operasjon som resulterer i en tidligere dato, må du sende en negativ verdi til add()metoden:

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

Det fungerer!

Denne metoden tar hensyn til de forskjellige lengdene på måneder og skuddår. Alt i alt en flott metode. Det er akkurat det de fleste programmerere som jobber med datoer trenger.

7. Rullende elementer av en dato

Men noen ganger er det situasjoner når vi ikke ønsker denne smarte oppførselen, f.eks. du vil gjøre noe med en del av daten uten å endre alt annet.

Klassen Calendarhar den spesielle roll()metoden for dette. Signaturen er akkurat som add()metoden, men denne metoden endrer bare ett element av datoen, og lar resten være uendret.

Eksempel:

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

Vi endret måneden, men år og dato forble uendret.