DST 期间的 iCalendar 时区定义

iCalendar timezone definition for DST period

根据定义,欧洲夏令时从三月的最后一个星期日开始,到十月的最后一个星期日结束

参见:https://en.wikipedia.org/wiki/Summer_Time_in_Europe

从 thunderbird 的闪电日历生成的 iCalendar 事件使用带有 1970 年时间戳的时区定义

BEGIN:VTIMEZONE
TZID:Europe/Prague
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
END:STANDARD
END:VTIMEZONE

因为每年三月和十月的最后一个星期日可能不会是同一天,每年的日期应该不一样吧?

例如 2016 年:

BEGIN:VTIMEZONE
TZID:Europe/Prague
BEGIN:DAYLIGHT
...
DTSTART:20160327T020000
...
END:DAYLIGHT
BEGIN:STANDARD
...
DTSTART:20161030T030000
...
END:STANDARD
END:VTIMEZONE

是对的还是我遗漏了什么?

DTSTART表示开始日期,但之后RRULE用于计算所有下一次出现。

RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3

这意味着:

  1. 每年重复
  2. 每 3 个月
  3. 当月的最后一个星期日