2009-07-09 9 views
2

Je n'ai pas réussi à formuler une RRULE qui permettrait à un événement comme indiqué ci-dessous:Comment avoir un iCalendar (RFC 2445) répéter YEARLY avec la durée

Répète ANNUELLEMENT, du premier dimanche d'Avril au dernier jour du mois de mai , survenant le lundi, mercredi et vendredi, jusqu'à l'éternité.

FREQ = YEARLY; ​​BYMONTH = 4; BYDAY = SU (me donne le premier dimanche d'Avril répéter tous les ans)

et

FREQ = YEARLY; ​​BYMONTH = 5; BYMONTHDAY = -1 (me donne le dernier jour de mai répéter chaque année)

Mais je ne peux pas comprendre comment faire se répéter l'événement chaque année entre ces dates pour lundi, mercredi et vendredi.

Suggestions?

Mise à jour: Les commentaires ne disposant pas de suffisamment d'espace pour répondre à la réponse de Chris, je suis en train de modifier la question pour plus d'informations.

Malheureusement, non. Je ne sais pas si c'est la bibliothèque DDay.iCal que j'utilise, ou quoi, mais ça ne marche pas non plus. J'ai trouvé que le début de la date ne peut pas être une date ordinale (premier dimanche, etc.) .. il doit être une date spécifique, ce qui rend difficile pour mes besoins. Même en utilisant de multiples RRULE il ne semble pas fonctionner:

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 

Cela ressemble à droite sur le visage (je commence même l'événement sur 1/1/2009), mais quand je commence à vérifier si certains jours sont valide, j'obtiens des résultats incorrects.

Par exemple,

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 

J'utilise le logiciel Douglas Day's DDay.iCal, mais je ne pense pas que ce soit un bug dans cette bibliothèque. Je pense que cela pourrait être une limitation dans iCalendar (RFC 2445).

Pensées?

Répondre

0

Essayez la règle de BYMONTH pour indiquer que vous souhaitez que en Avril et mai:

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

Cela ne traitera pas le « premier dimanche d'Avril » peu, ce qui est dans la partie MWF de le motif. Je pense que cela sera couvert pour la première occurrence si vous définissez cette date spécifique comme votre date dtStart (mais bien sûr, cela ne se reproduira pas pour l'année suivante par elle-même). Sinon, je pense que vous pourriez avoir besoin d'un deuxième RRULE pour cela:

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

Cela aide-t-il?

0

Todd,

En utilisant les 3 RRULEs que vous avez ci-dessus produira une union des résultats, et non une intersection. Vous avez raison, il n'y a pas de manière très gracieuse dans RFC2445/5545.Toutefois, si vous avez la possibilité de calculer programatically le premier dimanche d'Avril alors que vous générez l'événement, ce qui suit devrait fonctionner:

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

Cette méthode au moins semble plus proche de ce que vous essayez d'atteindre.

-Doug

Questions connexes