我想生成一个与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
答案 0 :(得分: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在他的第一行" R" VCALENDAR被推到&#34的开头; 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';
e.g。 DTSTART:20160206T074400
和不:
const DT_FORMAT = 'Ymd\THis\Z';
e.g。 DTSTART:20160206T074400Z
此日期/时间格式对于VEVENT块中的日期/时间非常重要。当有一个" Z"在" LAST_MODIFIED"结束时字段。
在旁注中,OP正在洛杉矶时区工作,但这个答案显示了VTIMEZONE区块中的纽约信息。必须计算洛杉矶的适当信息(例如夏令时抵消等)
最终观察,新线" \ n"自2018年4月起,它不适用于谷歌日历。只要" VERSION:2.0"使用。
答案 1 :(得分:0)
假设发问者住在洛杉矶,并使用最新的US-EN版本OUTLOOK。 我不知道为什么要指定纽约的时区。 Los Angles is PDT or PST Timezone(written in Japanese) 我发现了要点,如何在ics文件上指定时区,将5项设置为相同的值
X-WR-TIMEZONE:America/Los_Angeles
TZID:America/Los_Angeles
X-LIC-LOCATION:America/Los_Angeles
DTSTART;TZID="America/Los_Angeles"
DTEND;TZID="America/Los_Angeles"
According to this sight夏季时间(夏令时-DST)是经常性的。因此,应添加RRULE
也称为递归规则。当然,以前的代码行之有效。
尽管如此,即使在2019年9月,New Line \ n(表示回车或/和换行)仍然对Andoroid智能手机上的Google Calender有效。
而且下面的Item不是那么需要
UID:
SEQUENCE:0
在使用“序列”之前,请在计划程序中删除添加的项目。BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 19.0 MIMEDIR//EN
VERSION:2.0
X-WR-TIMEZONE:America/Los_Angeles
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:America/Los_Angeles
X-LIC-LOCATION:America/Los_Angeles
BEGIN:DAYLIGHT
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
TZNAME:PDT
DTSTART:19700308T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
TZNAME:PST
DTSTART:19701101T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
SUMMARY:Appointment
LOCATION:Pune
DESCRIPTION:Your appointment Details:\n\nPatient Details:Kou Kul\nKeven\n\nAppointment Type:Counselling (30 min)\n\nThanks.
DTSTART;TZID="America/Los_Angeles":20160206T074400
DTEND;TZID="America/Los_Angeles":20160206T084400
PRIORITY:5
STATUS:CONFIRMED
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR