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。还是我没有得到什么?
引用的段落分为三部分:
UNTIL 规则部分的值必须与“DTSTART”属性具有相同的值类型。
这是指值类型 ie VALUE=DATEvs. VALUE=DATE-TIME. 如果事件是全天事件,则UNTIL日期也必须指定为全天日期,否则UNTIL日期必须包含时间部分。
此外,如果将“DTSTART”属性指定为具有本地时间的日期,则 UNTIL 规则部分也必须指定为具有本地时间的日期。
在这种情况下,“本地时间”是指第 3.3.5 节(表格 #1)中指定的“浮动时间” ,它说:
表格 #1:日期与当地时间
具有本地时间形式的日期只是一个 DATE-TIME 值,它不包含 UTC 指示符,也不引用时区。例如,以下表示 1998 年 1 月 18 日晚上 11 点:
19980118T230000
这种类型的 DATE-TIME 值被称为“浮动”,并且不受任何时区的限制。
这也包括VALUE=DATE日期。
如果DTSTART是浮动的,即未锚定在任何特定时区,则该UNTIL值不能是绝对时间,否则规则的实际结束时间将取决于您当前的时区。
如前所述,这不适用于定义中的RRULEs VTIMEZONE。
如果将“DTSTART”属性指定为具有 UTC 时间的日期或具有本地时间和时区参考的日期,则必须将 UNTIL 规则部分指定为具有 UTC 时间的日期。
主要区别在于,这句话谈论的是绝对DTSTART时间,无论是 UTC 时间还是带有时区参考的本地时间(如引用的示例中所示)。
这是指第 3.3.5 节的表格 #2 和表格 #3 。如果 的值DTSTART对应于这些形式中的任何一种,则UNTIL必须以 UTC 时间指定该值。我认为这背后的原因是,UNTIL如果您使用“zulu”表示法,则不需要为日期指定时区(并且您不能假设您可以使用DTSTARTfor的时区UNTIL)。
编辑
由于“浮动时间”在日历客户端中并不常见,因此您几乎看不到任何非 UTCUNTIL日期。在 Thunderbird/Lightning 中,您可以为事件明确选择“本地时间”,这会创建一个浮动事件。在这种情况下,您也应该获得UNTIL本地时间的值。