Как отобразить все понедельники между двумя датами? - PullRequest
1 голос
/ 11 июля 2020

Я пытаюсь отобразить все понедельники между двумя датами, но понятия не имею, как это сделать. Я хочу попросить пользователя ввести две даты с помощью сканера, чтобы выводить все понедельники.

    String s = "2020-07-20";
    String e = "2020-09-20";
    LocalDate start = LocalDate.parse(s);
    LocalDate end = LocalDate.parse(e);
    List<LocalDate> totalDates = new ArrayList<>();

    while (!start.isAfter(end)) {
        totalDates.add(start);
        start = start.plusDays(1);

    }

Ответы [ 3 ]

3 голосов
/ 11 июля 2020

Чтобы получить первый понедельник, используйте:

LocalDate monday = start.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));

Теперь вам нужно иметь дело с крайним случаем: что, если нет понедельника между start и end? Это будет означать, что вычисленный здесь понедельник наступает после end:

if (monday.isAfter(end)) {
    totalDates = List.of();
}

После этого вы можете получить последовательность понедельников с помощью удобного метода datesUntil:

totalDates = monday.datesUntil(end, Period.ofWeeks(1)).collect(Collectors.toList());

Обратите внимание, что datesUntil не включает дату окончания. Если вам нужно указать дату окончания, укажите end.plusDays(1).

2 голосов
/ 11 июля 2020

Вы можете использовать .getDayOfWeek(), чтобы получить DayOfWeek и сравнить с DayOfWeek.MONDAY

while (!start.isAfter(end)) {
    if(start.getDayOfWeek().equals(DayOfWeek.MONDAY)) {
        totalDates.add(start);
    }
    start = start.plusDays(1);
}

А для оптимизации используйте start.plusWeeks(1) вместо start.plusDays(1), и вам нужно получить следующий понедельник раньше .

start = start.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
while (!start.isAfter(end)) {
    if(start.getDayOfWeek().equals(DayOfWeek.MONDAY)) {
        totalDates.add(start);
    }
    start = start.plusWeeks(1);
}
1 голос
/ 11 июля 2020

Вам нужно использовать getDayOfWeek(), вот решение:

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class AllMondays {
    public static void main(String[] args) {
        String s = "2020-07-20";
        String e = "2020-09-20";
        LocalDate start = LocalDate.parse(s);
        LocalDate end = LocalDate.parse(e);
        List<LocalDate> totalDates = new ArrayList<>();

        LocalDate nextMonday = start;
        int daysToAdvance = 1;
        while (!nextMonday.isAfter(end)) {
            if (nextMonday.getDayOfWeek() == DayOfWeek.MONDAY) {
                daysToAdvance = 7;
                totalDates.add(nextMonday);
            }
            nextMonday = nextMonday.plusDays(daysToAdvance);
        }
        System.out.println(totalDates);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...