如果当天不是BYDAY指定的日期,如何从生成的事件中排除DTSTART?

时间:2016-02-04 09:41:08

标签: icalendar rfc5545 rfc2445 rrule

我正在使用google-rfc-2445根据rfc-2445生成重复事件:

  

“VEVENT”的“DTSTART”属性指定包含的开始   事件。对于重复发生的事件,它也指定了第一个   重复集中的实例。

因此,例如每周五发生5次事件的RRULE:

DTSTART;TZID=US-Eastern:20160204T090000
RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=FR;INTERVAL=1;

因此根据rfc-2445,它将生成6个事件。 Thursday 4 February 2016上的第一个事件,Friday 5 February 2016上的第二个事件,依此类推。

如果它不在某种模式中,我怎样才能实现排除第一个事件?在上面的示例中,它应排除第一次出现4 February 2016。如果定义星期五的DTSTART;TZID=US-Eastern:20160205T090000,它应该首先出现。

是否可以通过在RRULE本身中定义此类“排除规则”来完成,或者我需要检查代码,如果DTSTART与{{1}中定义的日期不同我应该在代码中查找最接近的日期(手动)并相应地更改BYDAY

更新 好吧,根据rfc-2445以及谷歌小组的这个问题:https://groups.google.com/forum/#!topic/google-rfc-2445/xqYFe411ysA

  

“EXDATE”属性可用于排除
中指定的值   “DTSTART”。但是,在这种情况下,原始的“DTSTART”日期必须是   仍然由日历和日程安排系统维护,因为
  原始“DTSTART”值具有其他的固有使用依赖性   诸如“RECURRENCE-ID”之类的属性。

看起来我需要使用DTSTART属性来实现我的需要。尝试通过遵循RRULE来实现这一目标:

EXDATE

以下代码中的开始日期为:EXDATE;TZID=Asia/Jerusalem:20160210T000000 RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=WE;INTERVAL=1;

2016-02-10T00:00:00.000+02:00

但它只返回4个事件,因此始终删除第一个事件。

1 个答案:

答案 0 :(得分:1)

根据您提供的问题的描述,当添加DTSTART时您将获得6个事件,并且当它是 good时,您不希望它成为实例列表和5个事件的一部分日期。

所以你想要的只是获得最后 5个事件,这可以通过使用BYSETPOS中的RRULE来实现,以下应该可以做到这一点:< / p>

  

BYSETPOS = -5,-4,-3,-2,-1

在所有情况下都会返回RRULE给出的最后5个事件,无论DTSTART是否与RRULE的模式匹配。