重复规则定义(RFC2445)问题

时间:2009-01-30 17:02:28

标签: calendar rule recurrence rfc2445

我正在使用Google的RFC2445实现(http://code.google.com/p/google-rfc-2445/)来实现重复规则。如果我定义从1月30日开始的每月复发,则将完全跳过少于30天(即2月)的月份。所以Google API将于1月30日,3月30日,4月30日等回归。不太好。我希望它能回归:1月30日,2月28日,3月30日,4月30日。

同样,如果我选择了1月31日的开始日期,则会跳过少于31天的任何月份。

根据RFC2445规范,这可能是正确的,也可能是错误。你觉得怎么样?

我的主要问题是,是否有任何方法可以定义一条规则,即“每月30日复发;或者如果30日不存在则在该月的最后一天”。我不相信有。有什么建议吗?

提前致谢。

此致 科马克

3 个答案:

答案 0 :(得分:17)

答案是:FREQ = MONTHLY; BYMONTHDAY = 28,29,30; BYSETPOS = -1,转换为“每月30日复发;或者如果30日不存在,则为月末最后一天”

答案 1 :(得分:0)

好吧,看看RFC 2445本身,你看到的行为肯定是正确的:

  

如果发现BYxxx规则部分值超出可用范围(即2月份BYMONTHDAY = 30),则忽略它们。

我能想到的唯一解决方案是使用多个重复规则,即每月30日一次,2月最后一天另一次。

答案 2 :(得分:0)

看起来你对跳过那些日期的RFC是正确的。如果您的DTSTART是1月31日,并且您没有在重复规则中指定BYMONTHDAY(或者如果BYMONTHDAY在31日),那么它将完全忽略该规则没有这一天的月份:

  

如果找到BYxxx规则部件值   超出可用范围   (即,二月份的BYMONTHDAY = 30),他们   简直被忽略了。

然而,您应该能够为BYMONTHDAY指定-1并让它使用该月的最后一天,无论它可能发生什么。

  

BYMONTHDAY规则部分指定a   COMMA字符(ASCII十进制44)   分开的月份列表。   有效值为1到31或-31到-1。   例如,-10表示第十个   到了月底的最后一天。