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

问题描述 投票:6回答:1

我想生成一个与谷歌,Outlook和苹果日历兼容的ics文件。我能够做得很好,但问题是我无法在文件中指定时区块,这将与上述应用程序兼容。我目前使用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
outlook calendar google-calendar-api icalendar
1个回答
10
投票

在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';

EG STSTART:20160206T074400

并不是:

const DT_FORMAT = 'Ymd\THis\Z';

例如DTSTART:20160206T074400Z

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.