2009-01-30 12 views
6

Ich verwende Googles RFC2445-Implementierung (http://code.google.com/p/google-rfc-2445/) für Wiederholungsregeln. Wenn ich eine monatliche Wiederholung ab dem 30. Januar definiere, werden Monate mit weniger als 30 Tagen (d. H. Februar) vollständig übersprungen. Die Google API würde also am 30. Januar, 30. März, 30. April usw. zurückgegeben. Nicht gut. Ich würde erwarten, dass es zurückkehrt: 30. Januar, 28. Februar, 30. März, 30. April.Rezidivregeldefinition (RFC2445) Frage

Ähnlich, wenn ich ein Startdatum des 31. Januar wählte, dann würden alle Monate mit weniger als 31 Tagen übersprungen werden.

Dies kann gemäß RFC2445-Spezifikation korrekt sein oder ein Fehler sein. Was denken Sie?

Meine Hauptfrage ist, gibt es eine Möglichkeit, eine Regel zu definieren, die "am 30. eines jeden Monats wiederholen, oder der letzte Tag des Monats, wenn die 30. nicht existiert". Ich glaube nicht, dass es da ist. Irgendwelche Vorschläge?

Vielen Dank im Voraus.

Grüße, Cormac

Antwort

17

Die Antwort lautet: FREQ = MONATS; BYMONTHDAY = 28,29,30; BYSETPOS = -1, die „am 30. eines jeden Monats wieder auftreten zu übersetzen, oder der letzte Tag des Monats, wenn der 30. doesn‘ t existieren ".

+0

Können Sie erklären, warum der BYMONTHDAY = 28,29,30 zum 30. des Monats und nicht zum 28., 29. und 30. bedeutet? –

+6

Es ist wegen der BYSETPOS-Syntax. Eine genauere Übersetzung wäre "wiederholen auf der letzten (-1) POSITION von der SET 28, 29, 30, die für den gegebenen Monat existiert." Wenn also der 30. nicht existiert, ist der letzte gültige Punkt in dem Satz 29. Wenn das nicht existiert, ist es 28. Netter Fund, @Cormac Redmond! –

+0

Kann jemand so freundlich sein, mich auf eine Dokumentation für die Wiederkehrregel hinzuweisen? Ich kann keine finden. –

0

Nun, es scheint auf jeden Fall bei RFC 2445 selbst suchen, dass das Verhalten Sie sehen richtig:

gefunden Teil Werte

Wenn BYxxx Regel sind, die über den Umfang verfügbar (BYMONTHDAY = 30 im Februar), sie werden einfach ignoriert. Die einzige Lösung, die mir einfällt, ist die Verwendung mehrerer Wiederholungsregeln, d. H. Eine für den 30. eines jeden Monats und eine andere für den letzten Tag im Februar.

0

Es sieht so aus, als ob Sie recht haben, wenn RFC diese Daten auslässt. Wenn Ihr DTSTART ist 31. Januar, und Sie keine BYMONTHDAY in Ihrer Wiederholungsregel angeben (oder wenn BYMONTHDAY am 31.), dann wird es einfach, diese Regel in Monaten ignorieren, wo es keinen solchen Tag ist:

Wenn BYxxx-Regelwerkteile gefunden werden, die über den verfügbaren Gültigkeitsbereich hinausgehen (dh BYMONTHDAY = 30 im Februar), werden sie einfach ignoriert.

jedoch, sollten Sie in der Lage sein, geben Sie -1 für BYMONTHDAY und haben sie den letzten Tag des Monats verwenden, was auch immer es sein kann passieren.

Der BYMONTHDAY Regel Teil gibt ein COMMA-Zeichen (ASCII dezimal 44) getrennte Liste der Tage des Monats. Gültige Werte sind 1 bis 31 oder -31 bis -1. Zum Beispiel repräsentiert -10 den zehnten bis zum letzten Tag des Monats.

+0

Die negativen Zahlen funktionieren fast; der Fragesteller möchte -2 Monate mit 31 Tagen, -1 Monate mit 30 (oder 29 oder 28) Tagen. Viel näher ... –

+0

Das stimmt, ich dachte nicht, dass es möglich ist, aber er fand das BYSETPOS alleine, was genau das tut, was er will. –