From 9231d3611c278dd742a12e8181975d86f8446c6f Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 15 Jan 2024 14:35:18 +0000 Subject: [PATCH 1/3] BAEL-7382 Add code for calculating weekdays between two dates --- .../core-java-date-operations-4/README.md | 6 ++ .../core-java-date-operations-4/pom.xml | 45 ++++++++++ .../calculateweekdays/CalculateWeekdays.java | 46 ++++++++++ .../CalculateWeekdaysUnitTest.java | 83 +++++++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 core-java-modules/core-java-date-operations-4/README.md create mode 100644 core-java-modules/core-java-date-operations-4/pom.xml create mode 100644 core-java-modules/core-java-date-operations-4/src/main/java/com/baeldung/calculateweekdays/CalculateWeekdays.java create mode 100644 core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java diff --git a/core-java-modules/core-java-date-operations-4/README.md b/core-java-modules/core-java-date-operations-4/README.md new file mode 100644 index 0000000000..e023a5ca53 --- /dev/null +++ b/core-java-modules/core-java-date-operations-4/README.md @@ -0,0 +1,6 @@ +## Core Date Operations (Part 4) +This module contains articles about date operations in Java. + +### Relevant Articles: + + diff --git a/core-java-modules/core-java-date-operations-4/pom.xml b/core-java-modules/core-java-date-operations-4/pom.xml new file mode 100644 index 0000000000..5153b4b354 --- /dev/null +++ b/core-java-modules/core-java-date-operations-4/pom.xml @@ -0,0 +1,45 @@ + + + 4.0.0 + core-java-date-operations-4 + core-java-date-operations-4 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 11 + 11 + + + + + jar + + + com.baeldung.core-java-modules + core-java-modules + 0.0.1-SNAPSHOT + + + + + joda-time + joda-time + ${joda-time.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + 2.12.5 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-date-operations-4/src/main/java/com/baeldung/calculateweekdays/CalculateWeekdays.java b/core-java-modules/core-java-date-operations-4/src/main/java/com/baeldung/calculateweekdays/CalculateWeekdays.java new file mode 100644 index 0000000000..ded8f9bc13 --- /dev/null +++ b/core-java-modules/core-java-date-operations-4/src/main/java/com/baeldung/calculateweekdays/CalculateWeekdays.java @@ -0,0 +1,46 @@ +package com.baeldung.calculateweekdays; + +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalAdjusters; +import java.util.Arrays; + +public class CalculateWeekdays { + + public long getWorkingDaysWithStream(LocalDate start, LocalDate end){ + return start.datesUntil(end) + .map(LocalDate::getDayOfWeek) + .filter(day -> !Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY).contains(day)) + .count(); + } + + public long getWorkingDaysWithoutStream(LocalDate start, LocalDate end) { + boolean startOnWeekend = false; + + // If starting at the weekend, move to following Monday + if(start.getDayOfWeek().getValue() > 5){ + start = start.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); + startOnWeekend = true; + } + boolean endOnWeekend = false; + // If ending at the weekend, move to previous Friday + if(end.getDayOfWeek().getValue() > 5){ + end = end.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY)); + endOnWeekend = true; + } + // Cover case where starting on Saturday and ending following Sunday + if(start.isAfter(end)){ + return 0; + } + // Get total weeks + long weeks = ChronoUnit.WEEKS.between(start, end); + + long addValue = startOnWeekend || endOnWeekend ? 1 : 0; + + // Add on days that did not make up a full week + return ( weeks * 5 ) + ( end.getDayOfWeek().getValue() - start.getDayOfWeek().getValue() ) + addValue; + } + + +} diff --git a/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java b/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java new file mode 100644 index 0000000000..4a14b6bb99 --- /dev/null +++ b/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.calculateweekdays; + +import static junit.framework.TestCase.assertEquals; + +import java.time.LocalDate; + +import org.junit.Test; + +public class CalculateWeekdaysUnitTest { + + // Start Saturday end following Sunday (answer is 0) + LocalDate startTomorrow = LocalDate.of(2023, 12, 2); + LocalDate endTomorrow = LocalDate.of(2023, 12, 3); + + // Three week gap with midweek start and finish (answer is 17) + LocalDate startThreeWeeks = LocalDate.of(2023, 11, 28); + LocalDate endThreeWeeks = LocalDate.of(2023, 12, 21); + + // Three week gap with midweek start and weekend finish (answer is 17) + LocalDate startThreeWeeks2 = LocalDate.of(2023, 11, 6); + LocalDate endThreeWeeks2 = LocalDate.of(2023, 12, 30); + + // Week gap start and end on weekend (answer is 40) + LocalDate startThreeWeeksWeekend = LocalDate.of(2023, 12, 2); + LocalDate endThreeWeeksWeekend = LocalDate.of(2023, 12, 9); + + @Test + public void givenTwoDaysOnSameWeekend_whenUsingStreams_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithStream(startTomorrow, endTomorrow); + assertEquals(0, result); + } + + @Test + public void givenTwoDaysOnSameWeekend_whenUsingMaths_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithoutStream(startTomorrow, endTomorrow); + assertEquals(0, result); + } + + @Test + public void givenAThreeWeekGapMidweekDates_whenUsingStreams_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithStream(startThreeWeeks, endThreeWeeks); + assertEquals(17, result); + } + + @Test + public void givenAThreeWeekGapMidweekDates_whenUsingMaths_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithoutStream(startThreeWeeks, endThreeWeeks); + assertEquals(17, result); + } + + @Test + public void givenThreeWeekGapMidweekAndWeekendDates_whenUsingStreams_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithStream(startThreeWeeksWeekend, endThreeWeeksWeekend); + assertEquals(5, result); + } + + @Test + public void givenThreeWeekGapMidweekAndWeekendDates_whenUsingMaths_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithoutStream(startThreeWeeksWeekend, endThreeWeeksWeekend); + assertEquals(5, result); + } + + @Test + public void givenThreeWeekGapWeekendDates_whenUsingStreams_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithStream(startThreeWeeks2, endThreeWeeks2); + assertEquals(40, result); + } + + @Test + public void givenThreeWeekGapWeekendDates_whenUsingMaths_calculateWeekdays(){ + CalculateWeekdays c = new CalculateWeekdays(); + long result = c.getWorkingDaysWithoutStream(startThreeWeeks2, endThreeWeeks2); + assertEquals(40, result); + } + +} From f4e2bd8e39e56db65d5a6474da2be504520452df Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 22 Jan 2024 14:36:04 +0000 Subject: [PATCH 2/3] BAEL-7382 Add date operations 4 to parent pom --- core-java-modules/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index f4722855bc..ec6c8bcb3c 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -112,6 +112,7 @@ core-java-datetime-string-2 core-java-date-operations-2 core-java-date-operations-3 + core-java-date-operations-4 core-java-documentation core-java-exceptions core-java-exceptions-2 From f3e944ebd7eeb8926202180315afc770942fd012 Mon Sep 17 00:00:00 2001 From: Sam Gardner Date: Mon, 22 Jan 2024 15:02:39 +0000 Subject: [PATCH 3/3] BAEL-7382 Use JUnit 5 for tests --- .../CalculateWeekdaysUnitTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java b/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java index 4a14b6bb99..05a2202682 100644 --- a/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java +++ b/core-java-modules/core-java-date-operations-4/src/test/java/com/baeldung/calculateweekdays/CalculateWeekdaysUnitTest.java @@ -4,7 +4,7 @@ import static junit.framework.TestCase.assertEquals; import java.time.LocalDate; -import org.junit.Test; +import org.junit.jupiter.api.Test; public class CalculateWeekdaysUnitTest { @@ -25,56 +25,56 @@ public class CalculateWeekdaysUnitTest { LocalDate endThreeWeeksWeekend = LocalDate.of(2023, 12, 9); @Test - public void givenTwoDaysOnSameWeekend_whenUsingStreams_calculateWeekdays(){ + void givenTwoDaysOnSameWeekend_whenUsingStreams_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithStream(startTomorrow, endTomorrow); assertEquals(0, result); } @Test - public void givenTwoDaysOnSameWeekend_whenUsingMaths_calculateWeekdays(){ + void givenTwoDaysOnSameWeekend_whenUsingMaths_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithoutStream(startTomorrow, endTomorrow); assertEquals(0, result); } @Test - public void givenAThreeWeekGapMidweekDates_whenUsingStreams_calculateWeekdays(){ + void givenAThreeWeekGapMidweekDates_whenUsingStreams_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithStream(startThreeWeeks, endThreeWeeks); assertEquals(17, result); } @Test - public void givenAThreeWeekGapMidweekDates_whenUsingMaths_calculateWeekdays(){ + void givenAThreeWeekGapMidweekDates_whenUsingMaths_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithoutStream(startThreeWeeks, endThreeWeeks); assertEquals(17, result); } @Test - public void givenThreeWeekGapMidweekAndWeekendDates_whenUsingStreams_calculateWeekdays(){ + void givenThreeWeekGapMidweekAndWeekendDates_whenUsingStreams_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithStream(startThreeWeeksWeekend, endThreeWeeksWeekend); assertEquals(5, result); } @Test - public void givenThreeWeekGapMidweekAndWeekendDates_whenUsingMaths_calculateWeekdays(){ + void givenThreeWeekGapMidweekAndWeekendDates_whenUsingMaths_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithoutStream(startThreeWeeksWeekend, endThreeWeeksWeekend); assertEquals(5, result); } @Test - public void givenThreeWeekGapWeekendDates_whenUsingStreams_calculateWeekdays(){ + void givenThreeWeekGapWeekendDates_whenUsingStreams_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithStream(startThreeWeeks2, endThreeWeeks2); assertEquals(40, result); } @Test - public void givenThreeWeekGapWeekendDates_whenUsingMaths_calculateWeekdays(){ + void givenThreeWeekGapWeekendDates_whenUsingMaths_thenCalculateWeekdays(){ CalculateWeekdays c = new CalculateWeekdays(); long result = c.getWorkingDaysWithoutStream(startThreeWeeks2, endThreeWeeks2); assertEquals(40, result);