Как сформировать список дат с учетом месяца startDate и endDate, когда они попадают в другой месяц? - PullRequest
0 голосов
/ 01 февраля 2019

Предполагая, что у меня есть startDate, endDate, currentDate

1. Я хочу игнорировать случай, когда startDate и endDate выходят за пределы currentDate месяца.

2. Если startDate и currentDate имеют один и тот же месяц, но endDate имеет месяц, превышающий currentDate, то создайте список от startDate до конечного дня месяца startDate s.

3. Если endDate соответствует месяцу с currentDate, а startDate меньше currentDate месяца, то создайте список между endDate и первым днем ​​currentDate

Мне нужна помощь с методом, чтобы справиться с этим.

Спасибо

1 Ответ

0 голосов
/ 01 февраля 2019

Сначала давайте создадим метод, который создает последовательность дат с заданной датой начала и окончания.Этот метод использует plusDays в LocalDate для генерации дат в цикле while.

public static List<LocalDate> makeDateInterval(LocalDate startDate, LocalDate endDate) {
    List<LocalDate> list = new ArrayList<>();
    if (startDate.isAfter(endDate)) {
        return list;
    }
    LocalDate nextDate = startDate;

    while (nextDate.isBefore(endDate)) {
        list.add(nextDate);
        nextDate = nextDate.plusDays(1);
    }
    list.add(endDate);
    return list;
}

Чтобы разобраться, что такое даты начала и окончания, нам нужна простая логика для сравнения месяцев с указанными датами, и если у нас есть допустимый интервал, мы вызываем вышеуказанный метод

public static List<LocalDate> buildDateRange(LocalDate startDate, LocalDate endDate, LocalDate currentDate) {
    LocalDate firstDate = null;
    LocalDate secondDate = null;

    if (startDate.getMonth() == currentDate.getMonth()) {
        firstDate = startDate;
        secondDate = currentDate;
    }

    if (endDate.getMonth() == currentDate.getMonth()) {
        secondDate = endDate;
        if (firstDate == null) {
            firstDate = currentDate;
        }
    }

    if (firstDate == null || secondDate == null) {
        return new ArrayList<>(); //No valid interval, return empty list
    }

    return makeDateInterval(firstDate, secondDate);
}

Простой тест сегодня 1 февраля

public static void main(String[] args) {
   LocalDate now = LocalDate.now();
   LocalDate start = now.minusDays(5);
   LocalDate end = now.plusDays(5);

   System.out.println("Now: " + now + ", start: " + start + ", end: " +end);
   List<LocalDate> list = buildDateRange(start, end, now);

   for (LocalDate d : list) {
       System.out.println(d);
   }
}

генерирует следующий вывод

Сейчас: 2019-02-01, начало: 2019-01-27, конец: 2019-02-06
2019-02-01
2019-02-02
2019-02-03
2019-02-04
2019-02-05
2019-02-06

...