【问题标题】:Importing ICS into Google Calendar with correct timezone使用正确的时区将 ICS 导入 Google 日历
【发布时间】:2014-05-30 21:08:59
【问题描述】:

我正在尝试将一个简单的 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 并相应调整事件时间的技巧可能工作。但是,这实施起来会有点烦人,老实说,Google 日历应该能够处理这种简单的导入。

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

谢谢!

【问题讨论】:

    标签: import calendar timezone icalendar


    【解决方案1】:

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

    olson 标识符的一个示例是Europe/Amsterdam。查找最适合您的标识符。大概这类似于America/Los_Angeles

    【讨论】:

    • 你能用我提供的例子来证明这一点吗?
    • 简短版:try : DTSTART;TZID=America/Los_Angeles:20140606T170000
    • 好的,我按照您的指示以及erics-notes.blogspot.com/2013/05/fixing-ics-time-zone.html 中的说明进行操作。这适用于直接将本地 .ics 文件上传到 Google 日历。但是,现在通过 URL 添加(对于 same 文件)时间错误!但我想这是另一个问题。
    【解决方案2】:

    要使您的 ICS 与 Google 的“通过 URL 添加...”一起使用,请指定您的 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。

    【讨论】:

    • 我应该把 X-WR-TIMEZONE 线放在哪里?它应该是 BEGIN:TIMEZONE 块的一部分吗?还是活动的一部分?
    • 你把它放在 BEGIN:VCALENDAR 块中,在所有事件之前。
    • 非常感谢。很好的答案,有用的cmets。我了解到Z 在时间戳中表示 UTC。干得好。
    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多