我想生成一个与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/