2016-02-04 1 views
0

Я использую google-rfc-2445 генерировать повторяющиеся события в соответствии в соответствии с rfc-2445:Как я могу исключить DTSTART из сгенерированных событий, если его день не среди дней, указанных BYDAY?

Свойство «DTSTART» за «VEVENT» определяет инклюзивное начало мероприятия. Для повторяющихся событий он также указывает самый первый пример в наборе повторений.

Так, например, RRULE для события, которое встречается, каждые пятницу 5 раз:

DTSTART;TZID=US-Eastern:20160204T090000 
RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=FR;INTERVAL=1; 

Так, по rfc-2445 он будет генерировать 6 событий. Первое событие на Thursday 4 February 2016, второе событие на Friday 5 February 2016 и т. Д.

Как я могу достичь этого, он исключит первое событие, если оно не в шаблоне? В приведенном выше примере он должен исключить первое появление, 4 February 2016. В случае определения DTSTART;TZID=US-Eastern:20160205T090000, который является пятницей, он должен покинуть первое место.

Это может быть сделано путем определения такого «правила исключения» в RRULE себя, или мне нужно сделать проверку в коде, и если DTSTART не в тот же день, как это определено в BYDAY я должен искать ближайшую дату в коде (вручную) и сменить команду DTSTART?

ОБНОВЛЕНИЕ Хорошо, в соответствии с RFC-2445 и этот вопрос о группе Google: https://groups.google.com/forum/#!topic/google-rfc-2445/xqYFe411ysA

Свойство "EXDATE" может быть использован, чтобы исключить значение, указанное в
"DTSTART". Однако в таких случаях исходная дата «DTSTART» ДОЛЖНА
по-прежнему поддерживается системой календарного планирования и планирования, поскольку
исходное значение «DTSTART» имеет собственные зависимости использования от других свойств , таких как «RECURRENCE-ID».

похоже, что мне нужно использовать свойство EXDATE для достижения того, что мне нужно. Пытаясь достичь этого следующим RRULE:

EXDATE;TZID=Asia/Jerusalem:20160210T000000 
RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=WE;INTERVAL=1; 

И дата начала: в следующем коде 2016-02-10T00:00:00.000+02:00:

DateTimeIterable dti = DateTimeIteratorFactory.createDateTimeIterable(RRULE, DTSTART, dateTimeZone, true); 

Но это возвращает только 4 события, так что всегда удалить первое событие.

+0

Это сгенерирует 5 событий из-за 'COUNT = 5'. DTSTART считается первым экземпляром, поэтому будет только 4 пятничных события. – Marten

+0

Нет, он возвращает 6 событий, событие, которое задано DTSTART и 5 событий по шаблону. – Anatoly

+1

Это ошибка в библиотеке. [RFC 5545] (https://tools.ietf.org/html/rfc5545#section-3.3.10) ясно говорит: 'Параметр правила COUNT определяет количество вхождений, в которых для привязки к диапазону рекурсии. Значение свойства «DTSTART» всегда считается первым вхождением. « – Marten

ответ

1

Из описания проблемы вы даете, вы получите 6 событий, когда DTSTART добавляется, и вы не хотели бы, чтобы это было частью списка экземпляров и 5 событий, когда это хорошо дата.

Так что вы хотите, чтобы получить только последние 5 событий, которые можно с помощью BYSETPOS в вашем RRULE, следующий должен сделать трюк:

BYSETPOS = -5, -4 , -3, -2, -1

который будет возвращать во всех случаях последних 5 событий, которые ваш RRULE дает независимо от того, DTSTART является соответствием образца вашей RRULE или нет.

Смежные вопросы