Period în Java

O perioadă de calendar în ani, luni și zile (P1Y2M3D); se adună la date ținând cont de lungimea lunilor.

Sintaxă
import java.time.Period;

static Period ofDays(int zile)
static Period ofMonths(int luni)
static Period of(int ani, int luni, int zile)

Ce face Period

Period exprimă timpul în unități de calendar: ani, luni și zile. Spre deosebire de Duration, o lună nu are un număr fix de zile; adăugarea unei luni la o dată respectă calendarul (31 ianuarie + o lună = 28 februarie).

Se creează cu Period.ofDays(10), ofWeeks(2) (devine 14 zile), ofMonths(3), ofYears(1) sau Period.of(1, 2, 3). toString() folosește formatul ISO: P1Y2M3D = 1 an, 2 luni, 3 zile.

Valorile nu sunt normalizate automat: Period.ofDays(45) rămâne 45 de zile, nu „o lună și 15 zile”. normalized() transformă doar 12 luni în 1 an.

Parametri

Parametru Descriere
zile, luni, ani Numărul de unități. Pot fi negative.

Ce returnează

Un Period.

Exemple

Exemplul 1: Garanție, abonament, concediu

import java.time.LocalDate;
import java.time.Period;

public class Main {
    public static void main(String[] args) {
        LocalDate cumparare = LocalDate.of(2026, 1, 31);
        Period garantie = Period.ofYears(2);
        Period abonament = Period.ofMonths(1);
        Period concediu = Period.ofDays(14);
        System.out.println(garantie + " " + abonament + " " + concediu);
        System.out.println("Garanția expiră:  " + cumparare.plus(garantie));
        System.out.println("Abonamentul expiră: " + cumparare.plus(abonament));
        System.out.println("Concediul se termină: " + cumparare.plus(concediu));
    }
}

Rezultat

P2Y P1M P14D
Garanția expiră:  2028-01-31
Abonamentul expiră: 2026-02-28
Concediul se termină: 2026-02-14

Exemplul 2: Period nu se normalizează singur

import java.time.Period;

public class Main {
    public static void main(String[] args) {
        System.out.println(Period.ofDays(45));
        System.out.println(Period.ofWeeks(3));
        System.out.println(Period.of(0, 14, 0) + " -> " + Period.of(0, 14, 0).normalized());
        System.out.println(Period.of(1, 2, 3).plusDays(10));
        System.out.println(Period.parse("P2Y6M").getMonths());
    }
}

Rezultat

P45D
P21D
P14M -> P1Y2M
P1Y2M13D
6

Greșeli frecvente

  • Folosești Period cu LocalTime sau Instant. Perioadele de calendar au sens doar pentru date; pentru ore folosește Duration.
  • Te aștepți ca Period.ofDays(45).getMonths() să fie 1. Este 0; zilele nu se transformă în luni.

Comenzi înrudite

  • Period.between: Calculează perioada dintre două date în ani, luni și zile; getYears, getMonths, getDays citesc fiecare parte.
  • Duration: O cantitate de timp exactă, în secunde și nanosecunde (1 oră și 30 de minute); se afișează ca PT1H30M.
  • LocalDate.plusMonths: Adaugă un număr de luni; dacă ziua nu există în luna rezultată, se folosește ultima zi a acelei luni.
  • LocalDate.datesUntil: Returnează un Stream cu toate datele de la această dată până la una de sfârșit (fără ea), zi cu zi sau cu un pas.