我正在构建一个接受icalendar事件并计算所有重复事件的事件。
我发现了一个问题,每个月都会给我一些年度事件。 这些事件有一个年度频率,但只有一个月没有月值。
这是否在RFC-5545中指定,或者这只是我的日历工具中的错误。 (PS:这实际上是在我的Google日历中,此事件在那里正确显示)
BEGIN:VEVENT
DTSTART;VALUE=DATE:20110814
DTEND;VALUE=DATE:20110815
RRULE:FREQ=YEARLY;BYMONTHDAY=14
DTSTAMP:20170328T223152Z
UID:388B4AE8602346DAA7BD9C1906FC390200000000000000000000000000000000
CREATED:20110610T073603Z
DESCRIPTION:
LAST-MODIFIED:20160811T230008Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Some BDAY
TRANSP:OPAQUE
CATEGORIES:http://schemas.google.com/g/2005#event
BEGIN:VALARM
ACTION:AUDIO
TRIGGER:-P1DT15H
ACKNOWLEDGED:20160811T230006Z
ATTACH;VALUE=URI:Basso
UID:26C6C0F7-8B77-4E20-8EFD-E82A614B0751
X-WR-ALARMUID:26C6C0F7-8B77-4E20-8EFD-E82A614B0751
END:VALARM
BEGIN:VALARM
ACTION:NONE
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
END:VALARM
END:VEVENT
答案 0 :(得分:1)
在RFC 5545中 - 确切地说page 44 - BYMONTHDAY
被指定为扩展年度规则,即生成每年只有1个的更多结果。< / p>
此外,在the next page上,它给出了一个必须如何评估一个规则的例子:
DTSTART;TZID=America/New_York:19970105T083000 RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9; BYMINUTE=30
首先,“INTERVAL = 2”将应用于“FREQ = YEARLY” 到达“每隔一年”。然后,将应用“BYMONTH = 1” 到达“每年一月,每隔一年”。然后,“BYDAY = SU” 将适用于“每年1月的每个星期日到达” 另一年“。然后,”BYHOUR = 8,9“将适用于到达 “每个星期日,每个星期日上午8点和上午9点,每隔一年”。 然后,“BYMINUTE = 30”将被应用于“每周日” 1月上午8:30和9:30,每隔一年“。
正如您所看到的,即使FREQ是年度,该规则将返回“每年的每个星期日上午8点和上午9点,每隔一年”,即每两年发生一次以上。简而言之,扩展 FREQ行为的概念。
现在适用于此规则:
RRULE:FREQ = YEARLY; BYMONTHDAY = 14
这意味着“每个月的第14个,每年”。所以你每年会发生12次。
编辑:话说回来后,BYMONTHDAY的定义是:
BYMONTHDAY规则部分指定以COMMA分隔的月份日期列表。
这可以解释为“ 月份的天数列表”,如“仅{em> {/ 1>}属性指定的月份”。然而,这种解释对于FREQ的其他值(每月,每天等)都没有意义,所以这只是FREQ = YEARLY的一个特殊情况而且BYMONTH丢失了...我个人认为这不正确,但是我必须承认RFC有点含糊不清。
不幸的是,没有任何BYMONTHDAY的例子,FREQ = YEARLY 没有 BYMONTH,所以没有明确的答案
结论:为了避免任何问题,如果您只想要“给定月份的第14天”,则应添加DTSTART
。
回答您的评论
规则“FREQ = MONTHLY; BYMONTHDAY = 14”确实产生相同的结果。 INTERVAL大于1或其他BYxxx时会出现差异。
答案 1 :(得分:0)
IMO FREQ=YEARLY;BYMONTHDAY=14
每年8月14日只能举办一次活动。
规则中未包含的信息,是确定的必要条件 各种重复实例的开始时间和日期都是从中派生出来的 开始时间(&#34; DTSTART&#34;)组件属性。例如, &#34; FREQ = YEARLY; BYMONTH = 1&#34;没有指定日内的特定日期 一个月或一个时间。这些信息与实际情况相同 指定为&#34; DTSTART&#34;。
因此,在您的情况下,规则不指定月份,因此它从开始日期继承。在你的情况下,8月。
查看我们的库为此活动生成的实例:FREQ=YEARLY;BYMONTHDAY=14