0

我应该使用什么 iCal RRULE 表达式来查找每月最后一个星期三之后的星期五?所以我需要 (RRULE:FREQ=MONTHLY;BYDAY=-1WE) + 2 天...

4

1 回答 1

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中仍然完全有效),您也可以将它们添加到单个事件中,但我不建议这样做。

于 2016-06-14T10:13:21.743 回答