From 4d72dcfb5097317401f16a3da2f43f730a300f06 Mon Sep 17 00:00:00 2001 From: Holger Bruch Date: Fri, 2 Aug 2024 09:37:01 +0200 Subject: [PATCH] fix: fix date range calculation issue --- .../io/leonard/OpeningHoursEvaluator.java | 22 +++++++++++++++++-- src/test/resources/closed.csv | 2 +- src/test/resources/open.csv | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/leonard/OpeningHoursEvaluator.java b/src/main/java/io/leonard/OpeningHoursEvaluator.java index b4776e0..1701d8f 100644 --- a/src/main/java/io/leonard/OpeningHoursEvaluator.java +++ b/src/main/java/io/leonard/OpeningHoursEvaluator.java @@ -183,15 +183,33 @@ private static boolean dateMatchesDateRanges(LocalDateTime time, List private static boolean dateMatchesDateRange(LocalDateTime time, DateRange range) { // if the end date is null it means that it's just a single date like in "2020 Aug 11" DateWithOffset startDate = range.getStartDate(); - boolean afterStartDate = time.getYear() >= startDate.getYear() && time.getMonth().ordinal() >= startDate.getMonth().ordinal() && time.getDayOfMonth() >= startDate.getDay(); + boolean afterStartDate = isSameDateOrAfter(time, startDate); + if (range.getEndDate() == null) { return afterStartDate; } DateWithOffset endDate = range.getEndDate(); - boolean beforeEndDate = time.getYear() <= endDate.getYear() && time.getMonth().ordinal() <= endDate.getMonth().ordinal() && time.getDayOfMonth() <= endDate.getDay(); + boolean beforeEndDate = !isSameDateOrAfter(time.minusDays(1), endDate); return afterStartDate && beforeEndDate; } + private static boolean isSameDateOrAfter(LocalDateTime time, DateWithOffset startDate) { + return ( + time.getYear() > startDate.getYear() || + ( + time.getYear() == startDate.getYear() && + startDate.getMonth() != null && + ( + time.getMonth().ordinal() > startDate.getMonth().ordinal() || + ( + time.getMonth().ordinal() == startDate.getMonth().ordinal() && + time.getDayOfMonth() >= startDate.getDay() + ) + ) + ) + ); + } + private static boolean timeMatchesHours(LocalDateTime time, TimeSpan timeSpan) { var minutesAfterMidnight = minutesAfterMidnight(time.toLocalTime()); return timeSpan.getStart() <= minutesAfterMidnight && timeSpan.getEnd() >= minutesAfterMidnight; diff --git a/src/test/resources/closed.csv b/src/test/resources/closed.csv index f7e5529..9341960 100644 --- a/src/test/resources/closed.csv +++ b/src/test/resources/closed.csv @@ -1,4 +1,3 @@ -"2020-08-06T14:28:04","2025 Jan 1 - 2099 Dec 31" "2020-08-06T14:28:04","Mo-Fr 10:00-12:00" "2020-08-06T15:28:04","Mo-Fr 10:00-15:00" "2020-08-06T15:28:04","Mo-We 10:00-15:00" @@ -15,3 +14,4 @@ "2020-08-06T14:28:04","2020 Aug 04 - 2020 Aug 05;2020 Aug 07" "2020-08-06T14:28:04","2020 Nov" "2020-08-06T14:28:04","2020 Aug 06 10:00-12:00" +"2020-08-06T14:28:04","2025 Jan 1 - 2099 Dec 31" diff --git a/src/test/resources/open.csv b/src/test/resources/open.csv index 08363db..517150e 100644 --- a/src/test/resources/open.csv +++ b/src/test/resources/open.csv @@ -11,3 +11,4 @@ "2020-08-06T14:28:04","2020 Aug 04 - 2020 Aug 06" "2020-08-06T14:28:04","2020 Aug" "2020-08-06T14:28:04","2020 Aug 06 14:00-16:00" +"2020-08-06T14:28:04","2019 Nov 01 - 2020 Aug 06"