2

我正在使用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 个事件。第一个事件 on Thursday 4 February 2016,第二个事件 on Friday 5 February 2016,依此类推。

如果它不在模式中,我如何实现它将排除第一个事件?在上面的示例中,它应该排除第一次出现的4 February 2016. 如果定义DTSTART;TZID=US-Eastern:20160205T090000哪个是星期五,则应保留第一次出现。

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

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

“EXDATE”属性可用于排除
“DTSTART”中指定的值。然而,在这种情况下,原始“DTSTART”日期
仍必须由日历和调度系统维护,因为
原始“DTSTART”值与其他属性(例如“RECURRENCE-ID”)具有内在的使用依赖性。

看起来我需要使用EXDATE属性来实现我需要的东西。尝试通过遵循 RRULE 来实现这一点:

EXDATE;TZID=Asia/Jerusalem:20160210T000000 
RRULE:FREQ=WEEKLY;COUNT=5;BYDAY=WE;INTERVAL=1;

开始日期是:2016-02-10T00:00:00.000+02:00在以下代码中:

DateTimeIterable dti = DateTimeIteratorFactory.createDateTimeIterable(RRULE, DTSTART, dateTimeZone, true);

但它只返回 4 个事件,所以它总是删除第一个事件。

4

1 回答 1

1

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

因此,您想要的是仅获取最后5 个事件,这可以通过使用BYSETPOSin your来实现RRULE,以下应该可以解决问题:

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

这将在所有情况下返回您RRULE提供的最后 5 个事件,无论它是否与DTSTART您的模式匹配RRULE

于 2016-03-28T07:59:42.490 回答