如何在月的最后一个星期三之后找到星期五?

时间:2016-06-10 14:13:31

标签: icalendar rrule

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

1 个答案:

答案 0 :(得分:1)

我同意Evert的说法,单个RRULE是不可能的。

但是,您可以通过组合多个RRU来实现这一目标。

通过这种方式,您可以将事件分成多个事件,每个事件都有以下一个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中仍然完全有效),您可以将它们添加到单个事件中,但是我不推荐这样做。