iCalendar在第一个周末的多个月中每两年发生一次的事件的重复规则

时间:2014-03-20 21:14:35

标签: icalendar

是否可以在一个RRULE中指定每两年多个月的第一个周末日发生的事件?使用二月和九月作为测试用例,我的第一个想法是:

FREQ=YEARLY;DTSTART=20140320T070000Z;INTERVAL=2;BYSETPOS=1;BYMONTH=2,9;BYDAY=SA,SU

但BYSETPOS仅将设置减少到2月份。在我发布here之后,我认为将频率更改为每月会发挥作用,但每隔一年应用一次间隔2会使事情变得混乱,因为间隔应用于每月频率而不是每年频率。

我这是一个新问题,因为我在原始问题中没有包含间隔。

我认为将其拆分为多个套圈会起作用,但这会大大增加我的应用程序的这个区域的复杂性,所以我希望有一个年度频率的单个套件。

谢谢!

3 个答案:

答案 0 :(得分:0)

FWIW,并且由于您将其视为潜在的解决方法,RFC5545已删除了在单个VEVENT / VTODO(https://tools.ietf.org/html/rfc5545#section-3.6.1)中具有多个RRULE属性的功能。它存在于RFC2445中。

然后,除非有人找到一个非常优雅和简单的解决方案,否则你可能会留下一些令人费解的东西,以至于大多数客户都会对它进行抨击(不知道互操作性对你来说很重要)。

我认为这有两个选择:

  • 使用2个不同的事件(可能与RELATED-TO属性相关联)
  • 或者,如果您可以将事件绑定到特定数量的实例,请将其表示为一组RDATE(或RRULE + RDATE,或RRULE + EXDATE等...)。

答案 1 :(得分:0)

像这样添加BYSETPOS可能会按预期工作:

FREQ=YEARLY;INTERVAL=2;BYMONTH=2,9;BYDAY=+1SA,+1SU;BYSETPOS=1,3

答案 2 :(得分:0)

您可以尝试的是利用bysetpos允许您在一年内选择规则的选定实例,然后您可以将实例数限制为该月的第一周(通过设置天数为了避免月份有更多或更少周的情况,这可以让你选择一年中的第一个和第三个实例。

然后给出:

DTSTART:20140320T060000Z FREQ=YEARLY;INTERVAL=2;WKST=MO;BYSETPOS=1,3;BYMONTH=2,9;BYMONTHDAY=1,2,3,4,5,6,7;BYDAY=SA,SU

将是:

Sat 2014/Sept/6
Sat 2016/Feb/6
Sat 2016/Sep/3
...
Sun 2024/Sep/1

使用dateutil-python和http://jkbr.github.io/验证了这一点,