Найти последнее вхождение события в DDay.iCal
Предположим, у меня есть iCalendar с одним событием. Это имеет правило повторения (RRULE), установленное с COUNT
чтобы ограничить его, но также есть некоторые даты исключений и некоторые правила исключений.
Я хочу рассчитать дату последнего вхождения.
Если бы правила имели UNTIL
Установив, это было бы легко, так как я знал бы, что это ограничивало возможные даты, поэтому я мог сделать следующее.
IICalendar calendar = LoadCalendar();
Event evt = calendar.Events.Single();
DateTime start = evt.Start;
DateTime end = evt.RecurrenceRules.Select(r => r.Until).Max();
var lastOccurrence = evt.GetOccurrences(start, end).Last();
Однако этот подход не будет работать с COUNT, так как исключения могут толкнуть последнее вхождение на неопределенное время в будущее (например, предположим, что первые 500 дат еженедельного вхождения были исключены - это приведет к смещению конечной даты на 10 лет в будущее).).
Есть ли простой способ определить последнее вхождение в этом сценарии? (В конце концов, я мог бы написать свой собственный анализатор правил или подумать над тем, который встроен в DDay, но я надеюсь на более легкий путь!).
Фон
Для справки я намереваюсь создать Quartz.NET Trigger, который использует файл iCalendar для определения момента запуска.
1 ответ
COUNT связан только с RRULE, а не с событием в целом. Смотрите rfc5545 # section-3.8.5.3:
Окончательный набор повторений генерируется путем сбора всех начальных значений DATE-TIME, сгенерированных любым из указанных свойств "RRULE" и "RDATE", а затем исключая любые начальные значения DATE-TIME, указанные свойствами "EXDATE".
Сначала вы строите набор на основе RRULE (включая его значение COUNT), а затем удаляете те, которые упомянуты в EXDATE.
Другими словами, если у вас есть RRULE с COUNT 500 и 100 экземпляров EXDATE, вы получите 400 экземпляров.
Просто к вашему сведению, вы упоминаете правила исключений, но EXRULE устарела в RFC5545.