1. Introduktion af Date Time API
Javas skabere kunne ikke lide situationen med dato- og kalenderklasserne. De var gode i deres tid, men tiderne ændrer sig. Og noget enkelt, kraftfuldt og pålideligt blev nødvendigt. Og med udgivelsen af Java 8 (15 år efter Calendar
udkom) blev Java Date Time API introduceret. Det er et sæt klasser, der skal kunne løse enhver mulig opgave, der omhandler tid.
Der var så mange klasser, at de blev opdelt i flere pakker:
Pakken java.time
er basispakken for Java Date Time API: den indeholder klasser som LocalDate
, LocalTime
, LocalDateTime
, Instant
, Period
, og Duration
. Alle objekter i disse klasser er immutable
, hvilket betyder, at de ikke kan ændres efter oprettelsen.
Pakken java.time.format
indeholder klasser til tidsformatering, dvs. konvertering af tider (og datoer) til strenge og omvendt. For eksempel indeholder den den alsidige DateTimeFormatter
klasse, som erstatter SimpleDateFormat
klassen.
Pakken java.time.zone
indeholder klasser til at arbejde med tidszoner. Den indeholder klasser som TimeZone
og ZonedDateTime
. Hvis du skriver serverkode til klienter i forskellige dele af verden, har du virkelig brug for disse klasser.
2. LocalDate
klasse
Den første og mest nyttige klasse fra Date Time API, som vi vil se på, er klassen LocalDate
. Som du sikkert kan gætte ud fra navnet, er denne klasse designet til at arbejde med datoer.
Objekter i denne klasse ændres ikke, efter de er oprettet, dvs. klassen LocalDate
er uforanderlig. Men denne egenskab tilføjer enkelhed og pålidelighed til klassen. Især hvis flere tråde (udførelsestråde) interagerer med et sådant objekt på samme tid.
For at oprette et nyt LocalDate
objekt skal du bruge en af de statiske metoder. Her er en liste over de vigtigste.
Henter den aktuelle dato
For at få den aktuelle dato skal du bruge den statiske now()
metode. Dette er meget nemmere end det ser ud:
LocalDate today = LocalDate.now();
Hvor today
er en LocalDate
variabel, og LocalDate.now()
er et kald til klassens statiske now()
metode LocalDate
.
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
Få en dato i en bestemt tidszone
Klassen LocalDate
har også en variation af now(ZoneId)
metoden, der lader dig få den aktuelle dato i en bestemt tidszone.
For at gøre dette har vi brug for en anden klasse - ZoneId
klassen (java.time.ZoneId). Den har en of()
metode, der returnerer et ZoneId
objekt givet navnet på tidszonen.
For at bestemme den aktuelle dato i Shanghai skal du skrive følgende kode:
Kode | Konsoludgang |
---|---|
|
|
Du kan finde en liste over navnene på alle tidszonerne på internettet.
3. Få en bestemt dato
For at få et LocalDate
objekt, der repræsenterer en bestemt dato, skal du bruge den statiske of()
metode. Alt her er også meget enkelt og overskueligt:
LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);
Hvor date
er en LocalDate
variabel, og er et kald til klassens statiske metode .LocalDate.of()
of()
LocalDate
Her ser vi FEBRUARY
konstanten for Month
klassen (java.time.Month), der bruges til at angive februar som måned.
Du kan også angive måneden på gammeldags måde - ved hjælp af et tal:
LocalDate date = LocalDate.of(2019, 2, 22);
To? I stedet for februar? Betyder det, at månederne igen bliver talt fra én?
Ja, næsten 20 år efter Javas oprettelse er måneder endelig holdt op med at blive talt fra nul.
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
Få en dato efter dagens indeks
Der er en anden interessant måde at oprette en dato på: ved hjælp af ofYearDay
metoden kan du få en dato, der kun er baseret på årets nummer og indekset for dagen i året. Her er det generelle udseende:
LocalDate date = LocalDate.ofYearDay(year, day);
Hvor year
er årets nummer og day
er dagens indeks på året.
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
Den 100. dag i 2019 er den 10. april.
Få en Unix-date
Kan du huske, at Date
objekter altid har gemt tid som antallet af millisekunder siden 1. januar 1970? For at sikre, at programmører ikke ville gå glip af de gode gamle dage, LocalDate
fik klassen en ofEpochDay()
metode, som returnerer datoen beregnet fra 1. januar 1970. Her er det generelle udseende:
LocalDate date = LocalDate.ofEpochDay(day);
Hvor day
er antallet af dage, der er forløbet siden 1. januar 1970.
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
4. Få elementer af en dato
Det er umuligt at ændre LocalDate
objekter, men du kan få individuelle elementer af den gemte dato. LocalDate
objekter har flere metoder til dette:
Metode | Beskrivelse |
---|---|
|
Returnerer året for en bestemt dato |
|
Returnerer datoens måned: en af flere konstanterJANUARY, FEBRUARY, ...; |
|
Returnerer indekset for datoens måned. januar == 1. |
|
Returnerer indekset for dagen i måneden |
|
Returnerer dagens indeks fra begyndelsen af året |
|
Returnerer ugedagen: en af flere konstanterMONDAY, TUESDAY, ...; |
|
Returnerer æraen: enten BCE (før nuværende æra) og CE (aktuel æra) |
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
5. Ændring af datoen i et LocalDate
objekt
Klassen LocalDate
indeholder flere metoder, der lader dig arbejde med datoer. Implementeringen af disse metoder er analog med klassens metoder String
: de ændrer ikke det eksisterende LocalDate
objekt, men returnerer i stedet et nyt med de ønskede data.
Her er klassens metoder LocalDate
:
Metode | Beskrivelse |
---|---|
|
Tilføjer et angivet antal dage til datoen |
|
Tilføjer uger til datoen |
|
Tilføjer måneder til datoen |
|
Tilføjer år til datoen |
|
Trækker dage fra datoen |
|
Trækker uger fra datoen |
|
Trækker måneder fra dato |
|
Trækker år fra datoen |
Eksempel:
Kode | Konsoludgang |
---|---|
|
|
De birthday object
, hvis metoder vi kalder, ændres ikke. I stedet returnerer dens metoder nye objekter, der indeholder de ønskede data.
GO TO FULL VERSION