Ce face LocalDate.datesUntil
start.datesUntil(sfarsit) produce un Stream<LocalDate> cu fiecare zi de la start (inclus) până la sfarsit (exclus). Pe stream poți filtra, număra sau colecta într-o listă.
Cu al doilea parametru, un Period, alegi pasul: Period.ofWeeks(1) dă o dată pe săptămână, Period.ofMonths(1) una pe lună. Dacă vrei să incluzi și ultima zi, dă ca sfârșit sfarsit.plusDays(1).
Parametri
| Parametru | Descriere |
|---|---|
sfarsitExclusiv |
Data la care se oprește; ea nu apare în rezultat. Trebuie să fie după start, altfel aruncă IllegalArgumentException. |
pas |
Opțional. Un Period pozitiv; implicit o zi. |
Ce returnează
Un Stream<LocalDate> ordonat.
Exemple
Exemplul 1: Zilele lucrătoare dintr-o lună
import java.time.DayOfWeek;
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate start = LocalDate.of(2026, 11, 1);
LocalDate sfarsit = start.plusMonths(1); // 1 decembrie, exclus
long lucratoare = start.datesUntil(sfarsit)
.filter(d -> d.getDayOfWeek() != DayOfWeek.SATURDAY && d.getDayOfWeek() != DayOfWeek.SUNDAY)
.count();
System.out.println("Noiembrie 2026 are " + lucratoare + " zile lucrătoare");
}
}
Rezultat
Noiembrie 2026 are 21 zile lucrătoare
Exemplul 2: Ședințe o dată la două săptămâni
import java.time.LocalDate;
import java.time.Period;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<LocalDate> sedinte = LocalDate.of(2026, 10, 5)
.datesUntil(LocalDate.of(2026, 12, 31), Period.ofWeeks(2))
.toList();
sedinte.forEach(d -> System.out.println(d + " " + d.getDayOfWeek()));
}
}
Rezultat
2026-10-05 MONDAY
2026-10-19 MONDAY
2026-11-02 MONDAY
2026-11-16 MONDAY
2026-11-30 MONDAY
2026-12-14 MONDAY
2026-12-28 MONDAY
Exemplul 3: Inclusiv ultima zi
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
LocalDate start = LocalDate.of(2026, 12, 29);
LocalDate sfarsit = LocalDate.of(2027, 1, 2);
System.out.println("Fără sfârșit: " + start.datesUntil(sfarsit).toList());
System.out.println("Cu sfârșit: " + start.datesUntil(sfarsit.plusDays(1)).toList());
}
}
Rezultat
Fără sfârșit: [2026-12-29, 2026-12-30, 2026-12-31, 2027-01-01]
Cu sfârșit: [2026-12-29, 2026-12-30, 2026-12-31, 2027-01-01, 2027-01-02]
Greșeli frecvente
- Te aștepți ca data de sfârșit să apară în rezultat. Este exclusă; adaugă o zi dacă o vrei.
- Dai o dată de sfârșit înaintea startului. Metoda aruncă
IllegalArgumentException.
Comenzi înrudite
LocalDate.plusDays: Returnează o dată nouă mutată cu un număr de zile înainte (plusDays) sau înapoi (minusDays).Period: O perioadă de calendar în ani, luni și zile (P1Y2M3D); se adună la date ținând cont de lungimea lunilor.LocalDate.isBefore: Compară două date: isBefore spune dacă data e mai devreme, isAfter dacă e mai târziu decât cealaltă.