1. Dateklass 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 Dateklassen så bra? Dess enkelhet.

Klassen Datelagrar information om datum och tid som antalet millisekunder som har förflutit sedan 1 januari 1970. Det är många millisekunder, så typen longanvänds för att lagra dem.

Intressant.

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 Dateklassen.


2. Hämta aktuellt datum

För att få aktuell tid och datum, skapa helt enkelt ett Dateobjekt. 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 currentkommer variabeln att lagra en referens till det skapade Dateobjektet, 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 Dateobjekt, b) skriva ut det på skärmen med System.out.println()metoden.

Exempel:

Koda Konsolutgång
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

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 Dateobjekt 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:

  1. Året ska räknas från 1900.
  2. Månader numreras från noll.
Intressant.

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
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

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
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

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 Dateobjekt än att bara visa det. Den har metoder som låter dig få individuella delar av det internt lagrade datumet:

Metod Beskrivning
int getYear()
Returnerar årtalet för datumet i förhållande till 1900.
int getMonth()
Returnerar månaden för datumet (månaderna är numrerade från noll)
int getDate()
Returnerar dagen i månaden
int getDay()
Returnerar veckodagen
int getHours()
Returnerar timmarna
int getMinutes()
Returnerar minuterna
int getSeconds()
Returnerar sekunderna

Exempel:

Koda Konsolutgång Notera
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
juni
dag i månaden
lördag

Förresten, ett Dateobjekt 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 Datelagrar 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 Dateobjektet.

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 Datedirekt 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 Dateobjekt:

if (date1.before(date2))

Det lyder så här: om date1kommer före date2, då...

Det tredje sättet är att använda after()metoden för ett Dateobjekt:

if (date2.after(date1))

Det lyder så här: om date2är efter date1, då...


7. DateFormatklass

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
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Konsolutgång
Jun-04-2005

Titta på vad programmet visade: Jun-04-2005. Det var inte alls vad det brukade vara.

Skillnaden är att vi inte visade Datesjälva objektet, utan en speciell sträng som erhålls genom att anropa format()metoden på ett SimpleDateFormatobjekt. Men det är inte ens huvudpoängen här.

När SimpleDateFormatobjektet 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

MMMOm 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.parsemetod

Klassen Datekan 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.