Как сделать, чтобы iCalendar (RFC 2445) повторил ГОД с продолжительностью - PullRequest
2 голосов
/ 10 июля 2009

Мне не удалось сформулировать RRULE, который позволил бы событие, как показано ниже:

Повторяется ГОДА, с первого воскресенья апреля до последнего дня мая, происходя в понедельник, среду и пятницу, до вечности.

ЧАСТОТА = ГОДОВОЙ; БАЙМОНТ = 4; BYDAY = SU (дает мне первое воскресенье апреля, повторяющееся ежегодно)

и

ЧАСТОТА = ГОДОВОЙ; BYMONTH = 5; BYMONTHDAY = -1 (дает мне последний день мая, повторяющийся ежегодно)

Но я не могу понять, как событие будет повторяться ежегодно между этими датами в понедельник, среду и пятницу.

Предложения

Обновление: В комментариях недостаточно места, чтобы ответить на ответ Криса, поэтому я редактирую вопрос с дополнительной информацией.

К сожалению, нет. Я не знаю, какую библиотеку DDay.iCal я использую, или как, но это тоже не работает. Я обнаружил, что дата начала не может быть порядковой датой (первое воскресенье и т. Д.) ... это должна быть конкретная дата, что усложняет мои требования. Даже при использовании нескольких RRULE это не работает:

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//DDay.iCal//NONSGML ddaysoftware.com//EN 
BEGIN:VEVENT 
CREATED:20090717T033307Z 
DTSTAMP:20090717T033307Z 
DTSTART:20090101T000000 
RRULE:FREQ=YEARLY;WKST=SU;BYDAY=MO,WE,FR;BYMONTH=4,5 
RRULE:FREQ=YEARLY;WKST=SU;BYDAY=1SU;BYMONTH=4 
RRULE:FREQ=YEARLY;WKST=SU;BYMONTH=5;BYMONTHDAY=-1 
SEQUENCE:0 
UID:352ed9d4-04d0-4f06-a094-fab7165e5c74 
END:VEVENT 
END:VCALENDAR

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

Например,

4/1/2009 12:00:00 AM = True   // Should be False
4/6/2009 12:00:00 AM = True  
4/7/2009 12:00:00 AM = False
4/8/2009 12:00:00 AM = True
5/1/2009 12:00:00 AM = True
5/2/2009 12:00:00 AM = False
5/29/2009 12:00:00 AM = True
5/31/2009 12:00:00 AM = True  // Should be False
6/1/2009 12:00:00 AM = False

Я использую программное обеспечение Dayglas Day's DDay.iCal , но я не думаю, что это ошибка в этой библиотеке. Я думаю, что это может быть ограничением в iCalendar (RFC 2445).

Мысли

Ответы [ 2 ]

0 голосов
/ 23 апреля 2010

Todd,

Использование трех RRULE, как вы указали выше, приведет к объединению результатов, а не к пересечению. Вы правы, что в RFC2445 / 5545 нет очень изящного способа. Однако, если у вас есть возможность программно рассчитать первое воскресенье апреля, пока вы генерируете событие, должно работать следующее:

DTSTART:20090405T000000
RRULE:FREQ=YEARLY;BYDAY=MO,WE,FR;UNTIL=20090531T000000Z

Этот метод, по крайней мере, кажется ближе к тому, чего вы пытались достичь.

-Doug

0 голосов
/ 17 июля 2009

Попробуйте правило BYMONTH, чтобы указать, что вы хотите его только в апреле и мае:

RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=MO,WE,FR;BYMONTH=4,5;WKST=SU

Это не будет обрабатывать бит «Первое воскресенье апреля», которого нет в MWF-части шаблона. Я думаю, что это будет покрыто для первого случая, если вы установите эту конкретную дату в качестве даты dtStart (но, конечно, это не повторится в следующем году само по себе). В противном случае, я думаю, вам может понадобиться второй РУРЛ для этого:

RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4;WKST=SU

Это помогает?

...