Найти последнее появление события в DDay.iCal

Предположим, у меня есть iCalendar с одним событием. Это имеет правило повторения (RRULE), установленное с COUNT для ограничения, но также имеет некоторые даты исключений и некоторые правила исключений.

Я хочу рассчитать дату последнего появления.

Если бы в правилах было установлено только UNTILs, это было бы легко, поскольку я знал бы, что это ограничивает возможные даты, поэтому я мог бы сделать следующее.

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, чтобы определить, когда запускать.


person RB.    schedule 13.08.2013    source источник


Ответы (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.

person Arnaud Quillaud    schedule 14.08.2013
comment
Спасибо, что указали на устаревание EXRULE — мы сами ими не пользуемся, но приятно знать, что я могу их игнорировать. Судя по вашему ответу, мне придется самому написать приличный кусок кода, и это нормально — я просто надеялся найти пропущенный метод в DDay API :) - person RB.; 14.08.2013