LocalDate.datesUntil în Java

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.

Sintaxă
Stream<LocalDate> datesUntil(LocalDate sfarsitExclusiv)
Stream<LocalDate> datesUntil(LocalDate sfarsitExclusiv, Period pas)

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ă.