Calendar 重复规则定义(RFC2445)问题

Calendar 重复规则定义(RFC2445)问题,calendar,rule,recurrence,rfc2445,Calendar,Rule,Recurrence,Rfc2445,我正在使用Google的RFC2445实现()来实现重复规则。如果我定义从1月30日开始的每月复发,则将完全跳过少于30天(即2月)的月份。因此,谷歌API将返回1月30日、3月30日、4月30日等,这并不好。我希望它会回来:1月30日,2月28日,3月30日,4月30日 类似地,如果我选择1月31日为开始日期,则任何少于31天的月份都将被跳过 根据RFC2445规范,这可能是正确的,也可能是一个错误。你觉得怎么样 我的主要问题是,有没有办法定义一条规则,即“在每个月的30日重现;或者如果30日

我正在使用Google的RFC2445实现()来实现重复规则。如果我定义从1月30日开始的每月复发,则将完全跳过少于30天(即2月)的月份。因此,谷歌API将返回1月30日、3月30日、4月30日等,这并不好。我希望它会回来:1月30日,2月28日,3月30日,4月30日

类似地,如果我选择1月31日为开始日期,则任何少于31天的月份都将被跳过

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

我的主要问题是,有没有办法定义一条规则,即“在每个月的30日重现;或者如果30日不存在,则在每月的最后一天重现”。我不相信有。有什么建议吗

提前谢谢

问候,, Cormac

嗯,从自身来看,你所看到的行为显然是正确的:

如果发现BYxxx规则部分值超出了可用范围(即2月份的BYMONTHDAY=30),则将忽略这些值


我能想到的唯一解决办法是使用多个定期规则,即每个月30日一个,2月最后一天另一个。

关于RFC跳过这些日期,你似乎是对的。如果您的
DTSTART
是1月31日,并且您没有在定期规则中指定
BYMONTHDAY
(或者如果
BYMONTHDAY
是在31日),那么在没有这一天的月份,它只会忽略该规则:

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

但是,您应该能够通过monthday为
指定-1,并让它使用当月的最后一天,不管它是什么

BYMONTHDAY规则部分指定 逗号字符(ASCII十进制44) 一个月中天数的单独列表。 有效值为1到31或-31到-1。 例如,-10代表第十位 直到这个月的最后一天


答案是:FREQ=每月;BYMONTHDAY=28,29,30;BYSETPOS=-1,翻译为“每月30日重现;如果30日不存在,则在当月最后一天重现”。

负数几乎起作用;提问者想要-2个月加31天,-1个月加30天(或29或28天)。更接近……这是真的,我认为这是不可能的,但他自己找到了BYSETPOS,这正是他想要的。你能解释一下为什么BYMONTHDAY=28,29,30转换为每月30日,而不是28、29和30日吗?这是因为BYSETPOS语法。更准确的翻译是“在给定月份存在的集合28、29、30的最后(-1)个位置重复出现”。因此,如果第30个不存在,则集合中的最后一个有效项为29。如果那不存在,那是28。很好的发现,@Cormac Redmond!有谁能给我指点一些关于定期规则的文档吗?我好像找不到。