2009-01-30 22 views
6

Korzystam z implementacji Google RFC2445 (http://code.google.com/p/google-rfc-2445/) dla reguł powtarzania. Jeśli zdefiniuję POWTÓRKĘ MIESIĘCZNĄ zaczynającą się 30 stycznia, miesiące z mniej niż 30 dniami (tj. W lutym) będą całkowicie pomijane. Więc interfejs API Google powróci 30 stycznia, 30 marca, 30 kwietnia itd. Niedobrze. Spodziewam się, że powróci: 30 stycznia, 28 lutego, 30 marca, 30 kwietnia.Definicja reguły rekurencji (RFC2445):

Podobnie, jeśli wybiorę datę rozpoczęcia na 31 stycznia, wówczas wszystkie miesiące z mniej niż 31 dni zostaną pominięte.

Może to być poprawne zgodnie ze specyfikacją RFC2445 lub może być błędem. Co myślisz?

Moje główne pytanie brzmi: czy istnieje sposób zdefiniowania reguły, która mówi "powtarzaj się 30 dnia każdego miesiąca lub ostatniego dnia miesiąca, jeśli 30. nie istnieje". Nie wierzę, że istnieje. Jakieś sugestie?

Z góry dziękuję.

Pozdrawiam, Cormac

Odpowiedz

17

Odpowiedź brzmi: FREQ = miesięcznie; BYMONTHDAY = 28,29,30; bysetpos = -1 co przekłada się na „powtórzy się 30 dnia każdego miesiąca, lub ostatni dzień miesiąca czy 30. nie robi” t istnieje ".

+0

Czy możesz wyjaśnić, dlaczego BYMONTHDAY = 28,29,30 oznacza 30 dnia miesiąca, a nie 28, 29 i 30? –

+6

Dzieje się tak ze względu na składnię BYSETPOS. Bardziej dokładnym tłumaczeniem byłoby "powtarzać się na ostatnim (-1) POZYCJI z SET 28, 29, 30, który istnieje dla danego miesiąca." Jeśli więc 30. nie istnieje, ostatnią ważną pozycją w zbiorze jest 29. Jeśli to nie istnieje, jest to 28. Ładne znalezisko, @Cormac Redmond! –

+0

Czy ktoś może być tak uprzejmy, aby wskazać mi jakąś dokumentację dotyczącą reguły powtarzania? Nie mogę znaleźć żadnego. –

0

Cóż, patrząc na RFC 2445 się to na pewno wydaje się, że zachowanie widzisz jest poprawna:

przypadku stwierdzenia wartości części reguła BYxxx które są poza zakresem dostępnych (tj. BYMONTHDAY = 30 w lutym), są po prostu ignorowane.

Jedyne rozwiązanie, jakie mogę wymyślić, to użycie wielu reguł powtarzania się, czyli jednego na 30 każdego miesiąca i drugiego na ostatni dzień lutego.

0

Wygląda na to, że masz rację co do RFC pomijając te daty. Jeśli DTSTART 31 stycznia, a ty nie określono BYMONTHDAY w regule nawrotu (lub jeśli BYMONTHDAY jest na 31), to będzie to po prostu zignorować tę regułę w miesiącach, w których nie ma takich dni:

Jeśli wartości części reguły BYxxx zostaną znalezione , które są poza dostępnym zakresem (tj. BYMONTHDAY = 30 w lutym), to są one po prostu ignorowane.

Jednak, powinieneś być w stanie określić -1 BYMONTHDAY i mieć go wykorzystać ostatni dzień miesiąca, co może się zdarzyć, aby być.

Część reguła BYMONTHDAY określa PRZECINEK znaków (ASCII 44) przecinku lista rozdzielonych dni miesiąca. Poprawne wartości to 1 do 31 lub -31 do -1. Na przykład -10 oznacza dziesiąty do ostatniego dnia miesiąca.

+0

Liczby ujemne prawie działają; pytający chce -2 w miesiącach z 31 dniami, -1 w miesiącach z 30 (lub 29 lub 28) dniami. Znacznie bliżej ... –

+0

To prawda, nie sądziłem, że to możliwe, ale znalazł BYSETPOS na własną rękę, co robi dokładnie to, czego chce. –