第一次降临的 RRULE

RRULE for first Advent

我目前正在尝试设置我自己的可以订阅的假期 iCalendar,因为我不想依赖第 3 方服务。

我目前正在尝试制作 VEVENT 圣诞节。第二次、第三次和第四次降临,以及圣诞假期都是直截了当的,但是我有很大的问题来模拟第一次降临。

具体问题是第一次降临可以在11月和12月(11月27日到12月3日)

我怎样才能制作一个重复事件(或者更具体地说,RRULE)来涵盖第一次降临的所有情况?

我试过的


我的第一个想法是:

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

当时的想法是只选择 11 月 27 日至 12 月 3 日之间的一个星期日。这当然不起作用,因为 BYMONTH 将搜索范围扩大到 11 月和 12 月的所有日期,而 BYMONTHDAY 将搜索范围限制在这两个月的那些日子。 IE。 11月1日,11月2日,...12月27日,12月28日,...,这当然不是我想要的


接下来,我尝试使用 BYYEARDAY=331,332,333,334,335,336,337 而不是 BYMONTHDAYBYMONTH,但不幸的是我的 webdav 服务器(Nextcloud,据我所知它使用 Saber。我有一个错误信息 "Invalid BYYEARDAY rule") 不支持这个。


我的下一个想法是使用多个 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,但其他方面相同。这有效,但让我感到困惑。

有没有更好的解决办法?你会怎么做?

unfortunately my webdav server (Nextcloud, which uses Sabre as far as I know. I got an error message "Invalid BYYEARDAY rule") does not support this.

好吧,我认为您应该提交错误报告,因为据我所知,您的解决方案是正确的并且符合 RFC 标准。

我用不同的库(我自己的库 php-rrulerrule.js)尝试了你的解决方案 2 和 3,这两个选项似乎都工作得很好。

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 和维基百科,这是未来 10 年第一个降临节星期日的正确日期。

旁注

at least I did not see any passage in the RFC stating that only one RRULE is allowed at most.

虽然没有严格禁止,但在 RFC 5545 中,字面意思是 每次 RRULE 被提及:

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

Appendix A甚至在“新限制”中指出:

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

话虽这么说,多RRULE是一个很棒的功能,我不知道他们为什么限制它。

如果我没记错的话,第一个降临节总是在一年中的最后一个星期日的第五个。所以下面的规则应该可以解决问题:

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