1. Dateclasa si ora Unix

De la începutul Java, limbajul a avut o clasă specială pentru lucrul cu ore și date — Date. De-a lungul timpului, au apărut mai multe clase pentru lucrul cu datele, dar programatorii continuă să folosească clasa Dateși astăzi.

Acest lucru se datorează faptului că este foarte simplu și convenabil. Și ca programator, cu siguranță îl vei întâlni în orice proiect real. Dacă să-l folosești sau nu este alegerea ta, dar trebuie să-l știi. Așa că acordă-i câteva minute din timpul tău prețios.

Ce face Dateclasa atât de bună? Simplitatea sa.

Clasa Datestochează informații despre dată și oră ca număr de milisecunde care au trecut de la 1 ianuarie 1970. Adică o mulțime de milisecunde, așa că longtipul este folosit pentru a le stoca.

Interesant.

De ce anume din 1970? Acesta este așa-numitul timp Unix : este modul în care sistemul de operare Unix, care este bunicul tuturor sistemelor de operare moderne, păstrează timpul.

Dar puteți afla foarte ușor cât timp a trecut între două date: doar scădeți o dată din cealaltă și obțineți diferența de timp dintre date la cea mai apropiată milisecundă.

Iată câteva exemple utile de lucru cu Dateclasa.


2. Obținerea datei curente

Pentru a obține ora și data curente, pur și simplu creați un Dateobiect. Fiecare obiect nou stochează ora când a fost creat. Pare foarte simplu:

Date current = new Date();

După executarea acestei comenzi, currentvariabila va stoca o referință la Dateobiectul creat, care va stoca intern ora creării sale - numărul de milisecunde care au trecut de la 1 ianuarie 1970.

Afișarea datei curente pe ecran

Pentru a afișa data curentă, pur și simplu: a) creați un Dateobiect nou, b) imprimați-l pe ecran folosind System.out.println()metoda.

Exemplu:

Cod Ieșire de consolă
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Iată ce înseamnă ieșirea consolei:

Text Interpretare
joi joi joi
21 februarie 21 februarie
14:01:34 ore : minute : secunde
EET Fus orar: Ora Europei de Est
2019 An

3. Setarea unei date specifice

Ne-am dat seama cum să obținem ora curentă, dar cum creăm un Dateobiect care stochează o dată sau oră diferită?

Din nou, totul este simplu aici. Pentru a seta o anumită dată, trebuie să scrieți cod astfel:

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

Totul este simplu și evident, dar există două nuanțe de care trebuie să fii conștient:

  1. Anul trebuie numărat începând cu 1900.
  2. Lunile sunt numerotate de la zero.
Interesant.

Aceasta este o altă moștenire a sistemului de operare Unix: pe Unix, programatorii au indicat anul folosind două cifre. În loc de 1977, au scris pur și simplu 77. Deci 77 este anul corect dacă numărăm de la 1900.

De exemplu, m-am născut pe 21 martie 1989. Martie este a treia lună, așa că trebuie să scriu:

Cod Ieșire de consolă
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Lunile sunt numerotate de la zero, dar zilele nu sunt. E puțin ciudat, nu?

Credem că adevărații programatori ar fi trebuit să prevaleze și să numere și zilele lunii de la zero. Oh, conformiștii ăștia 🙂

Setarea unei anumite ore

Setarea unei anumite ore este, de asemenea, destul de simplă: pentru aceasta, trebuie să scrieți o declarație ca aceasta:

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

Orele, minutele și secundele sunt numerotate de la zero: lasă programatorul din tine să răsufle uşurat.

Exemplu:

Cod Ieșire de consolă
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Am stabilit ora 12:15 și data 4 iunie 2005 . Acest lucru este puțin dificil de citit pentru un non-programator, dar funcționează așa cum ar trebui.


4. Lucrul cu elemente ale unei date

Puteți face mai mult cu un Dateobiect decât să îl afișați. Are metode care vă permit să obțineți elemente individuale ale datei stocate intern:

Metodă Descriere
int getYear()
Returnează anul datei relativ la 1900.
int getMonth()
Returnează luna datei (lunile sunt numerotate de la zero)
int getDate()
Returnează ziua lunii
int getDay()
Returnează ziua săptămânii
int getHours()
Returnează orele
int getMinutes()
Returnează minutele
int getSeconds()
Returnează secundele

Exemplu:

Cod Ieșire de consolă Notă
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
iunie
ziua lunii
sâmbătă

Apropo, un Dateobiect nu numai că vă permite să obțineți elemente individuale ale unei date, dar și să le schimbați:

Metodă Descriere
void setYear(int year) Schimbă anul datei. Anul este indicat în raport cu 1900.
void setMonth(int month) Schimbă luna datei (lunile sunt numerotate de la zero)
void setDate(int date) Schimbă ziua lunii
void setHours(int hours) Schimbă orele
void setMinutes(int minutes) Schimbă minute
void setSeconds(int seconds) Schimbă secunde

5. Milisecunde

După cum am spus anterior, Dateobiectul stochează numărul de milisecunde care au trecut de la 1 ianuarie 1970.

Dacă avem nevoie de acel număr, îl putem obține de la Dateobiect:

long time = date.getTime();

Metoda getTime()returnează numărul de milisecunde stocat în interiorul obiectului Date.

Nu numai că puteți obține numărul de milisecunde, dar puteți și modifica acel număr într-un obiect existent:

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

Apropo, puteți scrie acest lucru și mai concis, trecând timpul obiectului Datechiar atunci când este creat:

Date date = new Date(1117876500000L);

6. Compararea datelor

Dacă doriți să comparați două date și să aflați care a fost primul, aveți trei opțiuni

Prima modalitate este de a compara pur și simplu numărul de milisecunde pe care fiecare le stochează:

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

A doua modalitate este de a folosi before()metoda unui Dateobiect:

if (date1.before(date2))

Se citește astfel: dacă date1vine înainte date2, atunci...

A treia modalitate este de a folosi after()metoda unui Dateobiect:

if (date2.after(date1))

Se citește astfel: dacă date2este după date1, atunci...


7. DateFormatclasa

Amintiți-vă, când am afișat data pe ecran, am văzut ceva de genul: Thu Feb 21 14:01:34 EET 2019. Totul pare corect, dar formatul este mai degrabă modul în care o dată ar fi afișată pentru programatori decât pentru oamenii normali. Dorim să afișăm data mai clar pentru utilizatori. Ceva de genul Tuesday, February 21.

Și fără anul. Sau cu un an, la nevoie. În general, dorim să putem afișa data în moduri diferite.

Există o clasă specială pentru aceasta: SimpleDateFormat.

Exemplu:

Cod
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);
Ieșire de consolă
Jun-04-2005

Uită-te la ce a afișat programul: Jun-04-2005. Nu este deloc ceea ce a fost.

Diferența este că nu am afișat obiectul Dateîn sine, ci un șir special obținut prin apelarea format()metodei pe un SimpleDateFormatobiect. Dar acesta nu este nici măcar punctul principal aici.

Când SimpleDateFormatobiectul a fost creat, am trecut șirul "MMM-dd-YYYY"ca parametru. Acest șir este cel care transmite formatul de dată pe care l-am văzut în cele din urmă în ieșirea consolei.

  • MMM indică afișarea numelui lunii, prescurtat folosind trei litere
  • dd indică afișarea zilei lunii
  • YYYY indică afișarea anului folosind patru cifre

Dacă vrem să scoatem luna ca numere, atunci în loc de MMM, trebuie să scriem MM, ceea ce produce modelul "MM-dd-YYYY". Ieșirea ecranului va fi06-04-2005

Vom discuta despre această clasă mai detaliat mai târziu.


8. Date.parsemetoda

Clasa Datepoate face altceva interesant și util - poate obține o dată dintr-un șir. Sau, după cum spun programatorii, poate analiza un șir.

Are parse()metoda specială pentru asta. Analizarea arată astfel:

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

Apropo, acest cod poate fi scris mai compact:

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

Vom lua în considerare analizarea șirurilor de caractere mai detaliat în alte lecții.