From db8592db411b5558893cf3035303c0464a41bf7c Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 26 May 2021 16:02:02 +0200 Subject: [PATCH] [Fix] fix shift by weeks --- .../java/li/strolch/utils/time/PeriodHelper.java | 14 ++++++++------ .../li/strolch/utils/time/PeriodHelperTest.java | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/time/PeriodHelper.java b/li.strolch.utils/src/main/java/li/strolch/utils/time/PeriodHelper.java index 5b8f08c55..d01333746 100644 --- a/li.strolch.utils/src/main/java/li/strolch/utils/time/PeriodHelper.java +++ b/li.strolch.utils/src/main/java/li/strolch/utils/time/PeriodHelper.java @@ -201,7 +201,7 @@ public class PeriodHelper { double daysInPeriod = daysIn(periodDuration); // see if we need end shift by weeks - if (period.getDays() % 7 == 0 && daysInPeriod % 7 == 0) { + if (period.getDays() != 0 && period.getDays() % 7 == 0 && daysInPeriod % 7 == 0) { int numberOfWeeks = period.getDays() / 7; // calculate the number of weeks to shift @@ -213,7 +213,9 @@ public class PeriodHelper { if (shiftWeeks < numberOfWeeks) return date; - return date.plusWeeks(shiftWeeks); + ZonedDateTime result = date.plusWeeks(shiftWeeks); + if (!result.isBefore(end)) + return date.plusWeeks(shiftWeeks - 1); } // see if we are shifting simply by single days @@ -243,10 +245,10 @@ public class PeriodHelper { "Expected period to be zero at this point and only duration to be set: " + periodDuration); // shifting by e.g. PT8H - long hoursInPeriod = duration.toHours(); - long hoursInBetween = TimeUnit.DAYS.toHours((long) daysInBetween); - long shifts = hoursInBetween / hoursInPeriod; - long shiftHours = shifts * hoursInPeriod; + double hoursInPeriod = duration.getSeconds() / 60.0 / 60.0; + double hoursInBetween = TimeUnit.DAYS.toHours((long) daysInBetween); + long shifts = (long) (hoursInBetween / hoursInPeriod); + long shiftHours = (long) (shifts * hoursInPeriod); if (shiftHours < 24) return date; diff --git a/li.strolch.utils/src/test/java/li/strolch/utils/time/PeriodHelperTest.java b/li.strolch.utils/src/test/java/li/strolch/utils/time/PeriodHelperTest.java index b7320e3f7..449b32500 100644 --- a/li.strolch.utils/src/test/java/li/strolch/utils/time/PeriodHelperTest.java +++ b/li.strolch.utils/src/test/java/li/strolch/utils/time/PeriodHelperTest.java @@ -364,7 +364,7 @@ public class PeriodHelperTest { ZonedDateTime shifted = shiftByMultipleOfPeriod(date1, date2, PeriodDuration.parse("P7D")); assertEquals(date1.getDayOfWeek(), shifted.getDayOfWeek()); - ZonedDateTime expected = LocalDate.of(2021, 4, 28).atStartOfDay(ZoneId.systemDefault()); + ZonedDateTime expected = LocalDate.of(2021, 4, 21).atStartOfDay(ZoneId.systemDefault()); assertEquals(shifted.toString(), expected, shifted); } @@ -520,7 +520,7 @@ public class PeriodHelperTest { ZonedDateTime shifted = shiftByMultipleOfPeriod(d1, d2, PeriodDuration.parse("P1W")); assertEquals(d1.getDayOfWeek(), shifted.getDayOfWeek()); - ZonedDateTime expected = LocalDate.of(2021, 4, 27).atStartOfDay(ZoneId.systemDefault()); + ZonedDateTime expected = LocalDate.of(2021, 4, 20).atStartOfDay(ZoneId.systemDefault()); assertEquals(shifted.toString(), expected, shifted); }