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
PeriodcuLocalTimesauInstant. Perioadele de calendar au sens doar pentru date; pentru ore foloseșteDuration. - 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.