6

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

同样,如果我选择 1 月 31 日作为开始日期,那么任何少于 31 天的月份都将被跳过。

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

我的主要问题是,有没有办法定义一条规则,上面写着“每月 30 日重复;如果 30 日不存在,则为每月的最后一天”。我不相信有。有什么建议么?

提前致谢。

问候, 科马克

4

3 回答 3

17

答案是:FREQ=MONTHLY;BYMONTHDAY=28,29,30;BYSETPOS=-1,这意味着“每月 30 日重复;如果不存在 30 日,则为每月的最后一天”。

于 2009-02-01T17:06:28.277 回答
0

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

如果发现超出可用范围的 BYxxx 规则部分值(即,二月份的 BYMONTHDAY=30),它们将被简单地忽略。

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

于 2009-01-30T17:18:10.207 回答
0

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

如果发现超出可用范围的 BYxxx 规则部分值(即,二月份的 BYMONTHDAY=30),它们将被简单地忽略。

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

BYMONTHDAY 规则部分指定以逗号字符(ASCII 十进制 44)分隔的月份日期列表。有效值为 1 到 31 或 -31 到 -1。例如,-10 表示该月的第十天到最后一天。

于 2009-01-30T17:22:57.043 回答