除每月最后一周外,每隔一周 RRULE

问题描述

除了该月的最后一周之外,我每隔一个星期六都需要一个 RRULE。我试图以每周的频率创建一个,但不知道如何为该月的最后一周应用例外:

RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=SA

我还尝试创建一个每月频率的规则,这让我可以跳过该月的最后一周,但我不知道如何每隔一周创建一次:

RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=SA;BYSETPOS=-2,-3,-4,-5

我查看了规范,但没有看到任何使这成为可能的东西。

解决方法

这里解决方案的秘诀是 BYMONTHDAY 可以像 BYSETPOS 一样为负数。这允许人们排除每个月的最后 7 天,即使该月的天数有所不同。你的 DTSTART 应该在星期六,所以你真的不需要 BYDAY=SA

此规则适用于谷歌日历(如果 DTSTART 是在星期六,并且通常适用于每第二周的任何时间,但不是 DTSTART 指定的一周中任何一天的最后一周规则):

RRULE:FREQ=WEEKLY;INTERVAL=2;BYMONTHDAY=-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31

查看测试日历: https://calendar.google.com/calendar/u/0?cid=ZXBwdWE4N2RwZm5xODVic3JydDJzaXFsY3NAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ

规格:https://datatracker.ietf.org/doc/html/rfc2445#page-43

https://icalevents.com/2447-need-to-know-the-possible-combinations-for-repeating-dates-an-ical-cheatsheet/ 用于扩展和收缩(限制)规则和组合