outlook - 如何在ics文件中指定可与Google,outlook和Apple一起有效使用的时区?

标签 outlook calendar google-calendar-api icalendar

我想生成一个与Google,Outlook和Apple日历兼容的ics文件。我可以做的很好,但是问题是我无法在文件中指定时区块,因此与上述应用程序兼容。我目前使用的X-Wr-timezone属性不适用于Outlook,并在Google中提供了不同的时间。我需要解决这个问题的方法。我的ics文件:

BEGIN:VCALENDA
RPRODID:-//sample//sam Calendar//EN
VERSION:2.0
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
X-WR-TIMEZONE:America/Los_Angeles
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART;TZID=America/Los_Angeles:20160206T074400
DTEND;TZID=America/Los_Angeles:20160206T084400
DESCRIPTION:Your appointment Details:\n\nPatient Details:Kou Kul\nKeven\n\nAppointment Type:Counselling (30 min)\n\nThanks.
LOCATION: Pune
SEQUENCE:0
PRIORITY:5
STATUS:CONFIRMED
SUMMARY:Appointment Details:- John Bond
UID:X:201600U2800000A9Yp0EAF@sample
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

最佳答案

在VEVENT之前使用VTIMEZONE组件:https://tools.ietf.org/html/rfc5545#section-3.6.5

   BEGIN:VTIMEZONE
   TZID:America/New_York
   LAST-MODIFIED:20050809T050000Z
   BEGIN:STANDARD
   DTSTART:20071104T020000
   TZOFFSETFROM:-0400
   TZOFFSETTO:-0500
   TZNAME:EST
   END:STANDARD
   BEGIN:DAYLIGHT
   DTSTART:20070311T020000
   TZOFFSETFROM:-0500
   TZOFFSETTO:-0400
   TZNAME:EDT
   END:DAYLIGHT
   END:VTIMEZONE


因此,最终的组装ICS文件将如下所示(基于OP的ICS文件; NB在其第一行中,VCALENDAR的“ R”被推到第二行中“ PRODID”的开头,我已在回答中对其进行了更正):

BEGIN:VCALENDAR
PRODID:-//sample//sam Calendar//EN
VERSION:2.0
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
X-WR-TIMEZONE:America/Los_Angeles
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:America/New_York
LAST-MODIFIED:20050809T050000Z
BEGIN:STANDARD
DTSTART:20071104T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
TZNAME:EST
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20070311T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
TZNAME:EDT
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
DTSTART:20160206T074400
DTEND:20160206T084400
DESCRIPTION:Your appointment Details:\n\nPatient Details:Kou Kul\nKeven\n\nAppointment Type:Counselling (30 min)\n\nThanks.
LOCATION: Pune
SEQUENCE:0
PRIORITY:5
STATUS:CONFIRMED
SUMMARY:Appointment Details:- John Bond
UID:X:201600U2800000A9Yp0EAF@sample
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR


我尚未测试此特定的ICS,因此无法预测同时使用VTIMEZONE和X-WR-TIMEZONE的行为。

另一个微妙之处是日期/时间格式不能包含时区。因此,例如,如果您要使用PHP进行构建,则需要确保:

const DT_FORMAT = 'Ymd\THis';


例如
DTSTART:20160206T074400

并不是:

const DT_FORMAT = 'Ymd\THis\Z';


例如
DTSTART:20160206T074400Z

此日期/时间格式对于VEVENT块中的日期/时间很重要。当“ LAST_MODIFIED”字段的末尾有“ Z”时,我获得了成功。

在一个旁注中,OP在洛杉矶时区工作,但是此答案在VTIMEZONE块中显示了纽约信息。必须计算洛杉矶的适当信息(例如,夏令时抵消等)。

最后的观察,从2018年4月开始,新行“ \ n”不适用于Google日历。只要使用“ VERSION:2.0”,iCal就会遵守。

关于outlook - 如何在ics文件中指定可与Google,outlook和Apple一起有效使用的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35645402/

相关文章:

python - "ImportError: file_cache is unavailable"为 Google 服务帐户 file_cache 使用 Python 客户端时

HTML 电子邮件 - Outlook.com/Hotmail 从 img 标签中剥离所有内联样式

html - 如何链接 html 电子邮件中的 block 级元素?

c# - 打开Outlook后无法创建带有Outlook Interop的电子邮件

python - 在没有使用构造函数的子类或辅助函数的情况下更改 datetime.date 的日期或月份

ios - 如何快速从谷歌日历 API 获取 JSON?

java - 将 'primary' 日历 ID 替换为自定义用户 ID?

c# - 如何使用 WPF 业务应用程序从 Outlook 获取有关当前用户通讯组列表的信息

Java GregorianCalendar 和 DST 转换时间

javascript - 月经追踪日历