iCalendar UNTIL规则必须与DTSTART属性的类型相同?

时间:2016-01-21 00:42:34

标签: standards icalendar rfc5545 rrule

iCalendar RFC 5545, section 3.3.10中,我看到以下UNTIL参数说明:

  

UNTIL规则部分的值必须相同         值类型为“DTSTART”属性。而且,如果         然后,将“DTSTART”属性指定为具有本地时间的日期         UNTIL规则部分也必须指定为本地日期         时间。如果将“DTSTART”属性指定为UTC日期         时间或具有当地时间和时区参考的日期,然后是         UNTIL规则部分必须指定为UTC时间的日期。

但是,在3.8.5.3 Recurrence Rule段中,UNTIL始终以UTC格式指定,不论DTSTART属性如何:

   DTSTART;TZID=America/New_York:19970902T090000
   RRULE:FREQ=DAILY;UNTIL=19971224T000000Z

   DTSTART;TZID=America/New_York:19970902T090000
   RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH

总共有5个这样的例子。

我还发现,无论DTSTART属性如何,至少有2个CalDAV客户端(iOS和Mozilla Lightning)始终以UTC格式提交UNTIL参数。

UNTIL必须始终为UTC的唯一位置是VTIMEZONE中的RRULE。或者我没有得到什么?

1 个答案:

答案 0 :(得分:3)

引用的段落分为三部分:

第1部分

  

UNTIL规则部分的值必须与" DTSTART"具有相同的值类型。属性。

这是指值类型,即VALUE=DATEVALUE=DATE-TIME。如果活动是全天活动,则UNTIL日期也必须指定为全天日期,否则UNTIL日期必须包含时间组件。

第2部分

  

此外,如果" DTSTART" property被指定为具有本地时间的日期,那么UNTIL规则部分也必须指定为具有当地时间的日期。

在此背景下"当地时间"意味着"浮动时间"如Section 3.3.5(表格#1)中所述,其中说:

  

表格#1:有本地时间的日期

     

带有本地时间表的日期只是一个DATE-TIME值   不包含UTC指示符也不引用时间   区。例如,以下代表1998年1月18日   晚上11点:

     

19980118T230000

     

这种类型的DATE-TIME值被称为"浮动"并且是   不受任何时区限制。

还包括VALUE=DATE个日期。

如果DTSTART是浮动的,即未锚定在任何特定时区,则UNTIL值不能是绝对时间,否则规则的实际结束将取决于您当前的时间时区。

如上所述,这并不适用于RRULE定义中的VTIMEZONE

第3部分

  

如果" DTSTART"属性被指定为具有UTC时间的日期或具有本地时间和时区参考的日期,然后必须将UNTIL规则部分指定为具有UTC时间的日期。

关键区别在于这句话是关于绝对DTSTART时间,无论是UTC还是当地时间时区参考(如引用的示例中所示)。

这指的是Section 3.3.5的表格#2和表格#3。如果DTSTART的值对应于任何这些表单,则必须以UTC时间指定UNTIL值。我认为背后的原因是,如果您使用" zulu"那么您不需要为UNTIL日期指定时区。符号(并且您不能假设您可以将DTSTART的时区用于UNTIL)。

修改

自"浮动时间"在日历客户端中不常见,您几乎看不到任何非UTC UNTIL日期。在Thunderbird / Lightning中,您可以明确选择"本地时间"对于一个事件,它创建一个浮动事件。在这种情况下,您应该在当地时间获得UNTIL值。