«1. Обзор

В этом руководстве мы кратко рассмотрим алгоритм пропуска выходных при добавлении дней к экземпляру LocalDate в Java 8.

Мы также рассмотрим алгоритм вычитания дней из объекта LocalDate при пропуске выходные.

2. Добавление дней

В этом методе мы продолжаем добавлять один день к объекту LocalDate, пока не добавим необходимое количество дней. При добавлении дня мы проверяем, является ли день нового экземпляра LocalDate субботой или воскресеньем.

Если проверка возвращает true, то мы не увеличиваем счетчик на количество дней, добавленных до этого момента. Однако, если текущий день является будним, мы увеличиваем значение счетчика.

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

public static LocalDate addDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int addedDays = 0;
    while (addedDays < days) {
        result = result.plusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++addedDays;
        }
    }
    return result;
}

В приведенном выше коде мы используем метод plusDays() объекта LocalDate чтобы добавить дни к объекту результата. Мы увеличиваем переменную addDays только тогда, когда день является будним. Когда переменная addDays равна переменной days, мы прекращаем добавлять день в результирующий объект LocalDate.

3. Вычитание дней

Точно так же мы можем вычитать дни из объекта LocalDate, используя метод minusDays(), пока мы не вычтем требуемое количество дней.

Для этого мы будем хранить счетчик количества вычтенных дней, который увеличивается только тогда, когда результирующий день является рабочим днем:

public static LocalDate subtractDaysSkippingWeekends(LocalDate date, int days) {
    LocalDate result = date;
    int subtractedDays = 0;
    while (subtractedDays < days) {
        result = result.minusDays(1);
        if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) {
            ++subtractedDays;
        }
    }
    return result;
}

Из приведенной выше реализации мы видим, что значение subtractedDays только увеличивается когда результирующий объект LocalDate является днем ​​недели. Используя цикл while, мы вычитаем дни до тех пор, пока значение subtractedDays не станет равным переменной days.

4. Заключение

В этой небольшой статье мы рассмотрели алгоритмы добавления дней к объекту LocalDate и вычитания дней из него, пропуская выходные. Кроме того, мы рассмотрели их реализации на Java.

Как всегда, полный исходный код рабочих примеров доступен на GitHub.