2009-07-09 9 views
2

Ich habe eine RRULE bei der Formulierung nicht erfolgreich gewesen, die ein Ereignis wie unten erlauben würde, gezeigt:Wie eine iCalendar haben (RFC 2445) wiederholen JÄHRLICH mit Dauer

Repeats JÄHRLICH vom ersten Sonntag im April bis zum letzten Tag des Monats Mai kommt am Montag, Mittwoch und Freitag vor, für immer.

FREQ = JäHRLICH; BYMONTH = 4; BYDAY = SU (gibt mir den ersten Sonntag im April jährliche Wiederholung)

und

FREQ = JäHRLICH; BYMONTH = 5; BYMONTHDAY = -1 (gibt mir den letzten Tag des Mai wiederholt sich jährlich)

Aber ich kann nicht herausfinden, wie das Ereignis zwischen diesen Daten für Montag, Mittwoch und Freitag jährlich zu wiederholen.

Vorschläge?

Update: Kommentare haben nicht genügend Platz, um auf Chris 'Antwort zu antworten, daher bearbeite ich die Frage mit weiteren Informationen.

Leider nein. Ich weiß nicht, ob es die DDay.iCal-Bibliothek ist, die ich benutze oder was, aber das funktioniert auch nicht. Ich habe festgestellt, dass der Start des Datums kein ordinales Datum sein kann (erster Sonntag, etc.). Es muss ein bestimmtes Datum sein, was es für meine Anforderungen schwierig macht. Selbst unter Verwendung scheint es mehrere RRULE die nicht zu arbeiten:

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 

Das ist richtig auf dem Gesicht sieht (ich bin auch die Veranstaltung am 1.1.2009 beginnen), aber wenn ich anfangen zu testen, ob bestimmte Tage gültig, bekomme ich falsche Ergebnisse.

Zum Beispiel

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 

Ich verwende Douglas Day's DDay.iCal Software, aber ich glaube nicht, dass es ein Fehler in dieser Bibliothek ist. Ich denke, dass dies eine Einschränkung in iCalendar (RFC 2445) sein könnte.

Gedanken?

Antwort

0

die BYMONTH Regel Versuchen Sie angeben, dass Sie es nur im April und Mai wollen:

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

Dies wird die „Erster Sonntag im April“ Bit nicht verarbeiten, die von nicht in der MWF Teil ist das Muster. Ich denke, das wird für das erste Vorkommen gedeckt, wenn Sie dieses spezifische Datum als Ihr dtStart-Datum festlegen (aber das wird natürlich nicht für das nächste Jahr selbst wiederkehren). Andernfalls denke ich, dass Sie möglicherweise eine zweite RRULE dafür benötigen:

Hilft das?

0

Todd,

Mit den 3 RRULEs wie Sie oben haben eine Vereinigung von Ergebnissen, nicht eine Kreuzung. Sie haben recht, dass es in RFC2445/5545 keine sehr elegante Möglichkeit gibt.wenn Sie die Möglichkeit haben jedoch programmatisch den ersten Sonntag im April zu berechnen, während Sie das Ereignis generieren, sollten folgende Arbeiten:

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

Diese Methode scheint zumindest näher an, was Sie erreichen wollten.

-Doug