1. Skift fra Dateklassen til Calendarklassen

Programmører elskede Dateklassen for dens enkelhed og understøttelse af Unix-standarder, men som du ved, har hver rose sine torne.

Programmører ønskede en "smart" Dateklasse. Og de fik, hvad de ville have i form af Calendarklassen. Det var udtænkt som en måde at ikke kun gemme datoer, men også at udføre vanskelige operationer med datoer.

Klassens fulde navn Calendarer java.util.Calendar. Glem ikke at tilføje det til en importerklæring, hvis du beslutter dig for at bruge det i din kode.

Du kan oprette et Calendarobjekt med denne kommando:

Calendar date = Calendar.getInstance();

Klassens statiske getInstance()metode Calendaropretter et Calendarobjekt initialiseret med den aktuelle dato. Den kalender, du ønsker, oprettes baseret på indstillingerne på den computer, der kører programmet.

Eller mere præcist, den kalender du får... Det er fordi mennesker på Jorden ikke er begrænset til en enkelt kalender. I stedet bruger de mange. Og næsten hver eneste af dem er forbundet med en eller anden religion eller et land. Klassen Calendarunderstøtter 3 af dem:

Kalender Beskrivelse
gregoriansk kalender Kristen gregoriansk kalender
Buddhistisk kalender Buddhistisk kalender
JapaneseImperial Calendar Japansk kejserlig kalender

Men der er også kinesiske og arabiske kalendere. Dybest set er det ikke så let at arbejde med tid, som det ser ud til.

I den kinesiske kalender er året officielt 4716 på tidspunktet for skrivningen af ​​denne lektion. Og ifølge den muslimske kalender er året 1398. Velkommen til den store verden, min programmør-ven.

2. Oprettelse af et kalenderobjekt

Vi vil bruge den gregorianske kalender, da den er den mest almindelige i verden. I hvert fald indtil Kina køber Oracle og gør den kinesiske kalender til den vigtigste.

Du kan oprette et kalenderobjekt med en hvilken som helst dato ved at bruge en erklæring som denne:

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

Ja, du skal skrive GregorianCalendarhver gang. I stedet for Calendarkan du også skrive GregorianCalendar- det vil også virke. Men at skrive er bare Calendarkortere.

Året skal skrives fuldt ud, fx kan du ikke skrive 19 i stedet for 2019. Måneder er stadig talt fra nul. Men som før er månedens dage ikke talt fra nul. Nørder!

For at indstille klokkeslættet såvel som datoen skal du indtaste tiden som yderligere argumenter:

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

Du kan endda passere på millisekunder, hvis det er nødvendigt. De er parameteren efter antallet af sekunder.

3. Visning af et kalenderobjekt på skærmen

Hvis du blot udskriver et kalenderobjekt på skærmen, bliver du ikke særlig tilfreds med resultatet.

Kode
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
Konsoludgang
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 skal huske på her, er, at en kalender er en kalender, ikke en dato : den har alle slags indstillinger, der alle vil blive vist på skærmen.

Det ville være korrekt at bruge et SimpleDateFormatobjekt til at vise en kalender, men indtil vi studerer det, kan du bruge dette life hack.

Date date = calendar.getTime();

Et Calendarobjekt kan nemt konverteres til et Dateobjekt, og du ved allerede, hvordan du viser et Dateobjekt. Du kan bruge kode som denne til at konvertere et Calendarobjekt til et Date:

Brug af getTime()metoden:

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

Det er en helt anden sag, ikke?

4. Arbejde med elementer af en dato

For at få et bestemt element af en dato (f.eks. år, måned, ...), Calendarhar klassen get()metoden. Det er en enkelt metode, men den har parametre:

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

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

Du sender et af Calendarklassens konstantfelter som argument til getmetoden, og du får den ønskede værdi 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);


æra (før eller efter den almindelige æra)
år
måned
dag i måneden

ugedag
timer
minutter
sekunder

For at ændre et element i en dato, brug setmetoden:

calendar.set(Calendar.MONTH, value);

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

Når du arbejder med setmetode, sender du et af Calendarklassens konstantfelter som det første argument, og den nye værdi som det andet argument.

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 (nummereret fra 0)
4. dag
timer
minutter
sekunder

Calendar5. Klassens konstanter

Klassens konstante felter Calendarer ikke begrænset til dem til navngivning af elementer i en dato. Der synes at være marker til enhver lejlighed.

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

For eksempel er der konstante felter, der refererer til måneder:

Og også ugens dage:

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 alt. Vi vil bare ikke have, at du bliver overrasket, hvis du ser konstanter som denne i koden.

Brug af konstanter gør koden mere læsbar, hvorfor programmørerne bruger dem. Og måneder er også talt fra nul for at forbedre læsbarheden. Eller ikke.

6. Ændring af datoen i et Calendarobjekt

Klassen Calendarhar en metode, der lader dig operere på en date på mere intelligente måder. Du kan f.eks. tilføje et år, en måned eller flere dage til en dato. Eller tag dem væk. Denne metode kaldes add(). Arbejdet med det ser sådan ud:

calendar.add(Calendar.MONTH, value);

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

Når du arbejder med addmetode, sender du et af Calendarklassens konstante felter som det første argument, og som det andet argument — den nye værdi, der skal tilføjes.

Dette er en anden intelligent metode. Lad os 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());
Konsoludgang
Fri Mar 01 00:00:00 EET 2019

Denne metode forstår, at der kun er 28 dage i februar 2019, så den resulterende dato er 1. marts.

Lad os nu tage 2 måneder væk! Hvad skal vi få? 27. december 2018! Lad os tjekke nu.

For at udføre en handling, der resulterer i en tidligere dato, skal du overføre en negativ værdi til metoden add():

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

Det virker!

Denne metode tager højde for de forskellige længder af måneder såvel som skudår. Alt i alt en fantastisk metode. Det er præcis, hvad de fleste programmører, der arbejder med datoer, har brug for.

7. Rullende elementer af en dato

Men nogle gange er der situationer, hvor vi ikke ønsker denne smarte adfærd, fx vil du gøre noget ved en del af daten uden at ændre alt andet.

Klassen Calendarhar den særlige roll()metode til dette. Dens signatur er ligesom add()metoden, men denne metode ændrer kun ét element af datoen, og lader resten være uændret.

Eksempel:

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

Vi ændrede måneden, men år og dato forblev uændrede.