From f95509e75120f2580e278764d92298d143f61676 Mon Sep 17 00:00:00 2001 From: Marcus Nyeholt Date: Mon, 3 Jul 2017 16:53:28 +1000 Subject: [PATCH] fix(ScheduleRange) - fixed method of determining next date time to account for date range diff rounding --- code/ScheduleRange.php | 27 ++++++++++++++++++++++----- tests/ScheduleRangeTest.php | 3 ++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/code/ScheduleRange.php b/code/ScheduleRange.php index ea850af..84388c2 100644 --- a/code/ScheduleRange.php +++ b/code/ScheduleRange.php @@ -112,17 +112,22 @@ public function getNextDateTime() { protected function getScheduleDateTime() { $now = new Datetime(SS_Datetime::now()->Format(DateTime::ATOM)); - // Presume where checking at a point before the StartDate + // get a start time for 'today' $nextDateTime = $this->getStartDateTime(); - if($now >= $this->getStartDateTime()) { + if($now >= $nextDateTime) { //Inside the ScheduleRange so set nextDateTime to now + interval $nextDateTime = $now->add(new DateInterval('PT' . $this->Interval . 'S')); } - if ($nextDateTime > $this->getEndDateTime()) { + // and an end-time for 'today' + $todayEndTime = $this->getEndDateTime(); + + $lastEndTime = $this->getLastScheduleTime(); + + if ($nextDateTime > $todayEndTime) { //Now + interval falls outside the Schedule range - if($nextDateTime > $this->getLastScheduleTime()) { + if($nextDateTime > $lastEndTime) { $nextDateTime = null; } else { $this->goToNextDay(); @@ -130,6 +135,11 @@ protected function getScheduleDateTime() { } } + // lastly, compare the very last date time. + if($nextDateTime > $lastEndTime) { + $nextDateTime = null; + } + return $nextDateTime; } @@ -153,9 +163,16 @@ public function getLastScheduleTime() { return new Datetime($this->EndDate .' '. $this->EndTime); } + public function __accessForgetScheduleDay() { + + } + protected function getScheduleDay() { $scheduleDay = new Datetime($this->StartDate .' '. $this->StartTime); - $now = new Datetime(SS_Datetime::now()->Format(DateTime::ATOM)); + + // we use $this->StartTime, because if we leave it as 'now' time, we may actually be closer to + // the _next_ day, and the diff logic further on will instead return +1 day more than we expect. + $now = new Datetime(SS_Datetime::now()->Format('Y-m-d ' . $this->StartTime)); // make sure that the 'day' we start looking from is close to 'now' so our // loops don't work through days that don't matter diff --git a/tests/ScheduleRangeTest.php b/tests/ScheduleRangeTest.php index feba0e0..a1f61f2 100644 --- a/tests/ScheduleRangeTest.php +++ b/tests/ScheduleRangeTest.php @@ -33,7 +33,8 @@ public function testGetNextDateTimeAfter() { //After SS_Datetime::set_mock_now('2015-10-06 11:50:00'); - $this->assertEquals(null, $sched->getNextDateTime()); + $result = $sched->getNextDateTime(); + $this->assertEquals(null, $result); } public function testGetNextDateTimeDuring() {