1. Dateklasse og Unix tid

Fra begyndelsen af ​​Java har sproget haft en særlig klasse til at arbejde med tidspunkter og datoer — Date. Med tiden dukkede flere klasser op til at arbejde med datoer, men programmører fortsætter med at bruge klassen Dateselv i dag.

Dette er fordi det er meget enkelt og praktisk. Og som programmør vil du helt sikkert støde på det i ethvert rigtigt projekt. Om du vil bruge det eller ej er dit valg, men du skal vide det. Så giv det et par minutter af din dyrebare tid.

Hvad gør Dateklassen så god? Dens enkelhed.

Klassen Dategemmer oplysninger om dato og klokkeslæt som antallet af millisekunder, der er gået siden 1. januar 1970. Det er mange millisekunder, så typen longbruges til at gemme dem.

Interessant.

Hvorfor siden 1970 specifikt? Dette er såkaldt Unix-tid : det er sådan, Unix-operativsystemet, som er bedstefar til alle moderne styresystemer, holder tiden.

Men du kan meget nemt finde ud af, hvor lang tid der er gået mellem to datoer: Træk blot den ene dato fra den anden, og du får tidsforskellen mellem datoerne til nærmeste millisekund.

Her er nogle nyttige eksempler på at arbejde med Dateklassen.


2. Henter den aktuelle dato

For at få det aktuelle klokkeslæt og dato skal du blot oprette et Dateobjekt. Hvert nyt objekt gemmer tidspunktet, hvor det blev oprettet. Det ser meget simpelt ud:

Date current = new Date();

Efter at have udført denne kommando, currentvil variablen gemme en reference til det oprettede Dateobjekt, som internt gemmer tidspunktet for dets oprettelse - antallet af millisekunder, der er gået siden 1. januar 1970.

Viser den aktuelle dato på skærmen

For at vise den aktuelle dato, skal du blot: a) oprette et nyt Dateobjekt, b) udskrive det på skærmen ved hjælp af System.out.println()metoden.

Eksempel:

Kode Konsoludgang
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Her er, hvad konsoludgangen betyder:

Tekst Fortolkning
Torsdag _ torsdag
februar 21 21. februar
14:01:34 timer : minutter : sekunder
EET Tidszone: Østeuropæisk tid
2019 År

3. Indstilling af en bestemt dato

Vi fandt ud af, hvordan vi får det aktuelle klokkeslæt, men hvordan opretter vi et Dateobjekt, der gemmer en anden dato eller tid?

Igen, alt er enkelt her. For at indstille en bestemt dato skal du skrive kode som denne:

Date birthday = new Date(year, month, day);

Alt er enkelt og indlysende, men der er to nuancer at være opmærksom på:

  1. Året skal tælles fra 1900.
  2. Måneder er nummereret fra nul.
Interessant.

Dette er en anden arv fra Unix-operativsystemet: på Unix betegnede programmører året med to cifre. I stedet for 1977 skrev de blot 77. Så 77 er det rigtige år, hvis vi tæller fra 1900.

For eksempel er jeg født den 21. marts 1989. Marts er den tredje måned, så jeg skal skrive:

Kode Konsoludgang
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Måneder er talt fra nul, men dage er ikke Det er lidt mærkeligt, ikke?

Vi mener, at ægte programmører burde have sejret og også talt månedens dage fra nul. Åh, disse konformister 🙂

Indstilling af et bestemt tidspunkt

At indstille et bestemt tidspunkt er også ret simpelt: til dette skal du skrive en erklæring som denne:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Timer, minutter og sekunder er talt fra nul: Lad programmøren indeni dig ånde lettet op.

Eksempel:

Kode Konsoludgang
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Vi sætter klokken 12:15 og datoen 4. juni 2005 . Dette er lidt svært for en ikke-programmør at læse, men det fungerer som det skal.


4. Arbejde med elementer af en dato

Du kan gøre mere med et Dateobjekt end blot at vise det. Det har metoder , der lader dig få individuelle elementer af den internt gemte dato:

Metode Beskrivelse
int getYear()
Returnerer året for datoen i forhold til 1900.
int getMonth()
Returnerer måneden for datoen (månederne er nummereret fra nul)
int getDate()
Returnerer dagen i måneden
int getDay()
Returnerer ugedagen
int getHours()
Returnerer timerne
int getMinutes()
Returnerer minutterne
int getSeconds()
Returnerer sekunderne

Eksempel:

Kode Konsoludgang Bemærk
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åneden
lørdag

Forresten giver et Dateobjekt dig ikke kun mulighed for at få individuelle elementer af en dato, men også ændre dem:

Metode Beskrivelse
void setYear(int year) Ændrer året for datoen. Året er angivet i forhold til 1900.
void setMonth(int month) Ændrer måneden for datoen (månederne er nummereret fra nul)
void setDate(int date) Ændrer dag i måneden
void setHours(int hours) Skifter timer
void setMinutes(int minutes) Ændrer minutter
void setSeconds(int seconds) Skifter sekunder

5. Millisekunder

Som vi sagde tidligere, Dategemmer objektet antallet af millisekunder, der er forløbet siden 1. januar 1970.

Hvis vi har brug for det nummer, kan vi få det fra objektet Date:

long time = date.getTime();

Metoden getTime()returnerer antallet af millisekunder gemt inde i objektet Date.

Ikke kun kan du få antallet af millisekunder, men du kan også ændre dette tal i et eksisterende objekt:

Date date = new Date();
date.setTime(1117876500000L);

Du kan i øvrigt skrive dette endnu mere kortfattet ved at overføre tiden til objektet Datelige når det er oprettet:

Date date = new Date(1117876500000L);

6. Sammenligning af datoer

Hvis du vil sammenligne to datoer og finde ud af, hvilken der kom først, har du tre muligheder

Den første måde er simpelthen at sammenligne antallet af millisekunder, de hver især gemmer:

if (date1.getTime() < date2.getTime())

Den anden måde er at bruge before()metoden til et Dateobjekt:

if (date1.before(date2))

Det lyder sådan her: hvis date1kommer før date2, så...

Den tredje måde er at bruge after()et objekts metode Date:

if (date2.after(date1))

Det lyder sådan her: hvis date2er efter date1, så...


7. DateFormatklasse

Husk, da vi viste datoen på skærmen, så vi noget som dette: Thu Feb 21 14:01:34 EET 2019. Alt virker korrekt, men formatet er mere, hvordan en dato vil blive vist for programmører frem for normale mennesker. Vi ønsker at vise datoen mere tydeligt for brugerne. Noget som Tuesday, February 21.

Og uden årstal. Eller med et år evt. Generelt ønsker vi at kunne vise datoen på forskellige måder.

Der er en særlig klasse til dette: SimpleDateFormat.

Eksempel:

Kode
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);
Konsoludgang
Jun-04-2005

Se, hvad programmet viste: Jun-04-2005. Det var slet ikke, hvad det plejede at være.

Forskellen er, at vi ikke viste Dateselve objektet, men en speciel streng opnået ved at kalde format()metoden på et SimpleDateFormatobjekt. Men det er ikke engang hovedpointen her.

Da SimpleDateFormatobjektet blev oprettet, sendte vi strengen ind "MMM-dd-YYYY"som en parameter. Det er denne streng, der formidler datoformatet, som vi i sidste ende så i konsoloutputtet.

  • MMM angiver at vise månedens navn, forkortet med tre bogstaver
  • dd angiver at vise dagen i måneden
  • YYYY angiver at vise året med fire cifre

Hvis vi vil udskrive måneden som tal, MMMskal vi i stedet for , skrive MM, hvilket giver mønsteret "MM-dd-YYYY". Skærmoutput vil være06-04-2005

Vi vil diskutere denne klasse mere detaljeret senere.


8. Date.parsemetode

Klassen Datekan gøre noget andet interessant og nyttigt - den kan få en dato fra en streng. Eller, som programmører siger, det kan parse en streng.

Det har den specielle parse()metode til dette. Parsing ser sådan ud:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Forresten kan denne kode skrives mere kompakt:

Date date = new Date("Jul 06 12:15:00 2019");

Vi vil overveje parsing af strenge mere detaljeret i andre lektioner.