【问题标题】:Writing ICS files for multiple clients, including Google为包括 Google 在内的多个客户编写 ICS 文件
【发布时间】:2011-04-15 09:04:33
【问题描述】:

我需要编写一个用于发布 .ICS 文件的脚本。我读到很难做到这一点,要么是因为一些日历客户端有问题(很多人声称谷歌日历非常有问题,尤其是在时区方面),要么是因为开发人员没有正确遵循规范。我只需要为北美执行此操作,但我必须考虑 DST(请记住像亚利桑那这样的地方,部分地区遵守 DST,部分地区不遵守)。

谁能回答这些问题?

  1. 指定开始和结束时间时 对于一个事件,这应该是 始终在用户的本地提供 时间还是我可以将它作为 UTC 时间发送 并留给客户计算 出来?
  2. 我是否需要采取任何额外的措施 计算夏令时的步骤 用户的位置?
  3. 我必须采取 需要考虑的任何额外步骤 谷歌?

还有其他提示吗?

【问题讨论】:

    标签: php timezone icalendar


    【解决方案1】:

    你没听错 - 这并不容易。很容易提供非常基本的 ics 支持,而不是为 ics 提供商可能输出的内容提供完整的支持;特别是 wrt 重复、异常、修改和是时区。

    我已经在我的 ics 发布者上工作了很长时间,现在它已经相当稳定了。一路上我做了一些笔记。

    http://icalevents.com/category/notes/。我网站上的时区标签也可能对您有所帮助。

    特别是,如果您要参与重复性事件,“ical 备忘单”值得一看。完成之后,我重写了我的循环引擎。

    我没有发现 Google 有问题,这是较小的玩家,特别是当他们开始做一些不标准的事情时(基于 Zimbra/PC 的 tz 等)。

    虽然 Google 更新速度可能很慢(即有人更新了他们的 google 日历,但您重新获取 ics 文件(绝对不是从您的缓存中)并且它没有更新 - 可能需要一个小时左右。这对我们学校在做他们的时事通讯时——他们也从网站上打印。所以我现在求助于创建另一面——我们自己在 wp 中的 ics 编辑器。

    那里有各种免费的 ical 脚本 - 为什么要自己制作?渴望挑战?

    【讨论】:

    • 哇。那很完美。这就是我要找的。至于使用预卷脚本......老实说,我没有深入研究任何内容,而且我一直怀疑我看过的那些。这是对朋友(非常大且非常成功)业余体育联盟网站的一个小插件。她的需求是如此基本,以至于我认为从头开始会更容易。然后我查看了 RFC。然后我开始阅读其他开发人员的反馈。然后我就紧张了。除了时区之外,一切看起来都像是在公园里散步。有什么可以推荐的脚本吗?
    • 好吧,如果您使用 Php 编写并使用 DateTime 类(不是 UNIX 时间),并且您对正在处理的时区(ics 文件、事件(可以是与文件不同)),那么时区不是问题。在事件时区内重复事件,仅在准备输出时才移动到显示时区。如果重复出现夏令时更改,这是 NB - 请参阅我网站上的链接。使用 datetime class Tz 处理得很好,您可以进行日期比较等。
    • 我有一个免费的 wordpress 插件 (amr-ical-events-list),我确信它可以重复使用。我本来打算移植到独立版本,但还没有完成。还有其他人(google php ical,ics),但最后我看他们要么没有完全重复,要么试图使用 unix 时间戳来应对时区 - 疯了。我的插件是基于列表的(议程),但添加盒子日历并不难。
    • 非常酷。非常感谢您的帮助。如果我最终使用您的代码,我会将最终所做的更改发送给您。可能它们对你没有用,但谁知道呢。我将在下个月左右开始讨论这个问题。再次感谢!
    【解决方案2】:

    ICS 文件中的时间可以是浮动的也可以是固定的。

    浮动日期时间不包含对 UTC 或时区的引用 - 时间应该是与会者在他/她的本地时区到达会议的时间。这可能会导致不同的与会者在不同的时间参加会议,因此应谨慎使用(或永远不要!)。

    固定时间是更好的选择。格式会根据会议是否以 UTC 进行而改变。

    对于 UTC 会议,使用 Z 指定 UTC:

    19980119T070000Z
    

    如果会议不是 UTC,请使用 TZID 格式指定时区。以下代表纽约时间凌晨 2 点:

    TZID=America/New_York:19980119T020000
    

    注意:UTC 时间不应使用 TZID 格式。

    所有这些都在 RFC 5545,3.2.193.3.4 部分中指定

    RFC 有以下关于 DST 的说法 - 随便读吧!

    如果,根据定义 参考时区,当地时间 描述发生不止一次(当 从日光变为标准 时间),日期时间值是指 引用的第一次出现 时间。因此,TZID=美国/ New_York:20071104T013000 表示 2007 年 11 月 4 日凌晨 1:30美东时间 (UTC-04:00)。如果当地时间 描述不发生(当 从标准到日光 时间),日期时间值是 使用 UTC 偏移量解释 在当地时间的差距之前。因此, TZID=美国/New_York:20070311T023000 表示 2007 年 3 月 11 日凌晨 3:30 EDT (UTC-04:00),1:30 后一小时 是。美国东部标准时间 (UTC-05:00)。

    【讨论】:

    • 您知道主要客户如何实施 ICS 的任何怪癖吗?作为一名 Web 开发人员,我非常熟悉只编写标准会给您带来麻烦,以及解决方案通常是如何编写代码以满足标准和主要浏览器的怪癖。我不能合理地期望我处理所有已知的 iCalendar 客户端,但我希望在实现方面有足够的相似性来构建一个适用于大型客户端(Outlook、Google 日历、黑莓和 iC​​al 对于初学者)的单个文件。
    • +1,在潜入 RFC 和谷歌搜索数小时后,就像我的生活依赖于它一样,您的帖子帮助我解决了我的问题(使用的是 UTC 的 TZID)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多