Предположим, у меня есть iCalendar с одним событием. Это имеет правило повторения (RRULE), установленное с COUNT
для ограничения, но также имеет некоторые даты исключений и некоторые правила исключений.
Я хочу рассчитать дату последнего появления.
Если бы в правилах было установлено только UNTIL
s, это было бы легко, поскольку я знал бы, что это ограничивает возможные даты, поэтому я мог бы сделать следующее.
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, чтобы определить, когда запускать.