在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。或者我没有得到什么?
答案 0 :(得分:3)
引用的段落分为三部分:
UNTIL规则部分的值必须与" DTSTART"具有相同的值类型。属性。
这是指值类型,即VALUE=DATE
与VALUE=DATE-TIME
。如果活动是全天活动,则UNTIL
日期也必须指定为全天日期,否则UNTIL
日期必须包含时间组件。
此外,如果" 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
。
如果" DTSTART"属性被指定为具有UTC时间的日期或具有本地时间和时区参考的日期,然后必须将UNTIL规则部分指定为具有UTC时间的日期。
关键区别在于这句话是关于绝对DTSTART
时间,无论是UTC还是当地时间时区参考(如引用的示例中所示)。
这指的是Section 3.3.5的表格#2和表格#3。如果DTSTART
的值对应于任何这些表单,则必须以UTC时间指定UNTIL
值。我认为背后的原因是,如果您使用" zulu"那么您不需要为UNTIL
日期指定时区。符号(并且您不能假设您可以将DTSTART
的时区用于UNTIL
)。
修改强>
自"浮动时间"在日历客户端中不常见,您几乎看不到任何非UTC UNTIL
日期。在Thunderbird / Lightning中,您可以明确选择"本地时间"对于一个事件,它创建一个浮动事件。在这种情况下,您应该在当地时间获得UNTIL
值。