From 82fd2d9fcc706f4b2fc9b40139ecd37cbc64529c Mon Sep 17 00:00:00 2001 From: vatsalgosar Date: Thu, 7 Nov 2019 22:53:51 +0530 Subject: [PATCH 1/2] BAEL-3401 - Implementation for adding days skipping weekends in LocalDate object in Java 8 --- .../AddSubtractDaysSkippingWeekendsUtils.java | 21 +++++++++++++++ ...ractDaysSkippingWeekendsUtilsUnitTest.java | 27 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java create mode 100644 core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java new file mode 100644 index 0000000000..c54a7823f3 --- /dev/null +++ b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java @@ -0,0 +1,21 @@ +package com.baeldung.datetime; + +import java.time.DayOfWeek; +import java.time.LocalDate; + +public class AddSubtractDaysSkippingWeekendsUtils { + + public static LocalDate addSubtractDaysSkippingWeekendsIterativeMethod(LocalDate date, int days) { + LocalDate result = date; + int addedDays = 0; + int absDays = Math.abs(days); + int day = (days > 0) ? 1 : -1; + while (addedDays < absDays) { + result = result.plusDays(day); + if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) { + ++addedDays; + } + } + return result; + } +} diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java new file mode 100644 index 0000000000..2c8320f035 --- /dev/null +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.datetime; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import java.time.LocalDate; + +public class AddSubtractDaysSkippingWeekendsUtilsUnitTest { + + @Test + public void givenLocalDateAndDaysToAdd_thenAddDaysSkippingWeekendsUsingIterativeMethod() { + LocalDate initialDate = LocalDate.of(2019, 11, 7); + LocalDate expectedDate = LocalDate.of(2019, 11, 13); + LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addSubtractDaysSkippingWeekendsIterativeMethod(initialDate, 4); + assertEquals(expectedDate, result); + } + + @Test + public void givenLocalDateAndDaysToAdd_thenSubtractDaysSkippingWeekendsUsingIterativeMethod() { + LocalDate initialDate = LocalDate.of(2019, 11, 7); + LocalDate expectedDate = LocalDate.of(2019, 11, 1); + LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addSubtractDaysSkippingWeekendsIterativeMethod(initialDate, -4); + assertEquals(expectedDate, result); + } + +} From c3ad62609cec99df286357b2eca5eb6b56f04bf4 Mon Sep 17 00:00:00 2001 From: vatsalgosar Date: Sat, 9 Nov 2019 02:33:50 +0530 Subject: [PATCH 2/2] - Separated add and subtract days into two methods for simplification --- .../AddSubtractDaysSkippingWeekendsUtils.java | 20 ++++++++++++++----- ...ractDaysSkippingWeekendsUtilsUnitTest.java | 8 ++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java index c54a7823f3..bf32fdb79a 100644 --- a/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java +++ b/core-java-modules/core-java-date-operations/src/main/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtils.java @@ -5,17 +5,27 @@ import java.time.LocalDate; public class AddSubtractDaysSkippingWeekendsUtils { - public static LocalDate addSubtractDaysSkippingWeekendsIterativeMethod(LocalDate date, int days) { + public static LocalDate addDaysSkippingWeekends(LocalDate date, int days) { LocalDate result = date; int addedDays = 0; - int absDays = Math.abs(days); - int day = (days > 0) ? 1 : -1; - while (addedDays < absDays) { - result = result.plusDays(day); + while (addedDays < days) { + result = result.plusDays(1); if (!(result.getDayOfWeek() == DayOfWeek.SATURDAY || result.getDayOfWeek() == DayOfWeek.SUNDAY)) { ++addedDays; } } return result; } + + 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; + } } diff --git a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java index 2c8320f035..d60a0f4015 100644 --- a/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java +++ b/core-java-modules/core-java-date-operations/src/test/java/com/baeldung/datetime/AddSubtractDaysSkippingWeekendsUtilsUnitTest.java @@ -9,18 +9,18 @@ import java.time.LocalDate; public class AddSubtractDaysSkippingWeekendsUtilsUnitTest { @Test - public void givenLocalDateAndDaysToAdd_thenAddDaysSkippingWeekendsUsingIterativeMethod() { + public void givenLocalDateAndDaysToAdd_thenAddDaysSkippingWeekends() { LocalDate initialDate = LocalDate.of(2019, 11, 7); LocalDate expectedDate = LocalDate.of(2019, 11, 13); - LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addSubtractDaysSkippingWeekendsIterativeMethod(initialDate, 4); + LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addDaysSkippingWeekends(initialDate, 4); assertEquals(expectedDate, result); } @Test - public void givenLocalDateAndDaysToAdd_thenSubtractDaysSkippingWeekendsUsingIterativeMethod() { + public void givenLocalDateAndDaysToSubtract_thenSubtractDaysSkippingWeekends() { LocalDate initialDate = LocalDate.of(2019, 11, 7); LocalDate expectedDate = LocalDate.of(2019, 11, 1); - LocalDate result = AddSubtractDaysSkippingWeekendsUtils.addSubtractDaysSkippingWeekendsIterativeMethod(initialDate, -4); + LocalDate result = AddSubtractDaysSkippingWeekendsUtils.subtractDaysSkippingWeekends(initialDate, 4); assertEquals(expectedDate, result); }