第一次降临的 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
而不是 BYMONTHDAY
和 BYMONTH
,但不幸的是我的 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-rrule
和 rrule.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
我目前正在尝试设置我自己的可以订阅的假期 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
而不是 BYMONTHDAY
和 BYMONTH
,但不幸的是我的 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-rrule
和 rrule.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