1. Introduktion av Date Time API

Introduktion av Date Time API

Javas skapare gillade inte situationen med datum- och kalenderklasserna. De var bra på sin tid, men tiderna förändras. Och något enkelt, kraftfullt och pålitligt blev nödvändigt. Och med lanseringen av Java 8 (15 år efter Calendaratt ha dök upp) introducerades Java Date Time API . Det är en uppsättning klasser som ska kunna lösa alla möjliga uppgifter som handlar om tid.

Det fanns så många klasser att de delades upp i flera paket:

Paketet java.timeär baspaketet för Java Date Time API: det innehåller klasser som LocalDate, LocalTime, LocalDateTime, Instant, Period, och Duration. Alla objekt i dessa klasser är immutable, vilket innebär att de inte kan ändras efter att de skapats.

Paketet java.time.formatinnehåller klasser för tidsformatering, dvs konvertering av tider (och datum) till strängar och vice versa. Till exempel innehåller den den mångsidiga DateTimeFormatterklassen, som ersätter SimpleDateFormatklassen.

Paketet java.time.zoneinnehåller klasser för att arbeta med tidszoner. Den innehåller klasser som TimeZoneoch ZonedDateTime. Om du skriver serverkod för klienter som finns i olika delar av världen behöver du verkligen dessa klasser.


2. LocalDateklass

Den första och mest användbara klassen från Date Time API som vi ska titta på är klassen LocalDate. Som du säkert kan gissa från dess namn är den här klassen designad för att fungera med datum.

Objekt i denna klass ändras inte efter att de skapats, dvs klassen LocalDateär oföränderlig. Men den här egenskapen tillför enkelhet och tillförlitlighet till klassen. Speciellt om flera trådar (utförandetrådar) interagerar med ett sådant objekt samtidigt.

För att skapa ett nytt LocalDateobjekt måste du använda en av de statiska metoderna. Här är en lista över de viktigaste.

Hämtar aktuellt datum

För att få aktuellt datum måste du använda den statiska now()metoden. Det här är mycket lättare än det verkar:

LocalDate today = LocalDate.now();

Where todayär en LocalDatevariabel och är ett anrop till klassens LocalDate.now()statiska now()metod .LocalDate

Exempel:

Koda Konsolutgång
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Att få ett datum i en specifik tidszon

Klassen LocalDatehar också en variant av now(ZoneId)metoden som låter dig få aktuellt datum i en specifik tidszon.

För att göra detta behöver vi en annan klass – ZoneIdklassen (java.time.ZoneId). Den har en of()metod som returnerar ett ZoneIdobjekt med namnet på tidszonen.

För att bestämma det aktuella datumet i Shanghai måste du skriva följande kod:

Koda Konsolutgång
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 hitta en lista över namnen på alla tidszoner på Internet.


3. Få ett specifikt datum

För att få ett LocalDateobjekt som representerar ett specifikt datum måste du använda den statiska of()metoden. Allt här är också väldigt enkelt och tydligt:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Where dateär en LocalDatevariabel och är ett anrop till klassens statiska metod .LocalDate.of()of()LocalDate

Här ser vi FEBRUARYkonstanten för Monthklassen (java.time.Month) som används för att ange februari som månad.

Du kan också specificera månaden på gammaldags sätt - med ett nummer:

LocalDate date = LocalDate.of(2019, 2, 22);

Två? Istället för februari? Betyder det att månaderna återigen räknas från ett?

Ja, nästan 20 år efter Javas skapelse har månader äntligen slutat räknas från noll.

Exempel:

Koda Konsolutgång
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Få ett datum efter dagens index

Det finns ett annat intressant sätt att skapa ett datum: med ofYearDaymetoden kan du få ett datum endast baserat på årets nummer och index för dagen på året. Här är det allmänna utseendet:

LocalDate date = LocalDate.ofYearDay(year, day);

Var yearär årets nummer och dayär dagens index på året.

Exempel:

Koda Konsolutgång
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

Den 100:e dagen 2019 är den 10:e april.

Skaffa en Unix-dejt

Kommer du ihåg att Dateobjekt alltid lagrade tid som antalet millisekunder sedan 1 januari 1970? För att säkerställa att programmerare inte skulle missa den gamla goda tiden LocalDatefick klassen en ofEpochDay()metod som returnerar datumet beräknat från 1 januari 1970. Här är det allmänna utseendet:

LocalDate date = LocalDate.ofEpochDay(day);

Var dayär antalet dagar som har förflutit sedan 1 januari 1970.

Exempel:

Koda Konsolutgång
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Få delar av ett datum

Det är omöjligt att ändra LocalDateobjekt, men du kan få individuella element av det lagrade datumet. LocalDateobjekt har flera metoder för detta:

Metod Beskrivning
int getYear()
Returnerar året för ett visst datum
Month getMonth()
Returnerar datumets månad: en av flera konstanter
JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnerar index för datumets månad. januari == 1.
int getDayOfMonth()
Returnerar index för dagen i månaden
int getDayOfYear()
Returnerar dagens index från början av året
DayOfWeek getDayOfWeek()
Returnerar veckodagen: en av flera konstanter
MONDAY, TUESDAY, ...;
IsoEra getEra()
Returnerar eran: antingen BCE(Before Current Era) och CE(Current Era)

Exempel:

Koda Konsolutgång
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. Ändra datum i ett LocalDateobjekt

Klassen LocalDateinnehåller flera metoder som låter dig arbeta med datum. Implementeringen av dessa metoder är analog med metoderna i klassen String: de ändrar inte det befintliga LocalDateobjektet, utan returnerar istället ett nytt med önskad data.

Här är klassens metoder LocalDate:

Metod Beskrivning
plusDays(int days)
Lägger till ett angivet antal dagar till datumet
plusWeeks(int weeks)
Lägger till veckor till datumet
plusMonths(int months)
Lägger till månader till datumet
plusYears(int years)
Lägger till år till datumet
minusDays(int days)
Subtraherar dagar från datumet
minusWeeks(int weeks)
Subtraherar veckor från datumet
minusMonths(int months)
Subtraherar månader från datum
minusYears(int years)
Subtraherar år från datumet

Exempel:

Koda Konsolutgång
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 objectvars metoder vi kallar förändras inte. Istället returnerar dess metoder nya objekt som innehåller önskad data.