为什么这个RRULE的重复天数不正确?

时间:2017-11-28 17:18:59

标签: calendar google-calendar-api icalendar

这应该是一个2小时50分钟的活动,从太平洋标准时间下午5点开始,周四晚上每周重复一次。当导入谷歌日历或Evolution时,第一次出现是正确的,但随后的几周将在周三举行。

DTSTART:20170908T000000Z
DTEND:20170908T025000Z
RRULE:FREQ=WEEKLY;UNTIL=20171201T080000Z;BYDAY=TH

我的应用程序生成的其他事件会在多天发生,即BYDAY=TH,TU,因此只需删除BYDAY就不能解决我的问题。

1 个答案:

答案 0 :(得分:1)

您正在混合事件的时区和显示时区。就重复计算而言,唯一重要的是你在VEVENT中声明的时区。在这里您使用的是UTC。所以:

第一个例子是20170908,即星期五。从那里,你要求每个星期四复发。 20170908之后的下一个星期日是20170914,所以下一个例子开始于20170914T000000Z。

以PST的显示时区查看时,此事件确实是周四晚上的第一个实例。但是,如上所述,第二个实例是星期四UTC时间,所以在太平洋标准时间星期三。

除了这个特殊问题,您还需要担心夏令时的变化。如果您的活动确实发生在PST时区,那么上述事件将在DST转换发生后的11月份发生时间变化。

因此,使用UTC(Zulu)时间来表达重复事件几乎绝不是一个好主意。

您的活动应以当地时间表示时区,即使用:

DTSTART;TZID="America/Los_Angeles":20170907T170000