function evaluateRange(&$date, $range, $rangeValue) { if (!is_numeric($range)) { if ($range == 'last') { $range = -1; } else { if ($range == 'next') { $range = 1; } } } if (is_numeric($rangeValue)) { $date->addSeconds($rangeValue * $range); } else { if (is_array($rangeValue)) { foreach ($rangeValue as $key => $value) { if ($key == 'weekday' && $range > 0) { for ($i = 0; $i < $range; $i++) { $formatedDate = Calc::nextDayOfWeek($value, $date->getDay(), $date->getMonth(), $date->getYear()); $date = new \TYPO3\CMS\Cal\Model\CalDate($formatedDate); $date->setTZbyId('UTC'); } } else { if ($key == 'weekday' && $range < 0) { for ($i = 0; $i > $range; $i--) { $formatedDate = Calc::prevDayOfWeek($value, $date->getDay(), $date->getMonth(), $date->getYear()); $date = new \TYPO3\CMS\Cal\Model\CalDate($formatedDate); $date->setTZbyId('UTC'); } } else { if ($value == 'week' && $range > 0) { $date->addSeconds($range * 604800); } else { if ($value == 'week' && $range < 0) { $date->subtractSeconds($range * 604800); } } } } } } else { if ($range > 0) { if ($rangeValue == 'month') { for ($i = 0; $i < $range; $i++) { $days = Calc::daysInMonth($date->getMonth(), $date->getYear()); $endOfNextMonth = new \TYPO3\CMS\Cal\Model\CalDate(Calc::endOfNextMonth($date->getDay(), $date->getMonth(), $date->getYear())); $date->addSeconds(60 * 60 * 24 * $days); if ($date->after($endOfNextMonth)) { $date->setDay($endOfNextMonth->getDay()); $date->setMonth($endOfNextMonth->getMonth()); $date->setYear($endOfNextMonth->getYear()); } } } else { if ($rangeValue == 'year') { $date->setYear($date->getYear() + $range); } else { if ($rangeValue == 'hour') { $date->addSeconds($range * 3600); } else { if ($rangeValue == 'minute') { $date->addSeconds($range * 60); } else { $date->addSeconds($range * 86400); } } } } } else { if ($range < 0) { if ($rangeValue == 'month') { for ($i = 0; $i > $range; $i--) { $endOfPrevMonth = new \TYPO3\CMS\Cal\Model\CalDate(Calc::endOfPrevMonth($date->getDay(), $date->getMonth(), $date->getYear())); $days = Calc::daysInMonth($endOfPrevMonth->getMonth(), $endOfPrevMonth->getYear()); $date->subtractSeconds(60 * 60 * 24 * $days); } } else { if ($rangeValue == 'year') { $date->setYear($date->getYear() - abs($range)); } else { if ($rangeValue == 'hour') { $date->subtractSeconds(abs($range) * 3600); } else { if ($rangeValue == 'minute') { $date->subtractSeconds(abs($range) * 60); } else { $date->subtractSeconds(abs($range) * 86400); } } } } } } } } $date->subtractSeconds(1); }
function getMonthDaysAccordingly(&$event, $month, $year) { $byDayArray = $event->getByDay(); $byMonthDays = $event->getByMonthDay(); $resultDays = array(); if (count($byDayArray) == 0) { $resultDays = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); return $resultDays; } for ($i = 0; $i < count($byDayArray); $i++) { if (preg_match('/([-\\+]{0,1})?([0-9]{1})?([A-Z]{2})/', $byDayArray[$i], $byDaySplit)) { $dayOfWeekday = \TYPO3\CMS\Cal\Controller\Calendar::two2threeCharDays($byDaySplit[3], false); $monthStartTime = new \TYPO3\CMS\Cal\Model\CalDate($year . '-' . sprintf("%02d", $month) . '-01 00:00:00'); $monthStartTime->setTZbyId('UTC'); $monthEndTime = \TYPO3\CMS\Cal\Controller\Calendar::calculateEndMonthTime($monthStartTime); if ($byDaySplit[2] > 0) { if ($byDaySplit[1] == '-') { $monthTime = new \TYPO3\CMS\Cal\Model\CalDate(Calc::prevDayOfWeek($dayOfWeekday, $monthEndTime->getDay(), $monthEndTime->getMonth(), $monthEndTime->getYear(), '%Y%m%d', true)); $monthTime->setTZbyId('UTC'); $monthTime->subtractSeconds(($byDaySplit[2] - 1) * 604800); } else { $monthTime = new \TYPO3\CMS\Cal\Model\CalDate(Calc::nextDayOfWeek($dayOfWeekday, $monthStartTime->getDay(), $monthStartTime->getMonth(), $monthStartTime->getYear(), '%Y%m%d', true)); $monthTime->setTZbyId('UTC'); $monthTime->addSeconds(($byDaySplit[2] - 1) * 604800); } if ($monthTime->getMonth() == $month && in_array($monthTime->getDay(), $byMonthDays)) { $resultDays[] = $monthTime->getDay(); } } else { $monthTime = new \TYPO3\CMS\Cal\Model\CalDate(Calc::prevDayOfWeek($dayOfWeekday, $monthStartTime->getDay(), $monthStartTime->getMonth(), $monthStartTime->getYear(), '%Y%m%d', true)); $monthTime->setTZbyId('UTC'); if ($monthTime->before($monthStartTime)) { $monthTime->addSeconds(604800); } while ($monthTime->before($monthEndTime)) { $resultDays[] = $monthTime->getDay(); $monthTime->addSeconds(604800); } } } } $resultDays = array_intersect($resultDays, $event->getByMonthDay()); sort($resultDays); return $resultDays; }