Outlook时区问题与ics文件。在谷歌日历,MacOS等文件加载确定

问题描述:

在Outlook中加载此文件显示事件从凌晨1:30 PT开始,而不是0:30 AM PT(和上午9:30 AM BST而不是上午8:30 AM BST)。在Google日历中加载它会按预期加载时间。Outlook时区问题与ics文件。在谷歌日历,MacOS等文件加载确定

这里是正确的时间根据timeanddate.com:https://www.timeanddate.com/worldclock/converted.html?iso=20171019T0830&p1=136&p2=137&p3=0

任何想法可能是什么原因呢?

该文件由icalendar 2.0(一个红宝石宝石)生成 - 我很乐意为它提供代码。

BEGIN:VCALENDAR VERSION:2.0 PRODID:icalendar-ruby CALSCALE:GREGORIAN BEGIN:VTIMEZONE TZID:Europe/London BEGIN:DAYLIGHT DTSTART:19711031T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZNAME:GMT END:DAYLIGHT BEGIN:STANDARD DTSTART:19681027T000000 TZOFFSETFROM:+0100 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZNAME:BST END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTAMP:20170720T004211Z UID:72e941fa-eb92-4740-b0b2-50cab1d6c536 DTSTART;TZID=Europe/London:20171019T083000 DTEND;TZID=Europe/London:20171019T190000 DESCRIPTION:Event description LOCATION:London\, United Kingdom SUMMARY:London ics test END:VEVENT END:VCALENDAR

编辑:

我,在我的代码中的错误这是设置时区之前引起空起始日期。由此产生的ics文件如下:

我是否正确理解VTIMEZONE日期的含义?

BEGIN:VCALENDAR 
VERSION:2.0 
PRODID:icalendar-ruby 
CALSCALE:GREGORIAN 
BEGIN:VTIMEZONE 
TZID:Europe/London 
BEGIN:DAYLIGHT 
DTSTART:20170326T020000 <-- daylight savings start for THIS event's dates 
TZOFFSETFROM:+0000 
TZOFFSETTO:+0100 
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 
TZNAME:BST 
END:DAYLIGHT 
BEGIN:STANDARD    
DTSTART:20171029T010000 <-- daylight savings end for THIS event's dates 
TZOFFSETFROM:+0100 
TZOFFSETTO:+0000 
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 
TZNAME:GMT 
END:STANDARD 
END:VTIMEZONE 
BEGIN:VEVENT 
DTSTAMP:20170720T171429Z 
UID:5cfa170a-9df1-4a05-a2e1-050888f48e4b 
DTSTART;TZID=Europe/London:20171019T083000 <-- TZID ignored by outlook but used by apple and google calendars... I presume they have daytime savings info built in? 
DTEND;TZID=Europe/London:20171019T190000  -- Outlook takes the date part and calculates offset based on the timezone section? 
DESCRIPTION:Event description 
LOCATION:London\, United Kingdom 
SUMMARY:London ics test 
END:VEVENT 
END:VCALENDAR 

你从哪里得到这个VTIMEZONE定义?这完全是假的:DAYLIGHT和STANDARD切换都是在10月份,TZOFFSETFROM/TZOFFSETTO在STANDARD的情况下具有相同的值。

与其他客户端不同,它忽略了VTIMEZONE,只是在他们知道的时候依靠TZID,Outlook确实在意(也因为它没有使用相同的TZID值)。

尝试类似:

BEGIN:VTIMEZONE 
TZID:Europe/London 
BEGIN:DAYLIGHT 
TZOFFSETFROM:+0000 
TZOFFSETTO:+0100 
TZNAME:BST 
DTSTART:19700329T010000 
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU 
END:DAYLIGHT 
BEGIN:STANDARD 
TZOFFSETFROM:+0100 
TZOFFSETTO:+0000 
TZNAME:GMT 
DTSTART:19701025T020000 
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU 
END:STANDARD 
END:VTIMEZONE 
+0

@amaudq,谢谢。我在代码中发现了一个错误,我在分配时区之前传递了一个零开始日期。你能否指点我可以找到关于时区定义结构及其与事件开始和结束日期关系的资源?我是否正确地推测Outlook将采用时区定义(包括开始和结束的白天节省),并计算事件日期的当前偏移量?我用更新的ICS内容编辑了我的问题。 – aaandre

+0

你不应该尝试自己制作VTIMEZONE信息。事件开始/结束日期和vtimezone定义之间的关系为零。 VTIMEZONE内容由当地法规驱动。你的红宝石可能带有一组预定义的VTIMEZONE定义,如果你必须处理多个时区,这就是你应该使用的。你用我提供给你的那个尝试了吗? – arnaudq

+0

您不必担心,但自从您提问以来:这些时区大部分都是从https://www.iana.org/time-zones生成的,然后使用https://工具中描述的VTIMEZONE格式进行翻译.ietf.org/html/rfc5545#section-3.6.5 – arnaudq