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 Calendar
att 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.format
innehå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 DateTimeFormatter
klassen, som ersätter SimpleDateFormat
klassen.
Paketet java.time.zone
innehåller klasser för att arbeta med tidszoner. Den innehåller klasser som TimeZone
och ZonedDateTime
. Om du skriver serverkod för klienter som finns i olika delar av världen behöver du verkligen dessa klasser.
2. LocalDate
klass
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 LocalDate
objekt 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 LocalDate
variabel 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 LocalDate
har 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 – ZoneId
klassen (java.time.ZoneId). Den har en of()
metod som returnerar ett ZoneId
objekt 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 LocalDate
objekt 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 LocalDate
variabel och är ett anrop till klassens statiska metod .LocalDate.of()
of()
LocalDate
Här ser vi FEBRUARY
konstanten för Month
klassen (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 ofYearDay
metoden 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 Date
objekt 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 LocalDate
fick 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 LocalDate
objekt, men du kan få individuella element av det lagrade datumet. LocalDate
objekt 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 LocalDate
objekt
Klassen LocalDate
innehå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 LocalDate
objektet, 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 object
vars metoder vi kallar förändras inte. Istället returnerar dess metoder nya objekt som innehåller önskad data.
GO TO FULL VERSION