使用正确的时区将ICS导入Google日历

ses*_*ped 7 import icalendar timezone calendar

我正在尝试将简单的ics文件导入Google日历.但是,即使我指定了时区,Google日历仍会导入错误的事件时间.(虽然它确实说错误的时间是在正确的时区.)

这是我的ics文件的示例:

BEGIN:VCALENDAR
BEGIN:VEVENT
DESCRIPTION: Test_Description
DTEND;TZID=US-Pacific:20140606T180000
DTSTART;TZID=US-Pacific:20140606T170000
LOCATION:Test_Location
SUMMARY:Test_Summary
UID:20140606T150000@NL
END:VEVENT
END:VCALENDAR
Run Code Online (Sandbox Code Playgroud)

此事件应显示为6月6日太平洋标准时间下午5点至下午6点.但是,在我的日历上显示为6月6日上午10点到11点太平洋标准时间.

我认为(虽然还没有实现)只是将所有内容更改为UTC并相应地调整事件时间可能会有效.但是,这实现起来有点烦人,老实说Google Calendar应该能够处理这种简单的导入.

有没有人有任何建议来处理这个问题,或者看到我的ICS文件中的任何错误?

谢谢!

chr*_*ris 11

要使您的ICS使用Google的"按网址添加...",请以UTC格式指定您的时间戳并添加X-WR-TIMEZONE.时间戳必须Z在末尾将时间戳标记为UTC:

DTSTART:20140102T110000Z
Run Code Online (Sandbox Code Playgroud)

还要在VCALENDAR块中添加时区规范,如下所示:

X-WR-TIMEZONE:Europe/Zurich
Run Code Online (Sandbox Code Playgroud)

在Google日历中添加日历后,应在日历设置中正确设置时区.

如果您使用PHP生成ICS,您可以将时间戳转换为UTC,如下所示:

// The timestamp in your local time and your local time zone
$timestamp = "01.01.2016 12:00";
$timezone = new DateTimeZone('Europe/Zurich');

// The UTC timezone
$utc = new DateTimeZone('UTC');

// Create a DateTime object from your timestamp using your local timezone
$datetime = DateTime::createFromFormat("d.m.Y H:i",$timestamp, $timezone);

// Set the timezone on the object to UTC.
$datetime->setTimezone($utc);

// Print the time in UTC and use the correct format for ICS
echo $datetime->format('Ymd\THis\Z');
Run Code Online (Sandbox Code Playgroud)

这也适用于Apple的iPhone.


Eve*_*ert 4

通常需要包含VTIMEZONE对象。许多人开始忽略这一点,但如果你这样做,至少使用 olson 标识符。这应该足以让谷歌日历选择正确的时区。

olson 标识符的一个示例是Europe/Amsterdam。查找最适合您的标识符。想必这就是类似的东西America/Los_Angeles

  • 简短版本:尝试:`DTSTART;TZID=America/Los_Angeles:20140606T170000` (3认同)
  • 好的,我按照您的指示以及 http://erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html 中的描述进行操作。这适用于将本地 .ics 文件直接上传到 Google 日历。然而,现在通过 URL 添加(对于*同一个*文件)得到的时间是错误的!但我想这是另一个问题。 (2认同)