【问题标题】:iCalendar UNTIL rule must be of the same type as DTSTART property?iCalendar UNTIL 规则必须与 DTSTART 属性的类型相同?
【发布时间】:2016-01-21 00:42:34
【问题描述】:

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

【问题讨论】:

    标签: standards icalendar rfc5545 rrule


    【解决方案1】:

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

    第 1 部分

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

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

    第 2 部分

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

    在这种情况下,“本地时间”是指Section 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 时间还是当地时间带有时区参考(如引用的示例中)。

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

    编辑

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

    【讨论】:

    • 你说得对,我错过了“或带有本地时间和时区参考的日期”。
    • 据我所知,非 UTC UNTIL 是全天事件的典型特征。然而,Lightning(与 iOS 和 eM 客户端不同)正在为全天事件生成 UTC 时间,这看起来像一个错误:DTSTART;VALUE=DATE:20160229 RRULE:FREQ=DAILY;UNTIL=20160304T000000Z
    • 是的,这看起来像一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2017-09-10
    • 2017-03-12
    相关资源
    最近更新 更多