我们的团队一直在研究一种表示重复的正确方法,我们偶然发现了 RRule https://www.rfc-editor.org/rfc/rfc2445(在 iCalendar rfc 中指定)。
我正在尝试编写一个规则,它允许我生成距每个月的第一天 29 天的日期。所以它看起来像这样:jan29,mar1,mar29,apr29。
这里正确的 RRule 表达式是什么?还是有可能?
我们的团队一直在研究一种表示重复的正确方法,我们偶然发现了 RRule https://www.rfc-editor.org/rfc/rfc2445(在 iCalendar rfc 中指定)。
我正在尝试编写一个规则,它允许我生成距每个月的第一天 29 天的日期。所以它看起来像这样:jan29,mar1,mar29,apr29。
这里正确的 RRule 表达式是什么?还是有可能?
您应该知道RFC5545取代了 RFC2445。
要解决闰年问题,您应该使用RRULE
和BYYEARDAY
使用负偏移量。
因此,首先指定一年中的第 29 天,然后指定第 60 天(31(对于 1 月)+ 29(对于 2 月 1 日之后)),然后从年末开始计算闰年:
BYYEARDAY
列表中 12 月 31 日的偏移量是:-1从中RRULE
写入属性如下:
RRULE:FREQ=YEARLY;BYYEARDAY=29,60,-278,...,-33,-3
一种选择是RRULE
使用INTERVAL=29
. 就像是:
RRULE:FREQ=DAILY;INTERVAL=29
并非所有 iCalendar 客户端都支持无限重复集,因此您还应该包含一个UNTIL
或COUNT
组件以满足您的需求。
不,无效日期会被 RRULE 丢弃。所以即使你可以这样做:
RRULE:FREQ=MONTHLY;BYMONTHDAY=29
每年二月都会跳过它(闰年除外)。
可以为 1 个事件指定多个 RRULE,但实际上很少有日历软件支持这一点。