1. Introduktion af Date Time API

Introduktion til 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 Calendarudkom) 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.timeer 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.formatindeholder klasser til tidsformatering, dvs. konvertering af tider (og datoer) til strenge og omvendt. For eksempel indeholder den den alsidige DateTimeFormatterklasse, som erstatter SimpleDateFormatklassen.

Pakken java.time.zoneindeholder klasser til at arbejde med tidszoner. Den indeholder klasser som TimeZoneog ZonedDateTime. Hvis du skriver serverkode til klienter i forskellige dele af verden, har du virkelig brug for disse klasser.


2. LocalDateklasse

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 LocalDateer 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 LocalDateobjekt 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 todayer en LocalDatevariabel, og LocalDate.now()er et kald til klassens statiske now()metode LocalDate.

Eksempel:

Kode Konsoludgang
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Få en dato i en bestemt tidszone

Klassen LocalDatehar 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 - ZoneIdklassen (java.time.ZoneId). Den har en of()metode, der returnerer et ZoneIdobjekt givet navnet på tidszonen.

For at bestemme den aktuelle dato i Shanghai skal du skrive følgende kode:

Kode Konsoludgang
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 finde en liste over navnene på alle tidszonerne på internettet.


3. Få en bestemt dato

For at få et LocalDateobjekt, 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 dateer en LocalDatevariabel, og er et kald til klassens statiske metode .LocalDate.of()of()LocalDate

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

Today = 2019-02-22

Få en dato efter dagens indeks

Der er en anden interessant måde at oprette en dato på: ved hjælp af ofYearDaymetoden 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 yearer årets nummer og dayer dagens indeks på året.

Eksempel:

Kode Konsoludgang
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Den 100. dag i 2019 er den 10. april.

Få en Unix-date

Kan du huske, at Dateobjekter 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, LocalDatefik klassen en ofEpochDay()metode, som returnerer datoen beregnet fra 1. januar 1970. Her er det generelle udseende:

LocalDate date = LocalDate.ofEpochDay(day);

Hvor dayer antallet af dage, der er forløbet siden 1. januar 1970.

Eksempel:

Kode Konsoludgang
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Få elementer af en dato

Det er umuligt at ændre LocalDateobjekter, men du kan få individuelle elementer af den gemte dato. LocalDateobjekter har flere metoder til dette:

Metode Beskrivelse
int getYear()
Returnerer året for en bestemt dato
Month getMonth()
Returnerer datoens måned: en af ​​flere konstanter
JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerer indekset for datoens måned. januar == 1.
int getDayOfMonth()
Returnerer indekset for dagen i måneden
int getDayOfYear()
Returnerer dagens indeks fra begyndelsen af ​​året
DayOfWeek getDayOfWeek()
Returnerer ugedagen: en af ​​flere konstanter
MONDAY, TUESDAY, ...;
IsoEra getEra()
Returnerer æraen: enten BCE(før nuværende æra) og CE(aktuel æra)

Eksempel:

Kode Konsoludgang
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. Ændring af datoen i et LocalDateobjekt

Klassen LocalDateindeholder flere metoder, der lader dig arbejde med datoer. Implementeringen af ​​disse metoder er analog med klassens metoder String: de ændrer ikke det eksisterende LocalDateobjekt, men returnerer i stedet et nyt med de ønskede data.

Her er klassens metoder LocalDate:

Metode Beskrivelse
plusDays(int days)
Tilføjer et angivet antal dage til datoen
plusWeeks(int weeks)
Tilføjer uger til datoen
plusMonths(int months)
Tilføjer måneder til datoen
plusYears(int years)
Tilføjer år til datoen
minusDays(int days)
Trækker dage fra datoen
minusWeeks(int weeks)
Trækker uger fra datoen
minusMonths(int months)
Trækker måneder fra dato
minusYears(int years)
Trækker år fra datoen

Eksempel:

Kode Konsoludgang
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

De birthday object, hvis metoder vi kalder, ændres ikke. I stedet returnerer dens metoder nye objekter, der indeholder de ønskede data.