如何在ics文件中指定时区,以便与google、outlook和apple有效配合?

如何在ics文件中指定时区,以便与google、outlook和apple有效配合?,outlook,calendar,google-calendar-api,icalendar,Outlook,Calendar,Google Calendar Api,Icalendar,我想生成一个ics文件,它将与谷歌,outlook和苹果日历兼容。我可以做得很好,但问题是我不能在文件中指定时区块,它将兼容上述应用程序。我目前使用的是X-Wr-timezone属性,它不适用于outlook,在google中提供不同的时间。我需要这个问题的解决方案。我的ics文件: BEGIN:VCALENDAR PRODID:-//sample//sam Calendar//EN VERSION:2.0 X-MS-OLK-FORCEINSPECTOROPEN:TRUE X-WR-TIMEZO

我想生成一个ics文件,它将与谷歌,outlook和苹果日历兼容。我可以做得很好,但问题是我不能在文件中指定时区块,它将兼容上述应用程序。我目前使用的是X-Wr-timezone属性,它不适用于outlook,在google中提供不同的时间。我需要这个问题的解决方案。我的ics文件:

BEGIN:VCALENDAR
PRODID:-//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组件:

因此,最终组装的ICS文件如下所示(根据OP的ICS文件;注意:在他的第一行,VCALENDAR的“R”被推到第二行“PRODID”的开头,我在回答中已更正):

我没有测试过这个特定的IC,因此无法预测将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块中的日期/时间非常重要。当“LAST_MODIFIED”字段末尾有一个“Z”时,我获得了成功

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


最后观察,新行“\n”从2018年4月起不适用于谷歌日历。只要使用“版本:2.0”,iCal就会遵守它。

假设提问者住在洛杉矶,并使用最新的US-EN版本OUTLOOK。 我不知道为什么要在纽约指定时区。 我发现重要的一点是如何在ics文件中指定时区,设置5项相同的值

  • X-WR时区:美国/洛杉矶
  • TZID:America/Los_Angeles
  • X-LIC-LOCATION:美国/洛杉矶
  • DTSTART;TZID=“美国/洛杉矶”
  • DTEND;TZID=“美国/洛杉矶”
  • 夏季(夏令时-DST)是经常性的。因此,应该添加
    RRULE
    a.k.a循环规则。当然,以前的代码也可以工作。 尽管如此,即使在2019年9月,新线 \n(意味着回车或/和换行)对于安道尔智能手机上的谷歌日历仍然有效。 下面的项目不太需要

    • UID:
    • SEQUENCE:0
      在使用SEQUENCE之前,请删除计划程序中添加的项


    VTIMEZONE
    是一个很好的提示。
    VTIMEZONE
    RRULE
    中缺少的
    BYDAY
    是我遇到的问题,我在
    VTIMEZONE
    上运气不好,所以我只好跟着。我不确定是我弄错了语法,还是苹果日历太麻烦了。日期格式后面的“Z”是我面临的问题。非常感谢。
    const DT_FORMAT = 'Ymd\THis';
    
    const DT_FORMAT = 'Ymd\THis\Z';
    
    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