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 Calendardukket 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.timeer 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.formatinneholder klasser for tidsformatering, dvs. konvertering av tider (og datoer) til strenger og omvendt. For eksempel inneholder den den allsidige DateTimeFormatterklassen, som erstatter SimpleDateFormatklassen.
Pakken java.time.zoneinneholder klasser for arbeid med tidssoner. Den inneholder klasser som TimeZoneog ZonedDateTime. Hvis du skriver serverkode for klienter som befinner seg i forskjellige deler av verden, vil du virkelig trenge disse klassene.
2. LocalDateklasse
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 LocalDateer 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 LocalDateobjekt, 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 todayer en LocalDatevariabel, og LocalDate.now()er et kall til den statiske now()metoden til LocalDateklassen.
Eksempel:
| Kode | Konsollutgang |
|---|---|
|
|
Få en dato i en bestemt tidssone
Klassen LocalDatehar 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 - ZoneIdklassen (java.time.ZoneId). Den har en of()metode som returnerer et ZoneIdobjekt 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 LocalDateobjekt 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 dateer en LocalDatevariabel, og er et kall til den statiske metoden til klassen.LocalDate.of()of()LocalDate
Her ser vi FEBRUARYkonstanten til Monthklassen (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 ofYearDaymetoden 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 yearer årets nummer og dayer indeksen for dagen i året.
Eksempel:
| Kode | Konsollutgang |
|---|---|
|
|
Den 100. dagen i 2019 er 10. april.
Får en Unix-date
Husker du at Dateobjekter alltid har lagret tid som antall millisekunder siden 1. januar 1970? For å sikre at programmerere ikke ville gå glipp av de gode gamle dager, LocalDatefikk klassen en ofEpochDay()metode som returnerer datoen beregnet fra 1. januar 1970. Her er det generelle utseendet:
LocalDate date = LocalDate.ofEpochDay(day);
Hvor dayer antall dager som har gått siden 1. januar 1970.
Eksempel:
| Kode | Konsollutgang |
|---|---|
|
|
4. Få elementer av en dato
Det er umulig å endre LocalDateobjekter, men du kan få individuelle elementer av den lagrede datoen. LocalDateobjekter 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 LocalDateobjekt
Klassen LocalDateinneholder flere metoder som lar deg jobbe med datoer. Implementeringen av disse metodene er analog med metodene til klassen String: de endrer ikke det eksisterende LocalDateobjektet, 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 objecthvis metoder vi kaller endres ikke. I stedet returnerer metodene nye objekter som inneholder de ønskede dataene.
GO TO FULL VERSION