1. 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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
|
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 |
|---|---|
|
Returnerar året för ett visst datum |
|
Returnerar datumets månad: en av flera konstanterJANUARY, FEBRUARY, ...; |
|
Returnerar index för datumets månad. januari == 1. |
|
Returnerar index för dagen i månaden |
|
Returnerar dagens index från början av året |
|
Returnerar veckodagen: en av flera konstanterMONDAY, TUESDAY, ...; |
|
Returnerar eran: antingen BCE(Before Current Era) och CE(Current Era) |
Exempel:
| Koda | Konsolutgång |
|---|---|
|
|
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 |
|---|---|
|
Lägger till ett angivet antal dagar till datumet |
|
Lägger till veckor till datumet |
|
Lägger till månader till datumet |
|
Lägger till år till datumet |
|
Subtraherar dagar från datumet |
|
Subtraherar veckor från datumet |
|
Subtraherar månader från datum |
|
Subtraherar år från datumet |
Exempel:
| Koda | Konsolutgång |
|---|---|
|
|
De birthday objectvars metoder vi kallar förändras inte. Istället returnerar dess metoder nya objekt som innehåller önskad data.
GO TO FULL VERSION