使用BYDAY和BYSETPOS进行RRULE解释

Dor*_*zyk 1 sql date rrule

我正在尝试解析一个RRULE并显示一个月内重复事件有效的几周.我查看了RFC2445 doc(http://www.ietf.org/rfc/rfc2445.txt)并且不是那么清楚.

我知道例如规则:

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,FR,WE;BYSETPOS=10,11,12,7,8,9,1,2,3,4,5,6
Run Code Online (Sandbox Code Playgroud)

是星期三,星期五,星期五,在本月的第1,第2,第3和第4周.

要么

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO;BYSETPOS=3,4,5,6;
Run Code Online (Sandbox Code Playgroud)

是在本月的第2周和第3周的周一和周二.

要么

RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,WE;BYSETPOS=-1,-2
Run Code Online (Sandbox Code Playgroud)

是在本月的最后一周的周三和周四.

我通过另一个程序生成了这些,但我不确定它是如何实际生成它们的.

因此,我遇到的问题是了解BYSETPOS如何描述一个月的复发周.最终目标是能够解析如上所述的RRULE并显示如下:

对于: RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,FR,WE;BYSETPOS=10,11,12,7,8,9,1,2,3,4,5,6

节目: Thur,Friday,Wed on week:1,2,3,4

对于: RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO;BYSETPOS=3,4,5,6;

节目: Tues, Monday on week:2,3

对于: RRULE FREQ=MONTHLY;INTERVAL=1;BYDAY=TH,WE;BYSETPOS=-1,-2

节目: Whu,Wed on last week

最好的解决方案是objective-c中的一个字符串,但是如果它是另一种C语言,我可以弄明白.即使只是解释BYSETPOS如何与BYDAY一起工作也会很棒.

Arn*_*aud 5

因此,我遇到的问题是了解BYSETPOS如何描述一个月的复发周.

一旦计算出与规则剩余部分相对应的实例,BYSETPOS就不代表周数,而只代表第n个实例.例如,FREQ=MONTHLY;INTERVAL=1;BYDAY=TU,MO对应于每月的每个星期一和星期二,每月.因此,对于每个月,您首先计算一组(例如,如果您参加2014年7月,则为9个条目).然后BYSETPOS为您提供应该保留的集合中的"索引",-1,-2表示集合中的最后2个条目.

继续2014年7月的示例,基本规则将返回以下集合:(7月1日,7日,8日,14日,15日,21日,22日,28日,29日).鉴于BYSETPOS = 1,2,-1,-2,我们将保留7月1日,7日,28日和29日.

您想查看http://tools.ietf.org/html/rfc5545,它废弃了RFC2245,并对重复规则有更详细的描述.

  • 我能说明一下“ BYDAY = MO; BYSETPOS = -1”是否与“ BYDAY = -1MO”相同吗? (2认同)