• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/core/event/tools/recurrence.php
  • Класс: BitrixCalendarCoreEventToolsRecurrence
  • Вызов: Recurrence::getEventOccurenceDates
public function getEventOccurenceDates(Event $event, array $params = []): array
{
	$limits = $this->prepareLimits($event, $params);

	$result = [];
	$counter = 0;

	$pushToResult = function (DateTime $date) use (&$result, &$counter)
	{
		$result[$date->format('d.m.Y')] = $date;
		$counter++;
	};

	$start = clone $event->getStart();
	$start->resetTime();
	$date = $this->convertBitrixDateToPhpDate($start);

	while ($this->isDateWithinLimits($date, $limits, $counter))
	{
		if ($event->getRecurringRule()->getFrequency() === self::PERIOD_TYPES['WEEKLY'])
		{
			if (empty($started))
			{
				$started = true;
				// return array like [0, 2, 5] for sunday, tuesday, friday
				$weekDays = $weekDays ?? $this->prepareWeekDays($event->getRecurringRule()->getByday());
				$weekDay = (int)$date->format('w');
				if (!in_array($weekDay, $weekDays))
				{
					$this->moveToNextWeekDay($date, $weekDays);
				}
			}
			else
			{
				$pushToResult(clone $date);
				$this->moveToNextWeekDay($date, $weekDays);
			}
		}
		else
		{
			$pushToResult(clone $date);
			$unit = self::UNIT_MAP[$event->getRecurringRule()->getFrequency()] ?? null;
			if ($unit === null)
			{
				throw new BaseException(
					"Unsupported frequency type: " . $event->getRecurringRule()->getFrequency(),
					406,
					__FILE__,
					__LINE__
				);
			}

			$date->modify('+' . $event->getRecurringRule()->getInterval() . ' ' . $unit);
		}
	}

	$this->removeExcludedDates($event, $result);

	return $result;
}