1. Vi introduserer Date Time API
Javas skapere likte ikke situasjonen med dato- og kalenderklassene. De var gode i sin tid, men tidene endrer seg. Og noe enkelt, kraftig og pålitelig ble nødvendig. Og med utgivelsen av Java 8 (15 år etter Calendar
dukket opp), ble Java Date Time API introdusert. Det er et sett med klasser som skal kunne løse alle mulige oppgaver som omhandler tid.
Det var så mange klasser at de ble delt inn i flere pakker:
Pakken java.time
er basispakken for Java Date Time API: den inneholder klasser som LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
, og Duration
. Alle objekter i disse klassene er immutable
, noe som betyr at de ikke kan endres etter opprettelse.
Pakken java.time.format
inneholder klasser for tidsformatering, dvs. konvertering av tider (og datoer) til strenger og omvendt. For eksempel inneholder den den allsidige DateTimeFormatter
klassen, som erstatter SimpleDateFormat
klassen.
Pakken java.time.zone
inneholder klasser for arbeid med tidssoner. Den inneholder klasser som TimeZone
og ZonedDateTime
. Hvis du skriver serverkode for klienter som befinner seg i forskjellige deler av verden, vil du virkelig trenge disse klassene.
2. LocalDate
klasse
Den første og mest nyttige klassen fra Date Time API som vi skal se på er klassen LocalDate
. Som du sikkert kan gjette ut fra navnet, er denne klassen designet for å fungere med datoer.
Objekter i denne klassen endres ikke etter at de er opprettet, dvs. klassen LocalDate
er uforanderlig. Men denne egenskapen gir enkelhet og pålitelighet til klassen. Spesielt hvis flere tråder (utførelsestråder) samhandler med et slikt objekt samtidig.
For å lage et nytt LocalDate
objekt, må du bruke en av de statiske metodene. Her er en liste over de viktigste.
Henter gjeldende dato
For å få gjeldende dato, må du bruke den statiske now()
metoden. Dette er mye enklere enn det ser ut til:
LocalDate today = LocalDate.now();
Hvor today
er en LocalDate
variabel, og LocalDate.now()
er et kall til den statiske now()
metoden til LocalDate
klassen.
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Få en dato i en bestemt tidssone
Klassen LocalDate
har også en variant av now(ZoneId)
metoden som lar deg få gjeldende dato i en bestemt tidssone.
For å gjøre dette trenger vi en annen klasse - ZoneId
klassen (java.time.ZoneId). Den har en of()
metode som returnerer et ZoneId
objekt gitt navnet på tidssonen.
For å bestemme gjeldende dato i Shanghai, må du skrive følgende kode:
Kode | Konsollutgang |
---|---|
|
|
Du kan finne en liste over navnene på alle tidssonene på Internett.
3. Få en bestemt dato
For å få et LocalDate
objekt som representerer en bestemt dato, må du bruke den statiske of()
metoden. Alt her er også veldig enkelt og oversiktlig:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Hvor date
er en LocalDate
variabel, og er et kall til den statiske metoden til klassen.LocalDate.of()
of()
LocalDate
Her ser vi FEBRUARY
konstanten til Month
klassen (java.time.Month) som brukes til å spesifisere februar som måned.
Du kan også spesifisere måneden på gammeldags måte - ved å bruke et tall:
LocalDate date = LocalDate.of(2019, 2, 22);
To? I stedet for februar? Betyr det at månedene igjen telles fra én?
Ja, nesten 20 år etter at Java ble opprettet, har måneder endelig sluttet å telles fra null.
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Få en dato etter dagens indeks
Det er en annen interessant måte å lage en dato på: ved å bruke ofYearDay
metoden kan du få en dato kun basert på årstallet og indeksen for dagen i året. Her er det generelle utseendet:
LocalDate date = LocalDate.ofYearDay(year, day);
Hvor year
er årets nummer og day
er indeksen for dagen i året.
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Den 100. dagen i 2019 er 10. april.
Får en Unix-date
Husker du at Date
objekter alltid har lagret tid som antall millisekunder siden 1. januar 1970? For å sikre at programmerere ikke ville gå glipp av de gode gamle dager, LocalDate
fikk klassen en ofEpochDay()
metode som returnerer datoen beregnet fra 1. januar 1970. Her er det generelle utseendet:
LocalDate date = LocalDate.ofEpochDay(day);
Hvor day
er antall dager som har gått siden 1. januar 1970.
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
4. Få elementer av en dato
Det er umulig å endre LocalDate
objekter, men du kan få individuelle elementer av den lagrede datoen. LocalDate
objekter har flere metoder for dette:
Metode | Beskrivelse |
---|---|
|
Returnerer året for en bestemt dato |
|
Returnerer datoens måned: en av flere konstanterJANUARY, FEBRUARY, ...; |
|
Returnerer indeksen for datoens måned. januar == 1. |
|
Returnerer indeksen for dagen i måneden |
|
Returnerer dagens indeks fra begynnelsen av året |
|
Returnerer ukedagen: en av flere konstanterMONDAY, TUESDAY, ...; |
|
Returnerer epoken: enten BCE (Before Current Era) og CE (Current Era) |
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
5. Endre datoen i et LocalDate
objekt
Klassen LocalDate
inneholder flere metoder som lar deg jobbe med datoer. Implementeringen av disse metodene er analog med metodene til klassen String
: de endrer ikke det eksisterende LocalDate
objektet, men returnerer i stedet en ny med de ønskede dataene.
Her er metodene for klassen LocalDate
:
Metode | Beskrivelse |
---|---|
|
Legger til et spesifisert antall dager til datoen |
|
Legger til uker til datoen |
|
Legger til måneder til datoen |
|
Legger år til datoen |
|
Trekker dager fra datoen |
|
Trekker uker fra datoen |
|
Trekker måneder fra dato |
|
Trekker år fra datoen |
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
Den birthday object
hvis metoder vi kaller endres ikke. I stedet returnerer metodene nye objekter som inneholder de ønskede dataene.
GO TO FULL VERSION