我正在使用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日不存在则在该月的最后一天”。我不相信有。有什么建议吗?
提前致谢。
此致 科马克
答案 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表示第十个 到了月底的最后一天。