From 2d3c183e474e91fd3592a6af003df2288558ffde Mon Sep 17 00:00:00 2001 From: bition Date: Sun, 22 Apr 2018 18:29:12 +0200 Subject: [PATCH] Update IcalParser.php fix calculation of event recurrences depending on the current date (and not on event start date) --- src/IcalParser.php | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/IcalParser.php b/src/IcalParser.php index 6d72589..9b8a701 100644 --- a/src/IcalParser.php +++ b/src/IcalParser.php @@ -298,9 +298,12 @@ public function parseRecurrences($event) { $until = $recurring->getUntil(); if ($until === false) { - //forever... limit to 3 years + //forever not possibile => set fixed limit + $interval = 'P3Y'; // + 3 years + $offset = 'P1D'; // + 1 day + $event['DTSTART'] = $this->findStart($event['DTSTART'], $interval, $offset); $end = clone($event['DTSTART']); - $end->add(new \DateInterval('P3Y')); // + 3 years + $end->add(new \DateInterval($interval)); $recurring->setUntil($end); $until = $recurring->getUntil(); } @@ -328,6 +331,27 @@ public function parseRecurrences($event) { return $recurrences; } + + private function findStart($start, $interval, $offset = '', $limit = 9999) + { + $end = clone($start); + $now = new \DateTime('now', $start->getTimezone()); + + $end = $end->add(new \DateInterval($interval)); + if (($limit > 0) && ($now > $end)) + { + if (!empty($offset)) + { + $end->sub(new \DateInterval($offset)); + $offset = ''; + } + + $start = $end; + $start = $this->findStart($start, $interval, $offset, --$limit); + } + + return $start; + } /** * @return array