如何在ics文件中指定时区可以与google,outlook和apple一起高效工作?

kou*_*ubh 9 icalendar outlook calendar google-calendar-api

嗨我想生成ics文件,它将与谷歌,Outlook和苹果日历兼容.目前我能够做得很好,但问题是我不能指定文件中的时区块,它将与上述应用程序兼容.我目前使用X-Wr-timezone属性,它不适用于Outlook,并在谷歌提供不同的时间.我需要解决这个问题的方法.我的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
Run Code Online (Sandbox Code Playgroud)

小智 11

在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
Run Code Online (Sandbox Code Playgroud)

所以最终组装的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
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个特定的ICS,因此无法预测使用VTIMEZONE和X-WR-TIMEZONE的行为.

另一个微妙之处是日期/时间格式不能包含时区.因此,例如,如果您要在PHP中构建它,您需要确保:

const DT_FORMAT = 'Ymd\THis';
Run Code Online (Sandbox Code Playgroud)

例如:DTSTART:20160206T074400

不是:

const DT_FORMAT = 'Ymd\THis\Z';
Run Code Online (Sandbox Code Playgroud)

例如:DTSTART:20160206T074400Z

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

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

最后观察,新行"\n"在截至2018年4月的谷歌日历中不起作用.只要使用"VERSION:2.0",iCal就会遵守它.