我应该使用什么 iCal RRULE 表达式来查找每月最后一个星期三之后的星期五?所以我需要 (RRULE:FREQ=MONTHLY;BYDAY=-1WE) + 2 天...
1 回答
我同意 Evert 的观点,即使用单个 RRULE 是不可能的。
但是,您可以通过组合多个 RRULE 来实现这一目标。
这样,您可以将您的事件拆分为多个事件,每个事件具有以下 RRULE 之一:
如果星期三是一个月的最后一天或第二个最后一天,我们的星期五将是下个月的第一天或第二天
FREQ=MONTHLY;BYMONTHDAY=1,2;BYDAY=1FR
在有 31 天的月份中,上周三的最早日期是 25 日,因此下周五将是第 27-31 天之一:
FREQ=MONTHLY;BYMONTH=1,3,5,7,8,10,12;BYMONTHDAY=27,28,29,30,31;BYDAY=FR
在有 30 天的月份中,上周三的最早日期是 24 日,因此下周五将是 26-30 天之一:
FREQ=MONTHLY;BYMONTH=4,6,9,11;BYMONTHDAY=26,27,28,29,30;BYDAY=FR
二月是一个棘手的问题,因为在非闰年,我们想要的星期五将在 24 日和 28 日之间,但在闰年,它在 25 日和 29 日之间。然而,在接下来的 50 年内,只有一个闰年,其中 2 月 24 日是星期五,也就是 2040 年(查看FREQ=MONTHLY;BYMONTHDAY=24;BYMONTH=2;BYDAY=FR的结果),所以以下RRULE 在 2040 年之前都是正确的:
FREQ=MONTHLY;BYMONTH=2;BYMONTHDAY=24,25,26,27,28,29;BYDAY=FR
如果您担心闰年,请添加如下所示的 EXDATE,这样您就可以在接下来的 100 年中受益(如果您的开始日期有时间,请设置这些 DATE-TIME 值):
EXDATE;VALUE=DATE:20400224,20680224,20960224,21080224
如果您确定您的客户支持多个 RRULE(这在RFC 5545中已被半心半意地弃用,但在RFC 2445中仍然完全有效),您也可以将它们添加到单个事件中,但我不建议这样做。