1. Vi introduserer Date Time API

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
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

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
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

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
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

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
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

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
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

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
int getYear()
Returnerer året for en bestemt dato
Month getMonth()
Returnerer datoens måned: en av flere konstanter
JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerer indeksen for datoens måned. januar == 1.
int getDayOfMonth()
Returnerer indeksen for dagen i måneden
int getDayOfYear()
Returnerer dagens indeks fra begynnelsen av året
DayOfWeek getDayOfWeek()
Returnerer ukedagen: en av flere konstanter
MONDAY, TUESDAY, ...;
IsoEra getEra()
Returnerer epoken: enten BCE(Before Current Era) og CE(Current Era)

Eksempel:

Kode Konsollutgang
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

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
plusDays(int days)
Legger til et spesifisert antall dager til datoen
plusWeeks(int weeks)
Legger til uker til datoen
plusMonths(int months)
Legger til måneder til datoen
plusYears(int years)
Legger år til datoen
minusDays(int days)
Trekker dager fra datoen
minusWeeks(int weeks)
Trekker uker fra datoen
minusMonths(int months)
Trekker måneder fra dato
minusYears(int years)
Trekker år fra datoen

Eksempel:

Kode Konsollutgang
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Den birthday objecthvis metoder vi kaller endres ikke. I stedet returnerer metodene nye objekter som inneholder de ønskede dataene.