如何使iCalendar(RFC 2445)重复持续时间

时间:2009-07-09 22:21:33

标签: icalendar rfc5545 rfc2445

我未能成功制定允许如下所示事件的RRULE:

从4月的第一个星期日到5月的最后一天重复,周一,周三和周五,直到永远。

FREQ = YEARLY; BYMONTH = 4; BYDAY = SU (给我4月的第一个星期日重复)

FREQ = YEARLY; BYMONTH = 5; BYMONTHDAY = -1 (给我五月的最后一天重复一年)

但我无法弄清楚如何在周一,周三和周五的这些日期之间每年重复一次。

建议?

更新:评论没有足够的空间来回应Chris的答案,因此我正在编辑问题并提供更多信息。

不幸的是,没有。我不知道它是否是我正在使用的DDay.iCal库,或者是什么,但这也不起作用。我发现日期开始不能是一个序数日期(第一个星期日等)..它必须是一个特定的日期,这使我的要求很难。即使使用多个RRULE,它似乎也不起作用:

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:-//DDay.iCal//NONSGML ddaysoftware.com//EN 
BEGIN:VEVENT 
CREATED:20090717T033307Z 
DTSTAMP:20090717T033307Z 
DTSTART:20090101T000000 
RRULE:FREQ=YEARLY;WKST=SU;BYDAY=MO,WE,FR;BYMONTH=4,5 
RRULE:FREQ=YEARLY;WKST=SU;BYDAY=1SU;BYMONTH=4 
RRULE:FREQ=YEARLY;WKST=SU;BYMONTH=5;BYMONTHDAY=-1 
SEQUENCE:0 
UID:352ed9d4-04d0-4f06-a094-fab7165e5c74 
END:VEVENT 
END:VCALENDAR

看起来正好(我甚至在2009年1月1日开始活动),但是当我开始测试某些日子是否有效时,我得到的结果不正确。

例如,

4/1/2009 12:00:00 AM = True   // Should be False
4/6/2009 12:00:00 AM = True  
4/7/2009 12:00:00 AM = False
4/8/2009 12:00:00 AM = True
5/1/2009 12:00:00 AM = True
5/2/2009 12:00:00 AM = False
5/29/2009 12:00:00 AM = True
5/31/2009 12:00:00 AM = True  // Should be False
6/1/2009 12:00:00 AM = False

我正在使用Douglas Day's DDay.iCal软件,但我不认为它是该库中的错误。我认为这可能是iCalendar(RFC 2445)的限制。

思想?

2 个答案:

答案 0 :(得分:0)

尝试使用BYMONTH规则来指定您在四月和五月只需要它:

RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=MO,WE,FR;BYMONTH=4,5;WKST=SU

这不会处理“四月的第一个星期日”位,这不在该模式的MWF部分。我认为如果您将此特定日期设置为dtStart日期(但当然,这将不会在下一年重复出现),这将首次出现。否则,我认为您可能需要第二个RRULE:

RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4;WKST=SU

这有帮助吗?

答案 1 :(得分:0)

托德,

如上所述使用3个RRULE将产生结果的并集,而不是交集。你是对的,RFC2445 / 5545中没有一种非常优雅的方式。但是,如果您能够在生成事件时以编程方式计算4月的第一个星期日,则以下情况应该有效:

DTSTART:20090405T000000
RRULE:FREQ=YEARLY;BYDAY=MO,WE,FR;UNTIL=20090531T000000Z

这种方法至少看起来更接近你想要实现的目标。

-Doug