Se afișează postările cu eticheta Period. Afișați toate postările
Se afișează postările cu eticheta Period. Afișați toate postările

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ă!
❤️

marți, 27 ianuarie 2026

Prelucrarea datelor calendaristice - Set de probleme

La rezolvarea acestor probleme explorați mai întâi materialul teoretic https://musteatadidactic.blogspot.com/2026/01/prelucrarea-datelor-calendaristice-in.html

1. Un club de noapte dorește să verifice dacă persoanele care vin au vârsta legală pentru acces, astfel încât să respecte reglementările. Utilizatorul va introduce data sa de naștere, iar programul va calcula vârsta acestuia în ani. Pe baza acestei informații, programul va afișa vârsta și dacă persoana are dreptul să intre în club. Dacă persoana are cel puțin 18 ani va afișa mesajul „Acces permis”, iar dacă are sub 18 ani va afișa „Acces interzis”.

2. Un magazin online oferă reduceri personalizate clienților în funcție de vârsta lor. Utilizatorul introduce data nașterii, iar programul va calcula vârsta și va afișa un mesaj care să indice categoria promoțională în care se încadrează. Sunt disponibile următoarele categorii:
- tânăr adult, 18–25 ani
- adult, 26–60 ani
- senior, peste 60 ani.
În plus, programul va afișa suma exactă a reducerii pe care clientul o primește: tinerii adulți primesc o reducere de 50 lei, adulții primesc o reducere de 30 lei, iar seniorii beneficiază de o reducere de 70 lei. Astfel, pe lângă clasificarea pe grupe de vârstă, clientul va vedea costul obișnuit al abonamentului, valoarea concretă a reducerii aplicate la achiziție și prețul final de plată.

3. Un magazin online lansează o promoție pentru produsele sale. Utilizatorul va introduce data curentă, iar programul trebuie să calculeze câți ani, luni și zile au trecut de la data lansării promoției până în prezent și, în același timp, câte luni și zile mai rămân până la data finalizării promoției. Programul va afișa aceste informații într-un mesaj clar, astfel încât să se poată vedea atât durata deja parcursă, cât și timpul rămas pentru a beneficia de promoție.

4. O companie dorește să calculeze stagiul profesional al angajaților. Utilizatorul va introduce data angajării, iar programul trebuie să determine câți ani, luni și zile au trecut de la data angajării până la data curentă. Programul va afișa aceste informații într-un mesaj clar, astfel încât angajatul și departamentul de resurse umane să poată vedea durata exactă a stagiului profesional.

5. O bancă emite carduri care au valabilitate de 5 ani de la data emiterii. Creează un program Java în care să definești o clasă CardClient care să conțină informații despre numele clientului (String) și data emiterii cardului (LocalDate). În cadrul clasei, creează o metodă care să calculeze și să afișeze dacă cardul este încă valabil sau a expirat. În metoda main(), folosește un ArrayList pentru a stoca a cel puțin 10 clienți, apoi parcurge lista și afișează pentru fiecare client mesajul corespunzător: „Card valabil” dacă nu au trecut încă 5 ani de la emitere și „Card expirat” dacă perioada de 5 ani s-a încheiat. Datele despre clienți se vor introduce de la tastatură.

6. Un serviciu de garanții pentru produse electronice dorește să verifice dacă produsele se află încă în perioada de garanție. Utilizatorul va introduce data procurării produsului, termenul de garanție în luni și data curentă, iar programul va calcula dacă produsul este încă acoperit de garanție sau dacă aceasta a expirat, afișând un mesaj clar corespunzător fiecărui produs: „Garanție valabilă” urmat de termenul care mai este până la expirarea garanției și „Garanție expirată” dacă termenul a trecut.

Vă invit să postați în comentarii capturi de ecran care demonstrează rularea aplicațiilor pe care le-ați programat!