Научитесь добавлять или вычитать заданное количество рабочих дней к новым классам дат и времени в Java, таким как LocalDate, LocalDateTime и ZonedDateTime. В данном примере также учитывается список праздников.
Подробнее: Добавить или вычесть дни из даты
1. Добавление рабочих дней
Он использует два экземпляра Predicate isHoliday и isWeekend. Мы многократно увеличиваем экземпляр LocalDate на 1 с помощью метода plusDays() и проверяем, удовлетворяет ли новая дата любому из заданных предикатов.
Если новая дата является выходным или праздничным днем, мы не уменьшаем счетчик дней. Если дата является рабочим днем, мы уменьшаем счетчик дней.
Продолжайте добавлять дни, пока счетчик дней не достигнет 0. Как только счетчик достигнет нуля, у нас будет экземпляр LocalDate через N рабочих дней.
Приведенный пример можно использовать также для классов LocalDateTime и ZonedDateTime.
импорт java.time.DayOfWeek;импорт java.time.LocalDate;импорт java.time.temporal.ChronoUnit;импорт java.util.List;импорт java.util.Необязательно;импорт java.util.function.Predicate;импорт java.util.stream.Stream;публичный класс BusinessDaysExamples{public static void main(String[] args){LocalDate сегодня = LocalDate.of(2020, 5, 5);//Добавить один праздник для тестированияСписок<LocalDate> праздники = new ArrayList<>();праздники.добавить(LocalDate.из(2020, 5, 11));праздники.добавить(LocalDate.of(2020, 5, 1));System.out.println(addBusinessDays(today, 8, Optional.empty())); // 2020-05-15System.out.println(addBusinessDays(today, 8, Optional.of(holidays))); // 2020-05-18}частный статический LocalDate addBusinessDays(LocalDate localDate, int days,Необязательно<Список<МестнаяДата>> праздники){если(localDate == null || дни праздники.isPresent() ? праздники.get().contains(дата) : false;Предикат<LocalDate> isWeekend = дата-> date.getDayOfWeek() == DayOfWeek.SUTURDAY|| date.getDayOfWeek() == DayOfWeek.SUNDAY;Локальная дата результат = локальная дата;пока(дни > 0) {результат = результат.plusDays(1);если(isHoliday.or(isWeekend).negate().test(result)) {дней--;}}вернуть результат;}}
2. Вычитание рабочих дней
Чтобы вычесть рабочие дни, мы должны следовать точной логике, написанной выше. За исключением того, что мы будем уменьшать экземпляр LocalDate на 1, используя метод minusDays(), каждый раз.
импорт java.time.DayOfWeek;импорт java.time.LocalDate;импорт java.time.temporal.ChronoUnit;импорт java.util.List;импорт java.util.Необязательно;импорт java.util.function.Predicate;импорт java.util.stream.Stream;публичный класс BusinessDaysExamples{public static void main(String[] args){LocalDate сегодня = LocalDate.of(2020, 5, 5);//Добавить один праздник для тестированияСписок<LocalDate> праздники = new ArrayList<>();праздники.добавить(LocalDate.из(2020, 5, 11));праздники.добавить(LocalDate.of(2020, 5, 1));System.out.println(subtractBusinessDays(today, 8, Optional.empty())); // 2020-04-22System.out.println(subtractBusinessDays(сегодня, 8, Optional.of(праздники))); // 2020-04-21}частный статический LocalDate вычитаниеBusinessDays(LocalDate localDate, int дней,Необязательно<Список<МестнаяДата>> праздники){если(localDate == null || дни праздники.isPresent() ? праздники.get().contains(дата) : false;Предикат<LocalDate> isWeekend =дата -> дата.получитьДеньНедели() == ДеньНедели.СУББОТА|| date.getDayOfWeek() == DayOfWeek.SUNDAY;Локальная дата результат = локальная дата;пока(дни >= 0) {результат = результат.минусДни(1);если(isHoliday.or(isWeekend).negate().test(result)) {дней--;}}вернуть результат;}}
Напишите мне ваши вопросы, связанные с добавлением или вычитанием рабочих дней в Java.