4

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。还是我没有得到什么?

4

1 回答 1

5

引用的段落分为三个部分:

第1部分

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

这指的是值类型,即VALUE=DATEvs. VALUE=DATE-TIME。如果事件是全天事件,则UNTIL日期也必须指定为全天日期,否则UNTIL日期必须具有时间组件。

第2部分

此外,如果“DTSTART”属性被指定为带有本地时间的日期,那么 UNTIL 规则部分也必须被指定为带有本地时间的日期。

在这种情况下,“本地时间”是指第 3.3.5 节(表格#1)中指定的“浮动时间” ,其中说:

表格 #1:日期与当地时间

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

19980118T230000

这种类型的 DATE-TIME 值被称为“浮动”,并且不特别绑定到任何时区。

这也包括VALUE=DATE日期。

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

如前所述,这不适用于定义中RRULE的 s VTIMEZONE

第 3 部分

如果“DTSTART”属性指定为带有 UTC 时间的日期或带有本地时间和时区参考的日期,则 UNTIL 规则部分必须指定为带有 UTC 时间的日期。

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

这指的是第 3.3.5 节的表格 #2 和表格 #3 。如果 的值DTSTART对应于这些形式中的任何一种,则UNTIL必须以 UTC 时间指定该值。我认为这背后的原因是,UNTIL如果您使用“zulu”表示法,则不需要为日期指定时区(并且您不能假设您可以使用DTSTARTfor的时区UNTIL)。

编辑

由于“浮动时间”在日历客户端中并不常见,因此您几乎看不到任何非 UTCUNTIL日期。在 Thunderbird/Lightning 中,您可以为事件显式选择“本地时间”,这会创建一个浮动事件。在这种情况下,您也应该UNTIL在当地时间获得一个值。

于 2016-01-21T10:36:01.897 回答