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

IT *_*DAV 4 standards icalendar rrule rfc5545

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
Run Code Online (Sandbox Code Playgroud)

总共有5个这样的例子。

我还发现至少有 2 个 CalDAV 客户端(iOS 和 Mozilla Lightning)总是以 UTC 格式提交 UNTIL 参数,而不管 DTSTART 属性如何。

UNTIL 必须始终使用 UTC 的唯一地方是 VTIMEZONE 中的 RRULE。还是我没有得到什么?

Mar*_*ten 5

引用的段落分为三部分:

第1部分

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

这是指值类型 ie 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值不能是绝对时间,否则规则的实际结束时间将取决于您当前的时区。

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

第 3 部分

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

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

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

编辑

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