RRULE для первого пришествия - PullRequest
0 голосов
/ 07 мая 2018

В настоящее время я пытаюсь настроить собственный iCalendar, на который я могу подписаться, так как не хочу зависеть от сторонних сервисов.

Я сейчас пытаюсь сделать VEVENT на Рождество. Второе, третье и четвертое пришествие, а также рождественские каникулы не заставят себя ждать, однако у меня есть большие проблемы с моделированием первого пришествия.

В частности, проблема в том, что первое появление может быть в ноябре и декабре (с 27 ноября по 3 декабря)

Как я могу сделать повторяющееся событие (или, точнее, RRULE), чтобы охватить все случаи для 1-го появления?

Что я пробовал


Моя первая идея была такой:

FREQ=YEARLY;INTERVAL=1;BYMONTH=11,12;BYMONTHDAY=27,28,29,30,1,2,3;BYDAY=SU

Идея состояла в том, чтобы просто выбрать одно воскресенье между 27 ноября и 3 декабря. Это, конечно, не работает, потому что BYMONTH расширяет поиск до всех дней в ноябре и декабре, а BYMONTHDAY ограничивает поиск теми днями в обоих месяцах. То есть 1 ноября, 2 ноября ... 27 декабря, 28 декабря ..., что, конечно, не то, чего я хочу.


Далее я попытался использовать BYYEARDAY=331,332,333,334,335,336,337 вместо BYMONTHDAY и BYMONTH, но, к сожалению, мой сервер webdav (Nextcloud, который, насколько мне известно, использует Sabre. Я получил сообщение об ошибке «Недопустимое правило BYYEARDAY») не поддерживает это.


Моя следующая идея состояла в том, чтобы использовать несколько RRULE с - по крайней мере, я не видел ни одного отрывка в RFC, утверждающего, что допускается самое большее только один RRULE. Итак, я закончил с:

RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=SU;BYMONTHDAY=27,28,29,30;BYMONTH=11
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=SU;BYMONTHDAY=1,2,3;BYMONTH=12

Не сработало. Моим последним средством было создание двух отдельных VEVENT, один с первым RRULE выше и один со вторым RRULE выше, но в остальном идентичный. Это сработало, но смутило меня.

Нет лучшего решения? Как бы вы это сделали?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Если я не ошибаюсь, первое пришествие - это всегда пятое последнее воскресенье года.Таким образом, следующее правило должно помочь:

FREQ=YEARLY;BYDAY=-5SU

Смотрите следующие 10 результатов: http://recurrence -expansion-service.appspot.com / reaas? Dtstart = 20181202 & rrule = FREQ% 3DYEARLY% 3BBYDAY% 3D-5SU & max_instances = 10

Или, иначе говоря:

FREQ=YEARLY;BYDAY=SU;BYSETPOS=-5
0 голосов
/ 08 мая 2018

к сожалению, мой сервер webdav (Nextcloud, который, насколько мне известно, использует Sabre. Я получил сообщение об ошибке «Недопустимое правило BYYEARDAY») не поддерживает это.

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

Я попробовал ваши решения 2 и 3 с разными библиотеками (моя собственная lib php-rrule и rrule.js), и оба варианта, кажется, работают просто отлично.

FREQ=YEARLY;BYDAY=SU;BYYEARDAY=331,332,333,334,335,336,337

или объединение 2

FREQ=YEARLY;INTERVAL=1;BYDAY=SU;BYMONTHDAY=27,28,29,30;BYMONTH=11 FREQ=YEARLY;INTERVAL=1;BYDAY=SU;BYMONTHDAY=1,2,3;BYMONTH=12

даст оба:

2018-12-02
2019-12-01
2020-11-29
2021-11-28
2022-11-27
2023-12-03
2024-12-01
2025-11-30
2026-11-29
2027-11-28

, которые согласно Google и Википедии являются правильными датами 1-го воскресенья Адвента в ближайшие 10 лет.

примечание

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

Хотя это не строго запрещено, в RFC 5545 буквально написано каждый раз, когда RRULE упоминается:

;
; The following is OPTIONAL,
; but SHOULD NOT occur more than once.
;
rrule

Приложение A даже в "Новых ограничениях" гласит:

2.  The "RRULE" property SHOULD NOT occur more than once in a
   component.

При этом, несколько RRULE - отличная особенность, я не знаю, почему они ограничили это.

...