谷歌日历以不同的方式处理相同的 ics 文件作为导入和作为 webcal 流

Posted

技术标签:

【中文标题】谷歌日历以不同的方式处理相同的 ics 文件作为导入和作为 webcal 流【英文标题】:Google Calendar processing same ics file differently as an import vs as a webcal stream 【发布时间】:2013-01-24 21:30:27 【问题描述】:

我创建了一个 webcal 流,Google 日历成功读取它,并创建了事件。但是,它创建的事件比应有的时间早 5 小时。例如,下面的事件发生在下午 1 点。

如果我采用相同的 webcal 流并将其保存为 .ics 文件,然后将该文件导入 Google 日历,则所有时间都是正确的。

为什么 Google 日历会以不同的方式处理这些问题?在 Mac 日历应用程序中,事件在正确的时间出现,无论我是通过 webcal 流添加它们,还是通过导入 .ics 文件。

Google 日历和 Mac 日历都知道我在 EST(通过日历设置 - ICS 文件中没有任何声明,如您所见)。

我希望 Google 能够正确处理 webcal 流,以便在我添加更多事件时它会自动更新。

此处列出了 ICS 文件的开头和单个事件。它在下午 6 点显示在 Mac 日历中,在下午 1 点显示在 Google 日历中。

BEGIN:VCALENDAR
CALSCALE:GREGORIAN
METHOD:PUBLISH
PRODID:iCalendar-Ruby
VERSION:2.0
BEGIN:VEVENT
DESCRIPTION: football game on Sunday at 6pm, on NBC, with dinner
DTEND:20121208T233000Z
DTSTAMP:20130124T200858
DTSTART:20121208T230000Z
CLASS:PUBLIC
SEQUENCE:0
SUMMARY:sunday 6pm football game
UID:2013-01-24T20:08:58+00:00_945022440@e8deb599-a4b6-40a3-b82c-d1baf5e9109e
END:VEVENT
END:VCALENDAR

【问题讨论】:

【参考方案1】:

这是因为 Google 日历不使用浮动时区,因此当没有指定时区时,它假定为 UTC。当您导入未在 ics 文件中指定特定时区的内容时,Mac 日历会假定您的时区。因此,您必须在文件中添加时区信息。

How Google Calendar works with time zones

Writing ICS files for multiple clients, including Google

在文件中添加 VTIMEZONE 部分应该会有所帮助:

BEGIN:VTIMEZONE
TZID:Eastern
BEGIN:STANDARD
DTSTART:16011104T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:16010311T020000
RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
END:VTIMEZONE

【讨论】:

谢谢基格。是否在时间末尾添加 Z(如 DTSTART:20121208T230000Z)表示时间为 UTC?假设情况是这样,我已经调整了我的时间。另外,我仍然不明白为什么 Google 日历在 webcal 和导入的 .ics 文件时会以不同的方式处理时区 据我所知,谷歌日历实际上并不符合 RFC:tools.ietf.org/html/rfc2445#section-4.3.5 并且在时间浮动时不应假定为 UTC 所以最后,我只是手动向 UTC 添加了一段时间(并使用 Z 表示 UTZ)来说明我的时区。这行得通,所以 gcal 和 mac 日历中的时间都是正确的。 Google 日历对 webcal 流的不可更新性使其很难使用。我什至会切换 google 帐户,并将相同的 webcal 流添加到不同的帐户 - 仍然不会更新。不确定谷歌如何处理这样的网络流,如果他们能在某处解释它会很高兴(或者如果他们让用户控制更新行为,他们会更喜欢它)。再次感谢您的浏览。

以上是关于谷歌日历以不同的方式处理相同的 ics 文件作为导入和作为 webcal 流的主要内容,如果未能解决你的问题,请参考以下文章

使用 icalendar 获取重复事件

ICS 在定期日历事件中更新这个和未来

在 android 中以编程方式使用谷歌日历添加同步事件

Web App 如何将日历事件添加到 Android 手机?

在 iOS EventKit 上以编程方式在线获取/更新谷歌日历数据

将 ics 添加到 Google 日历的链接停止工作