如何让iCalendar(RFC 2445)在持续时间内每年重复一次

如何让iCalendar(RFC 2445)在持续时间内每年重复一次,icalendar,rfc5545,rfc2445,Icalendar,Rfc5545,Rfc2445,我未能成功制定一份RRULE,该RRULE将允许如下所示的事件: 每年重复,从四月的第一个星期日到五月的最后一天,发生在星期一、星期三和星期五,直到永远 FREQ=每年;按月=4;BYDAY=SU(给我每年4月的第一个星期日) 及 FREQ=每年;按月=5;BYMONTHDAY=-1(给出每年5月的最后一天) 但我不知道如何让活动在周一、周三和周五之间每年重复一次 建议 更新:评论没有足够的空间回应Chris的回答,因此我正在编辑问题并提供更多信息 不幸的是,没有。我不知道我使用的是DDay.i

我未能成功制定一份RRULE,该RRULE将允许如下所示的事件:

每年重复,从四月的第一个星期日到五月的最后一天,发生在星期一、星期三和星期五,直到永远

FREQ=每年;按月=4;BYDAY=SU(给我每年4月的第一个星期日)

FREQ=每年;按月=5;BYMONTHDAY=-1(给出每年5月的最后一天)

但我不知道如何让活动在周一、周三和周五之间每年重复一次

建议

更新:评论没有足够的空间回应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
我正在使用软件,但我不认为它是该库中的一个bug。我认为这可能是iCalendar(RFC 2445)中的一个限制


想法?

尝试按月份规则,以指定您只希望在4月和5月进行:

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

这有帮助吗?

请尝试按月份规则,指定您只希望在4月和5月使用它:

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
这有用吗?

托德

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

DTSTART:20090405T000000
RRULE:FREQ=YEARLY;BYDAY=MO,WE,FR;UNTIL=20090531T000000Z
这个方法至少看起来更接近你想要达到的目标

-道格

托德

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

DTSTART:20090405T000000
RRULE:FREQ=YEARLY;BYDAY=MO,WE,FR;UNTIL=20090531T000000Z
这个方法至少看起来更接近你想要达到的目标

-道格