vineri, 30 ianuarie 2026

Prelucrarea datelor calendaristice în Java

Majoritatea soft-urilor lucrează cu datele calendaristice, într-o formă sau alta, toate prelucrează informații legate de timp. Fie că programăm întâlniri, calculăm vârsta unei persoane, gestionăm termene limită sau organizăm orare și programări, toate aceste acțiuni depind de o manipulare corectă a datelor și orelor. Din acest motiv, înțelegerea modului de lucru cu datele calendaristice este o competență practică obligatorie în programare.

Până nu demult, limbajul Java folosea clasele Date și Calendar, care erau destul de greoaie. Astăzi, folosim pachetul java.time:

import java.time.*;

Acesta funcționează ca un ceas digital inteligent: este precis, imutabil și ușor de citit. 
Cele mai utilizate clase din pachetul discutat:
1.LocalDate - Reprezintă o dată calendaristică fără oră în format: an, lună, zi. Se folosește pentru situații precum data nașterii, zile de sărbătoare sau termene limită.
2.LocalTime - Reprezintă o oră fără dată în format: ore, minute, secunde. Este utilă pentru ore de curs sau intervale orare.
3.LocalDateTime - Combină data și ora într-un singur obiect. Se utilizează atunci când avem nevoie de momentul exact al unui eveniment cum ar fi e exemplu o întâlnire programată.
4.Period - Reprezintă diferența dintre două date în format: ani, luni și zile. Este foarte util pentru calculul vârstei sau al duratei dintre două momente.
5.DateTimeFormatter - Este folosit pentru a transforma datele în format ușor de citit sau personalizat,  cum ar fi de exemplu, în loc de 2026-03-21, formatul standard de afișare a datei în Javasă afișeze 21/03/2026.
După ce am înțeles rolul fiecărei clase și la ce se utilizează, următorul pas, evident este să vedem cum se aplică aceste clase în practică, prin exemple simple și deja rezolvate, care ne vor ajuta să le folosim corect în programe reale.

Exemplul 1. Extragerea datei curente din sistem.

import java.time.*;
public class Main{
 public static void main(String[] args) {
  LocalDate azi = LocalDate.now();
  System.out.println(azi);
}}

Exemplul 2. Crearea explicită a unei date calendaristice.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalDate data = LocalDate.of(2025, 3, 21);
System.out.println(data);
}}
Exemplul 3. Accesarea elementelor unei date calendaristice.
import java.time.*;
public class Main{
    public static void main(String[] args) {
        LocalDate data = LocalDate.of(2025, 3, 21);
        System.out.println("Data: " + data);
        System.out.println("Anul: " + data.getYear());
        System.out.println("Luna: " + data.getMonth()+ ", luna nr. "+data.getMonthValue());
        System.out.println("Ziua: " + data.getDayOfMonth());
        System.out.println("Denumirea zilei: "+data.getDayOfWeek());
        System.out.println("A " + data.getDayOfYear()+" zi a anului");
        System.out.println("Este an bisect: " + (data.isLeapYear()?"Da":"Nu"));
    }}
Exemplul 4. Modificarea unei date calendaristice. Menționez că clasele din pachetul java.time sunt imutabile, ceea ce înseamnă ă Java NU modifică obiectul original, ci creează unul nou.
import java.time.*;
public class Main{
public static void main(String[] args) {
  LocalDate azi = LocalDate.now();
  LocalDate maine = azi.plusDays(1);
  LocalDate lunaViitoare = azi.plusMonths(1);
  LocalDate anulTrecut = azi.minusYears(1);
  LocalDate ieri = azi.minusDays(1);
  System.out.println("Data: " + azi);
  System.out.println("Mâine: " + maine);
  System.out.println("Ieri: " + ieri);
  System.out.println("Luna viitoare: " + lunaViitoare);
  System.out.println("Anul trecut: " + anulTrecut);
  System.out.println("Data: " + azi);
}}

Exemplul 5. Compararea a două date calendaristice.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalDate azi = LocalDate.now();
LocalDate data = LocalDate.of(2025,3,31);
if (azi.isAfter(data)) {
System.out.println("Azi este după data dată");
}
if (azi.isBefore(data)) {
System.out.println("Azi este înainte");
}
}}
Exemplul 6. Calcularea diferenței între două date calendaristice.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalDate inceput = LocalDate.of(2020, 1, 1);
LocalDate sfirsit = LocalDate.now();
Period diferenta = Period.between(inceput, sfirsit);
System.out.println("Diferența între anii " + inceput + " și "+sfirsit);
System.out.println(diferenta.getYears() + " ani");
System.out.println(diferenta.getMonths() + " luni");
System.out.println(diferenta.getDays() + " zile");
}}
Exemplul 7. Extragerea orei actuale conform sistemului de operare.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalTime ora = LocalTime.now();
System.out.println(ora);
System.out.println(ora.withNano(0));
}}
Exemplul 8. Instanțierea unei ore explicit.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalTime oraFixa = LocalTime.of(14, 30);
System.out.println(oraFixa);
}}

Exemplul 9. Instanțierea datei și a orei.
import java.time.*;
public class Main{
public static void main(String[] args) {
LocalDateTime acum = LocalDateTime.now();
System.out.println(acum);
}}

Formatul afișat la execuție nu ar trebui să vă sperie. Este deoarece clasa
LocaleDateTime respectă formatul standard ISO care este format din părțile
data (an-lună-zi) - 2026-03-21
separator între dată și oră - T 
ora (ore:minute:secunde + nanosecunde) - 16:57:10.917791600 
Acest format tehnic destinat prelucrării de către calculator și nu este intuitiv pentru oameni. De aceea, este important să ne focusăm pe formatarea datelor într-un mod clar și accesibil, astfel încât informația să fie ușor de înțeles pentru utilizatorii aplicației noastre.

Exemplul 10. Formatarea datei și a orei.
import java.time.*;
import java.time.format.DateTimeFormatter;
public class Main {
    public static void main(String[] args) {
        LocalDateTime acum = LocalDateTime.now();
        // Formatam doar data
        DateTimeFormatter formatData = DateTimeFormatter.ofPattern("dd.MM.yyyy");
        String dataFormatata = acum.format(formatData);
        System.out.println("Data: " + dataFormatata);
        // Formatam ora
        DateTimeFormatter formatOra = DateTimeFormatter.ofPattern("HH:mm:ss");
        String oraFormatata = acum.format(formatOra);
        System.out.println("Ora: " + oraFormatata);
        // Formatam si data si ora
        DateTimeFormatter formatComplet = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
        String complet = acum.format(formatComplet);
        System.out.println("Data și ora completă: " + complet);
}}
Până aici am văzut cum operăm cu datele calendarstice, dar ca acestea să apară în limba română sau în oricare alta, trebuie să folosim Locale, care ne ajută să traducem lunile și zilele săptămânii. Pentru aceasta trebuie să reținem faptul că: 
LocalDate este folosită pentru a stoca zilele calendaristice.
Locale este clasa care indică limba și țara pe care vrem să o folosim la afișarea datelor, cum ar fi de exemplu, Locale("ro") pentru română.
DateTimeFormatter este clasa care transformă data în text și, împreună cu Locale, permite ca luna și ziua săptămânii să apară în limba dorită.

Exemplul 11. Formatarea datei și a orei. Afișarea datei calendaristice în limba română.
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
Locale romania = new Locale("ro");
LocalDate data = LocalDate.now();
System.out.println("\u001B[31m================================================\u001B[0m");
DateTimeFormatter formatLuna = DateTimeFormatter.ofPattern("MMMM", romania);
DateTimeFormatter formatZi = DateTimeFormatter.ofPattern("EEEE", romania);
System.out.println("Luna: " + data.format(formatLuna));
System.out.println("Ziua săptămânii: " + data.format(formatZi));
System.out.println("\u001B[31m================================================\u001B[0m");
DateTimeFormatter formatComplet = DateTimeFormatter.ofPattern("EEEE, dd MMMM yyyy", new Locale("ro"));
System.out.println("Data completă: " + data.format(formatComplet));
}}
Exemplul 12. Citirea datei calendaristice de la tastatură. Funcționează doar dacă formatul este strict respectat.
import java.time.LocalDate;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Introduceți data (format: an-luna-zi): ");
String input = sc.nextLine();
LocalDate data = LocalDate.parse(input);
System.out.println("Data introdusă: " + data);
}}
Exemplul 13. Citirea datei calendaristice de la tastatură. De fapt, vom citi trei valori întregi, după care vom crea o dată calendaristică.
import java.time.LocalDate;
import java.util.Scanner;
class Virsta {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Introduceți ziua nașterii: ");
int zi = scanner.nextInt();
System.out.print("Introduceți luna nașterii: ");
int luna = scanner.nextInt();
System.out.print("Introduceți anul nașterii: ");
int an = scanner.nextInt();
LocalDate dataNasterii = LocalDate.of(an, luna, zi);
System.out.println("Data: " +dataNasterii);
scanner.close();
}}
În aplicațiile reale, data nu este introdusă la întâmplare, ci este preluată dintr-o componentă specială, cum ar fi spre exemplu, un calendar sau un DatePicker. În fond, Java nu poate ghici în ce format introduce utilizatorul data, de aceea este responsabilitatea noastră să specificăm clar formatul fie prin mesaje speciale, fie  prin utilizarea componentelor dedicate care elimină eventualele erori de format.

Cam atât pentru această lecție. Dacă această temă v-a activat curiozitatea vă invit să cercetați documentația oficială Java oferă explicații detaliate despre clasa DateTimeFormatter și despre întreg pachetul java.time, unde sunt prezentate toate clasele și metodele disponibile pentru lucrul cu date și ore.
Să aveți o zi deosebită!
❤️

Niciun comentariu:

Trimiteți un comentariu

Vă mulțumesc pentru feedback!