1. Skift fra Date
klassen til Calendar
klassen
Programmører elskede Date
klassen for dens enkelhed og understøttelse af Unix-standarder, men som du ved, har hver rose sine torne.
Programmører ønskede en "smart" Date
klasse. Og de fik, hvad de ville have i form af Calendar
klassen. 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 Calendar
er 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 Calendar
objekt med denne kommando:
Calendar date = Calendar.getInstance();
Klassens statiske getInstance()
metode Calendar
opretter et Calendar
objekt 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 Calendar
understø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 GregorianCalendar
hver gang. I stedet for Calendar
kan du også skrive GregorianCalendar
- det vil også virke. Men at skrive er bare Calendar
kortere.
Å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 |
---|
|
Konsoludgang |
|
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 SimpleDateFormat
objekt til at vise en kalender, men indtil vi studerer det, kan du bruge dette life hack.
Date date = calendar.getTime();
Et Calendar
objekt kan nemt konverteres til et Date
objekt, og du ved allerede, hvordan du viser et Date
objekt. Du kan bruge kode som denne til at konvertere et Calendar
objekt til et Date
:
Brug af getTime()
metoden:
Kode | Konsoludgang |
---|---|
|
|
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, ...), Calendar
har klassen get()
metoden. Det er en enkelt metode, men den har parametre:
int month = calendar.get(Calendar.MONTH);
Hvor calendar
er en Calendar
variabel, og MONTH
er et konstant felt i Calendar
klassen.
Du sender et af Calendar
klassens konstantfelter som argument til get
metoden, og du får den ønskede værdi som resultat.
Eksempler
Kode | Beskrivelse |
---|---|
|
æ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 set
metoden:
calendar.set(Calendar.MONTH, value);
Hvor calendar
er en Calendar
variabel, og MONTH
er et konstant felt i Calendar
klassen.
Når du arbejder med set
metode, sender du et af Calendar
klassens konstantfelter som det første argument, og den nye værdi som det andet argument.
Eksempler
Kode | Beskrivelse |
---|---|
|
år = 2019 måned = juli (nummereret fra 0) 4. dag timer minutter sekunder |
Calendar
5. Klassens konstanter
Klassens konstante felter Calendar
er 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 Calendar
objekt
Klassen Calendar
har 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 calendar
er en Calendar
variabel, og MONTH
er et konstant felt i Calendar
klassen.
Når du arbejder med add
metode, sender du et af Calendar
klassens 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 |
---|
|
Konsoludgang |
|
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 |
---|
|
Konsoludgang |
|
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 Calendar
har 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 |
---|
|
Konsoludgang |
|
Vi ændrede måneden, men år og dato forblev uændrede.
GO TO FULL VERSION