1. Date
klass och Unix-tid
Ända från början av Java har språket haft en speciell klass för att arbeta med tider och datum — Date
. Med tiden dök det upp flera klasser för att arbeta med datum, men programmerare fortsätter att använda klassen Date
även idag.
Detta beror på att det är väldigt enkelt och bekvämt. Och som programmerare kommer du definitivt att stöta på det i alla verkliga projekt. Om du vill använda det eller inte är ditt val, men du måste veta det. Så ge det några minuter av din dyrbara tid.
Vad är det som gör Date
klassen så bra? Dess enkelhet.
Klassen Date
lagrar information om datum och tid som antalet millisekunder som har förflutit sedan 1 januari 1970. Det är många millisekunder, så typen long
används för att lagra dem.
Varför sedan 1970 specifikt? Detta är så kallad Unix-tid : det är så Unix-operativsystemet, som är farfar till alla moderna operativsystem, håller tiden.
Men du kan mycket enkelt ta reda på hur mycket tid som har gått mellan två datum: subtrahera bara ett datum från det andra, så får du tidsskillnaden mellan datumen till närmaste millisekund.
Här är några användbara exempel på att arbeta med Date
klassen.
2. Hämta aktuellt datum
För att få aktuell tid och datum, skapa helt enkelt ett Date
objekt. Varje nytt objekt lagrar tiden när det skapades. Det ser väldigt enkelt ut:
Date current = new Date();
Efter att ha utfört detta kommando current
kommer variabeln att lagra en referens till det skapade Date
objektet, som internt lagrar tidpunkten för dess skapelse - antalet millisekunder som har förflutit sedan 1 januari 1970.
Visar aktuellt datum på skärmen
För att visa aktuellt datum, helt enkelt: a) skapa ett nytt Date
objekt, b) skriva ut det på skärmen med System.out.println()
metoden.
Exempel:
Koda | Konsolutgång |
---|---|
|
|
Så här betyder konsolutgången:
Text | Tolkning |
---|---|
Torsdag _ | torsdag |
21 februari | 21 februari |
14:01:34 | timmar : minuter : sekunder |
EET | Tidszon: Östeuropeisk tid |
2019 | År |
3. Ställa in ett specifikt datum
Vi kom på hur vi får den aktuella tiden, men hur skapar vi ett Date
objekt som lagrar ett annat datum eller tid?
Återigen, allt är enkelt här. För att ställa in ett specifikt datum måste du skriva kod så här:
Date birthday = new Date(year, month, day);
Allt är enkelt och självklart, men det finns två nyanser att vara medveten om:
- Året ska räknas från 1900.
- Månader numreras från noll.
Detta är ett annat arv från Unix-operativsystemet: på Unix betecknade programmerare året med två siffror. Istället för 1977 skrev de helt enkelt 77. Så 77 är rätt årtal om vi räknar från 1900.
Till exempel föddes jag den 21 mars 1989. Mars är den tredje månaden, så jag måste skriva:
Koda | Konsolutgång |
---|---|
|
|
Månader räknas från noll, men dagar är det inte Det är lite konstigt, eller hur?
Vi tycker att riktiga programmerare borde ha segrat och räknat månadsdagarna från noll också. Åh, dessa konformister 🙂
Ställa in en specifik tid
Att ställa in en specifik tid är också ganska enkelt: för detta måste du skriva ett uttalande så här:
Date birthday = new Date(year, month, day, hour, minutes, seconds);
Timmar, minuter och sekunder räknas från noll: låt programmeraren inuti dig andas ut.
Exempel:
Koda | Konsolutgång |
---|---|
|
|
Vi satte klockan 12:15 och datumet 4 juni 2005 . Detta är lite svårt för en icke-programmerare att läsa, men det fungerar som det ska.
4. Arbeta med delar av ett datum
Du kan göra mer med ett Date
objekt än att bara visa det. Den har metoder som låter dig få individuella delar av det internt lagrade datumet:
Metod | Beskrivning |
---|---|
|
Returnerar årtalet för datumet i förhållande till 1900. |
|
Returnerar månaden för datumet (månaderna är numrerade från noll) |
|
Returnerar dagen i månaden |
|
Returnerar veckodagen |
|
Returnerar timmarna |
|
Returnerar minuterna |
|
Returnerar sekunderna |
Exempel:
Koda | Konsolutgång | Notera |
---|---|---|
|
|
2005 juni dag i månaden lördag |
Förresten, ett Date
objekt låter dig inte bara få enskilda delar av ett datum, utan också ändra dem:
Metod | Beskrivning |
---|---|
void setYear(int year) |
Ändrar årtalet för datumet. Årtalet anges i förhållande till 1900. |
void setMonth(int month) |
Ändrar månaden för datumet (månaderna är numrerade från noll) |
void setDate(int date) |
Ändrar dag i månaden |
void setHours(int hours) |
Ändrar timmar |
void setMinutes(int minutes) |
Ändrar minuter |
void setSeconds(int seconds) |
Ändrar sekunder |
5. Millisekunder
Som vi sa tidigare Date
lagrar objektet antalet millisekunder som har förflutit sedan 1 januari 1970.
Om vi behöver det numret kan vi få det från objektet Date
:
long time = date.getTime();
Metoden getTime()
returnerar antalet millisekunder som lagrats inuti Date
objektet.
Du kan inte bara få antalet millisekunder, utan du kan också ändra det numret i ett befintligt objekt:
Date date = new Date();
date.setTime(1117876500000L);
Förresten, du kan skriva detta ännu mer kortfattat genom att fördriva tiden till objektet Date
direkt när det skapas:
Date date = new Date(1117876500000L);
6. Jämföra datum
Om du vill jämföra två datum och ta reda på vilken som kom först, har du tre alternativ
Det första sättet är att helt enkelt jämföra antalet millisekunder som de lagrar:
if (date1.getTime() < date2.getTime())
Det andra sättet är att använda before()
metoden för ett Date
objekt:
if (date1.before(date2))
Det lyder så här: om date1
kommer före date2
, då...
Det tredje sättet är att använda after()
metoden för ett Date
objekt:
if (date2.after(date1))
Det lyder så här: om date2
är efter date1
, då...
7. DateFormat
klass
Kom ihåg att när vi visade datumet på skärmen såg vi något i stil med detta: Thu Feb 21 14:01:34 EET 2019
. Allt verkar korrekt, men formatet är mer hur ett datum skulle visas för programmerare snarare än normala människor. Vi vill visa datumet tydligare för användarna. Något som Tuesday, February 21
.
Och utan årtal. Eller med ett år om det behövs. Generellt sett vill vi kunna visa datumet på olika sätt.
Det finns en speciell klass för detta: SimpleDateFormat
.
Exempel:
Koda |
---|
|
Konsolutgång |
|
Titta på vad programmet visade: Jun-04-2005
. Det var inte alls vad det brukade vara.
Skillnaden är att vi inte visade Date
själva objektet, utan en speciell sträng som erhålls genom att anropa format()
metoden på ett SimpleDateFormat
objekt. Men det är inte ens huvudpoängen här.
När SimpleDateFormat
objektet skapades skickade vi in strängen "MMM-dd-YYYY"
som en parameter. Det är denna sträng som förmedlar datumformatet som vi till slut såg i konsolutgången.
- MMM indikerar att visa månadens namn, förkortat med tre bokstäver
- dd anger att visa dagen i månaden
- ÅÅÅÅ anger att året ska visas med fyra siffror
MMM
Om vi vill mata ut månaden som siffror, måste vi istället för , skriva MM
, vilket ger mönstret "MM-dd-YYYY"
. Skärmutgången blir06-04-2005
Vi kommer att diskutera denna klass mer detaljerat senare.
8. Date.parse
metod
Klassen Date
kan göra något annat intressant och användbart — den kan få ett datum från en sträng. Eller, som programmerare säger, den kan analysera en sträng.
Den har den speciella parse()
metoden för detta. Parsing ser ut så här:
Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );
Förresten, den här koden kan skrivas mer kompakt:
Date date = new Date("Jul 06 12:15:00 2019");
Vi kommer att överväga analysen av strängar mer i detalj i andra lektioner.