2013-08-13 1 views
0

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

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

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

ответ

1

COUNT связан только с RRULE, а не с событием в целом. См rfc5545#section-3.8.5.3:

Окончательный набор повторения генерируется путем сбора всех начальных значений даты и время, генерируемых с помощью любого из указанных «RRULE» и « RDATE» свойств, а затем за исключением любого начала Даты- Значения TIME , указанные свойствами «EXDATE».

Сначала вы создаете набор на основе RRULE (включая его значение COUNT), а затем удаляете те, которые указаны в EXDATE.

Другими словами, если у вас есть RRULE с COUNT из 500 и 100 экземпляров EXDATE, вы получите 400 экземпляров.

Just FYI, вы указываете правила исключения, но EXRULE устарел в RFC5545.

+0

Спасибо, что указали на устаревание EXRULE - мы сами их не используем, но приятно знать, что я могу их игнорировать. Из вашего ответа, похоже, мне придется написать приличный кусок кода, но это нормально - я просто надеялся найти, что пропустил метод в DDay API :) –