我尝试将简单的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
此事件应显示为6月6日太平洋标准时间下午5点至下午6点。但是,在我的日历上,它显示为6月6日上午10点到11点太平洋标准时间。
我认为(虽然尚未实施)黑客只需将所有内容更改为UTC并相应地调整事件时间
有没有人有任何建议可以解决这个问题,或者看到我的ICS文件中有任何错误?
谢谢!
答案 0 :(得分:11)
让您的ICS与Google合作"通过网址添加..."以UTC格式指定时间戳并添加X-WR-TIMEZONE
。时间戳必须在末尾有Z
以将时间戳标记为UTC:
DTSTART:20140102T110000Z
还要在VCALENDAR
块中添加时区规范,如下所示:
X-WR-TIMEZONE:Europe/Zurich
在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');
这也适用于Apple的iPhone。
答案 1 :(得分:4)
通常需要包含VTIMEZONE
个对象。许多人开始忽略这一点,但如果你这样做,至少使用olson-identifier。这应该足以让谷歌日历获取正确的时区。
olson标识符的示例是Europe/Amsterdam
。查找最适合您的标识符。大概这就像America/Los_Angeles
。