iCalendar YEARLY rrule没有BYMONTH值

时间:2017-03-29 04:14:50

标签: icalendar rrule

我正在构建一个接受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

2 个答案:

答案 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日只能举办一次活动。

RFC 5545, page 42说:

  

规则中未包含的信息,是确定的必要条件   各种重复实例的开始时间和日期都是从中派生出来的   开始时间(&#34; DTSTART&#34;)组件属性。例如,   &#34; FREQ = YEARLY; BYMONTH = 1&#34;没有指定日内的特定日期   一个月或一个时间。这些信息与实际情况相同   指定为&#34; DTSTART&#34;。

因此,在您的情况下,规则不指定月份,因此它从开始日期继承。在你的情况下,8月。

查看我们的库为此活动生成的实例:FREQ=YEARLY;BYMONTHDAY=14