1. Prezentarea API-ului Date Time

Vă prezentăm API-ul Date Time

Creatorilor Java nu le-a plăcut situația cu clasele Date și Calendar. Erau buni în zilele lor, dar vremurile se schimbă. Și ceva simplu, puternic și de încredere a devenit necesar. Și odată cu lansarea Java 8 (la 15 ani după Calendarapariție), a fost introdus API-ul Java Date Time . Este un set de clase care ar trebui să poată rezolva orice sarcină posibilă care se ocupă de timp.

Au fost atât de multe clase încât au fost împărțite în mai multe pachete:

Pachetul java.timeeste pachetul de bază pentru API-ul Java Date Time: conține clase precum LocalDate, LocalTime, LocalDateTime, Instant, Periodși Duration. Toate obiectele acestor clase sunt immutable, ceea ce înseamnă că nu pot fi modificate după creare.

Pachetul java.time.formatconține clase pentru formatarea orei, adică conversia orelor (și a datelor) în șiruri de caractere și invers. De exemplu, conține DateTimeFormatterclasa versatilă, care înlocuiește SimpleDateFormatclasa.

Pachetul java.time.zoneconține clase pentru lucrul cu fusurile orare. Conține clase precum TimeZoneși ZonedDateTime. Dacă scrieți cod de server pentru clienți aflați în diferite părți ale lumii, veți avea nevoie într-adevăr de aceste clase.


2. LocalDateclasa

Prima și cea mai utilă clasă din API-ul Date Time la care ne vom uita este LocalDateclasa. După cum probabil puteți ghici din numele său, această clasă este concepută pentru a lucra cu date.

Obiectele acestei clase nu se schimbă după ce sunt create, adică clasa LocalDateeste imuabilă. Dar această proprietate adaugă simplitate și fiabilitate clasei. Mai ales dacă mai multe fire (fire de execuție) interacționează cu un astfel de obiect în același timp.

Pentru a crea un obiect nou LocalDate, trebuie să utilizați una dintre metodele statice. Iată o listă a celor principale.

Obținerea datei curente

Pentru a obține data curentă, trebuie să utilizați now()metoda statică. Acest lucru este mult mai ușor decât pare:

LocalDate today = LocalDate.now();

Unde todayeste o LocalDatevariabilă și LocalDate.now()este un apel la metoda statică now()a LocalDateclasei.

Exemplu:

Cod Ieșire de consolă
LocalDate today = LocalDate.now();
System.out.println("Today = " + today);

Today = 2019-02-22

Obținerea unei date într-un anumit fus orar

Clasa LocalDateare, de asemenea, o variantă a now(ZoneId)metodei care vă permite să obțineți data curentă într-un anumit fus orar.

Pentru a face acest lucru, avem nevoie de o altă clasă - ZoneIdclasa (java.time.ZoneId). Are o of()metodă care returnează un ZoneIdobiect cu numele fusului orar.

Pentru a determina data curentă în Shanghai, trebuie să scrieți următorul cod:

Cod Ieșire de consolă
ZoneId  timezone = ZoneId.of("Asia/Shanghai");
LocalDate today = LocalDate.now(timezone);
System.out.println("In Shanghai, now = " + today);


In Shanghai, now = 2019-02-22

Puteți găsi o listă cu numele tuturor fusurilor orare pe Internet.


3. Obținerea unei date specifice

Pentru a obține un LocalDateobiect care reprezintă o anumită dată, trebuie să utilizați of()metoda statică. Totul aici este, de asemenea, foarte simplu și clar:

LocalDate date = LocalDate.of(2019, Month.FEBRUARY, 22);

Unde dateeste o LocalDatevariabilă și este un apel la metoda statică a clasei.LocalDate.of()of()LocalDate

Aici vedem FEBRUARYconstanta clasei Month(java.time.Month) fiind folosită pentru a specifica luna februarie.

De asemenea, puteți specifica luna în mod vechi - folosind un număr:

LocalDate date = LocalDate.of(2019, 2, 22);

Două? În loc de februarie? Înseamnă asta că lunile sunt din nou numărate de la unu?

Da, la aproape 20 de ani de la crearea Java, lunile au încetat în sfârșit să fie numărate de la zero.

Exemplu:

Cod Ieșire de consolă
LocalDate today = LocalDate.of(2019, 2, 22);
System.out.println("Today = " + today);

Today = 2019-02-22

Obținerea unei date după indexul zilei

Există o altă modalitate interesantă de a crea o dată: folosind ofYearDaymetoda, puteți obține o dată bazată numai pe numărul anului și indexul zilei din an. Iată aspectul general:

LocalDate date = LocalDate.ofYearDay(year, day);

Unde yeareste numărul anului și dayeste indicele zilei din an.

Exemplu:

Cod Ieșire de consolă
LocalDate today = LocalDate.ofYearDay(2019, 100);
System.out.println("Today = " + today);

Today = 2019-04-10

A 100-a zi a anului 2019 este 10 aprilie.

Obținerea unei date Unix

Îți amintești că Dateobiectele au stocat întotdeauna timpul ca număr de milisecunde de la 1 ianuarie 1970? Pentru a se asigura că programatorii nu vor rata vremurile bune, LocalDateclasa a primit o ofEpochDay()metodă, care returnează data calculată de la 1 ianuarie 1970. Iată aspectul general:

LocalDate date = LocalDate.ofEpochDay(day);

Unde dayeste numărul de zile care au trecut de la 1 ianuarie 1970.

Exemplu:

Cod Ieșire de consolă
LocalDate today = LocalDate.ofEpochDay(1);
System.out.println("Today = " + today);

Today = 1970-01-02

4. Obținerea elementelor unei date

Este imposibil să schimbați LocalDateobiecte, dar puteți obține elemente individuale ale datei stocate. LocalDateobiectele au mai multe metode pentru aceasta:

Metodă Descriere
int getYear()
Returnează anul unei anumite date
Month getMonth()
Returnează luna datei: una dintre mai multe constante
JANUARY, FEBRUARY, ...;
int getMonthValue()
Returnează indexul lunii datei. ianuarie == 1.
int getDayOfMonth()
Returnează indexul zilei lunii
int getDayOfYear()
Returnează indexul zilei de la începutul anului
DayOfWeek getDayOfWeek()
Returnează ziua săptămânii: una dintre mai multe constante
MONDAY, TUESDAY, ...;
IsoEra getEra()
Returnează epoca: fie BCE(Înainte de era actuală) și CE(Era actuală)

Exemplu:

Cod Ieșire de consolă
LocalDate today = LocalDate.now();
System.out.println(today.getYear());
System.out.println(today.getMonth());
System.out.println(today.getMonthValue());
System.out.println(today.getDayOfMonth());
System.out.println(today.getDayOfWeek());

2019
FEBRUARY
2
22
FRIDAY

5. Modificarea datei într-un LocalDateobiect

Clasa LocalDateconține mai multe metode care vă permit să lucrați cu datele. Implementarea acestor metode este analogă cu metodele clasei String: ele nu schimbă LocalDateobiectul existent, ci în schimb returnează unul nou cu datele dorite.

Iată metodele clasei LocalDate:

Metodă Descriere
plusDays(int days)
Adaugă un anumit număr de zile la dată
plusWeeks(int weeks)
Adaugă săptămâni la dată
plusMonths(int months)
Adaugă luni la dată
plusYears(int years)
Adaugă ani la dată
minusDays(int days)
Scade zile de la dată
minusWeeks(int weeks)
Scade săptămâni de la dată
minusMonths(int months)
Scăde luni de la dată
minusYears(int years)
Scade ani de la data

Exemplu:

Cod Ieșire de consolă
LocalDate birthday = LocalDate.of(2019, 2, 28);
LocalDate nextBirthday = birthday.plusYears(1);
LocalDate firstBirthday = birthday.minusYears(30);

System.out.println(birthday);
System.out.println(nextBirthday);
System.out.println(firstBirthday);




2019-02-28
2020-02-28
1989-02-28

Metodele birthday objectcărora le numim nu se schimbă. În schimb, metodele sale returnează noi obiecte care conțin datele dorite.