1. Bytte fra Date
klassen til Calendar
klassen
Programmerere elsket Date
klassen for sin enkelhet og støtte for Unix-standarder, men som du vet har hver rose sine torner.
Programmerere ønsket en "smart" Date
klasse. 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å Calendar
klassen 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 Calendar
objekt med denne kommandoen:
Calendar date = Calendar.getInstance();
Klassens statiske getInstance()
metode Calendar
lager et Calendar
objekt 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 Calendar
stø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 GregorianCalendar
hver gang. I stedet for Calendar
kan du også skrive GregorianCalendar
- det vil også fungere. Men å skrive Calendar
er 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 |
---|
|
Konsollutgang |
|
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 SimpleDateFormat
objekt for å vise en kalender, men inntil vi studerer det, kan du bruke dette life hacket.
Date date = calendar.getTime();
Et Calendar
objekt kan enkelt konverteres til et Date
objekt, og du vet allerede hvordan du viser et Date
objekt. Du kan bruke kode som dette for å konvertere et Calendar
objekt til en Date
:
Ved å bruke getTime()
metoden:
Kode | Konsollutgang |
---|---|
|
|
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, ...), Calendar
har klassen get()
metoden. Det er en enkelt metode, men den har parametere:
int month = calendar.get(Calendar.MONTH);
Hvor calendar
er en Calendar
variabel, og MONTH
er et konstant felt i Calendar
klassen.
Du sender et av Calendar
klassens konstantfelt som argument til get
metoden, og du får ønsket verdi som resultat.
Eksempler
Kode | Beskrivelse |
---|---|
|
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 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 arbeider med set
metode, sender du ett av Calendar
klassens konstantfelt som det første argumentet, og den nye verdien som det andre argumentet.
Eksempler
Kode | Beskrivelse |
---|---|
|
år = 2019 måned = juli (nummerert fra 0) 4. dag timer minutter sekunder |
Calendar
5. Klassens konstanter
Klassens konstante felt Calendar
er 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 Calendar
objekt
Klassen Calendar
har 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 calendar
er en Calendar
variabel, og MONTH
er et konstant felt i Calendar
klassen.
Når du arbeider med add
metode, sender du ett av Calendar
klassens 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 |
---|
|
Konsollutgang |
|
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 |
---|
|
Konsollutgang |
|
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 Calendar
har 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 |
---|
|
Konsollutgang |
|
Vi endret måneden, men år og dato forble uendret.
GO TO FULL VERSION