Ce face LocalDate.plusMonths
plusMonths(n) mută data cu n luni, păstrând ziua din lună. 15 martie plus o lună este 15 aprilie.
Când ziua nu există în luna nouă, rezultatul este ultima zi validă: 31 ianuarie plus o lună devine 28 februarie (sau 29 în an bisect). Metoda nu aruncă excepție în acest caz. Atenție: după o asemenea ajustare, ziua „pierdută” nu revine la lunile următoare.
Pentru scădere există minusMonths, iar pentru ani plusYears/minusYears (29 februarie plus un an devine 28 februarie).
Parametri
| Parametru | Descriere |
|---|---|
luni |
Numărul de luni de adunat. Poate fi negativ. |
Ce returnează
Un LocalDate nou.
Exemple
Exemplul 1: Sfârșitul lunii se ajustează
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
System.out.println(LocalDate.of(2026, 3, 15).plusMonths(1));
System.out.println(LocalDate.of(2026, 1, 31).plusMonths(1)); // 2026 nu e bisect
System.out.println(LocalDate.of(2028, 1, 31).plusMonths(1)); // 2028 e bisect
System.out.println(LocalDate.of(2026, 10, 19).plusMonths(-2));
}
}
Rezultat
2026-04-15
2026-02-28
2028-02-29
2026-08-19
Exemplul 2: Rate lunare de la aceeași dată de început
Calculăm fiecare rată pornind de la prima dată (start.plusMonths(i)), nu de la rata anterioară. Așa, după februarie, ziua revine la 31 acolo unde există.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate start = LocalDate.of(2026, 1, 31);
LocalDate dinAproapeInAproape = start;
for (int i = 0; i < 4; i++) {
System.out.println("Rata " + (i + 1) + ": " + start.plusMonths(i)
+ " (pas cu pas: " + dinAproapeInAproape + ")");
dinAproapeInAproape = dinAproapeInAproape.plusMonths(1);
}
}
}
Rezultat
Rata 1: 2026-01-31 (pas cu pas: 2026-01-31)
Rata 2: 2026-02-28 (pas cu pas: 2026-02-28)
Rata 3: 2026-03-31 (pas cu pas: 2026-03-28)
Rata 4: 2026-04-30 (pas cu pas: 2026-04-28)
Greșeli frecvente
- Calculezi date recurente adunând câte o lună la data anterioară. După 28 februarie toate datele rămân pe 28. Pornește mereu de la data inițială:
start.plusMonths(i). - Folosești
plusDays(30)în loc deplusMonths(1). Rezultatul diferă în lunile cu 28, 29 sau 31 de zile.
Comenzi înrudite
LocalDate.plusDays: Returnează o dată nouă mutată cu un număr de zile înainte (plusDays) sau înapoi (minusDays).LocalDate.withDayOfMonth: Returnează o copie a datei cu ziua din lună schimbată; anul și luna rămân aceleași.LocalDate.isLeapYear: isLeapYear spune dacă anul datei este bisect; lengthOfMonth dă numărul de zile din luna datei (28-31).Period: O perioadă de calendar în ani, luni și zile (P1Y2M3D); se adună la date ținând cont de lungimea lunilor.