如何让iCalendar(RFC 2445)在持续时间内每年重复一次
我未能成功制定一份RRULE,该RRULE将允许如下所示的事件: 每年重复,从四月的第一个星期日到五月的最后一天,发生在星期一、星期三和星期五,直到永远 FREQ=每年;按月=4;BYDAY=SU(给我每年4月的第一个星期日) 及 FREQ=每年;按月=5;BYMONTHDAY=-1(给出每年5月的最后一天) 但我不知道如何让活动在周一、周三和周五之间每年重复一次 建议 更新:评论没有足够的空间回应Chris的回答,因此我正在编辑问题并提供更多信息 不幸的是,没有。我不知道我使用的是DDay.iCal库还是什么,但这也不起作用。我发现开始日期不能是顺序日期(第一个星期日等)……它必须是一个特定的日期,这使得我的要求很难满足。即使使用多个RRULE,它似乎也不起作用:如何让iCalendar(RFC 2445)在持续时间内每年重复一次,icalendar,rfc5545,rfc2445,Icalendar,Rfc5545,Rfc2445,我未能成功制定一份RRULE,该RRULE将允许如下所示的事件: 每年重复,从四月的第一个星期日到五月的最后一天,发生在星期一、星期三和星期五,直到永远 FREQ=每年;按月=4;BYDAY=SU(给我每年4月的第一个星期日) 及 FREQ=每年;按月=5;BYMONTHDAY=-1(给出每年5月的最后一天) 但我不知道如何让活动在周一、周三和周五之间每年重复一次 建议 更新:评论没有足够的空间回应Chris的回答,因此我正在编辑问题并提供更多信息 不幸的是,没有。我不知道我使用的是DDay.i
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
这个方法至少看起来更接近你想要达到的目标
-道格