2

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

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

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

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

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

建议?

更新:评论没有足够的空间来回应克里斯的回答,所以我正在编辑这个问题并提供更多信息。

抱歉不行。我不知道它是我正在使用的 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 的 DDay.iCal软件,但我认为这不是该库中的错误。我认为这可能是 iCalendar (RFC 2445) 中的一个限制。

想法?

4

2 回答 2

0

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

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

这不会处理“4 月的第一个星期日”位,它不在模式的 MWF 部分中。如果您将此特定日期设置为您的 dtStart 日期,我认为这将在第一次出现时被涵盖(但当然,明年不会再发生这种情况)。否则,我认为您可能需要第二个 RRULE:

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

这有帮助吗?

于 2009-07-16T21:28:17.830 回答
0

托德,

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

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

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

-道格

于 2010-04-22T22:02:05.197 回答