Ce face LocalDate.withDayOfMonth
withDayOfMonth(1) dă prima zi a lunii datei. Este des folosită pentru rapoarte lunare: „de la 1 până azi”. Ultima zi a lunii se obține cu withDayOfMonth(d.lengthOfMonth()).
Spre deosebire de plusMonths, metoda nu ajustează singură: withDayOfMonth(31) pe o dată din aprilie aruncă DateTimeException. Metode asemănătoare: withMonth, withYear, withDayOfYear.
Pentru calcule mai complexe („prima luni din lună”, „ultima zi a anului”) există d.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)) din java.time.temporal.
Parametri
| Parametru | Descriere |
|---|---|
zi |
Noua zi din lună, între 1 și numărul de zile al lunii. |
Ce returnează
Un LocalDate nou. Aruncă DateTimeException dacă ziua nu există în acea lună.
Exemple
Exemplul 1: Prima și ultima zi a lunii
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate azi = LocalDate.of(2026, 2, 17);
LocalDate prima = azi.withDayOfMonth(1);
LocalDate ultima = azi.withDayOfMonth(azi.lengthOfMonth());
System.out.println("Raport de la " + prima + " până la " + azi);
System.out.println("Luna se termină pe " + ultima);
System.out.println("Salariul vine pe " + azi.withDayOfMonth(10));
}
}
Rezultat
Raport de la 2026-02-01 până la 2026-02-17
Luna se termină pe 2026-02-28
Salariul vine pe 2026-02-10
Exemplul 2: Ziua nu există în lună
import java.time.DateTimeException;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate aprilie = LocalDate.of(2026, 4, 5);
try {
System.out.println(aprilie.withDayOfMonth(31));
} catch (DateTimeException e) {
System.out.println("Eroare: " + e.getMessage());
}
// Sigur: limitează ziua la lungimea lunii
int zi = Math.min(31, aprilie.lengthOfMonth());
System.out.println("Ultima zi validă: " + aprilie.withDayOfMonth(zi));
}
}
Rezultat
Eroare: Invalid date 'APRIL 31'
Ultima zi validă: 2026-04-30
Exemplul 3: Prima zi de luni din lună cu TemporalAdjusters
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
public class Main {
public static void main(String[] args) {
LocalDate d = LocalDate.of(2026, 11, 20);
System.out.println("Prima luni: " + d.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)));
System.out.println("Ultima vineri: " + d.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)));
System.out.println("Ultima zi din an: " + d.with(TemporalAdjusters.lastDayOfYear()));
}
}
Rezultat
Prima luni: 2026-11-02
Ultima vineri: 2026-11-27
Ultima zi din an: 2026-12-31
Greșeli frecvente
- Folosești
withDayOfMonth(31)pentru „ultima zi a lunii”. În lunile cu 30 de zile aruncă excepție; foloseștelengthOfMonth()sauTemporalAdjusters.lastDayOfMonth(). - Uiți că metoda returnează o dată nouă și nu salvezi rezultatul.
Comenzi înrudite
LocalDate.isLeapYear: isLeapYear spune dacă anul datei este bisect; lengthOfMonth dă numărul de zile din luna datei (28-31).LocalDate.plusMonths: Adaugă un număr de luni; dacă ziua nu există în luna rezultată, se folosește ultima zi a acelei luni.LocalDate.getDayOfWeek: Returnează ziua săptămânii pentru dată, ca valoare a enumerării DayOfWeek (MONDAY … SUNDAY).LocalDate: Clasa pentru o dată calendaristică fără oră și fără fus orar: an, lună, zi. Obiectele ei nu se pot modifica.