iCalendar 夏令时

3

我给用户提供了一个链接,他们可以使用该链接将我的系统中的预约放入他们的日历软件(如Outlook,…),使用iCalendar URL。

我使用以下代码生成文件中的日期:

echo "DTSTART;TZID=" . date_default_timezone_get() . ":" . strftime('%Y%m%d', strtotime($app->app_start)) . 'T' . strftime('%H%M%S', strtotime($app->app_start)) . '' . $eol;
echo "DTEND;TZID=" . date_default_timezone_get() . ":" . strftime('%Y%m%d', strtotime($app->app_end)) . 'T' . strftime('%H%M%S', strtotime($app->app_end)) . '' . $eol;

这一直以来都是正常的。但现在我们处于夏令时,所有处于夏令时的约会在我的 Outlook 中显示晚了 1 小时。而夏令时前的约会则正常。
例如,在我的 ICS 文件中:
DTSTART;TZID=Europe/Brussels:20150318T083000 DTEND;TZID=Europe/Brussels:20150318T090000
这在我的日历中正确地显示为从 08:30 到 09:00。
DTSTART;TZID=Europe/Brussels:20150407T083000 DTEND;TZID=Europe/Brussels:20150407T090000
这就是我的问题了,它在我的日历中显示不正确:从 09:30 到 10:30。
我该怎么解决?
2个回答

3

您需要确保您的ics文件包含时区定义,例如:

BEGIN:VTIMEZONE
TZID:US Mountain Standard Time
BEGIN:STANDARD
RRULE:FREQ=YEARLY;BYMONTH=0;BYDAY=+10SU
DTSTART:16010000T000000
TZOFFSETFROM:-0700
TZOFFSETTO:-0700
END:STANDARD
END:VTIMEZONE
BEGIN:VTIMEZONE
TZID:Eastern Standard Time
BEGIN:STANDARD
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=+11SU
DTSTART:16011101T020000
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
BEGIN:DAYLIGHT
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=+12SU
DTSTART:16010302T020000
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
END:VTIMEZONE

1
谢谢,我已经将欧洲/布鲁塞尔时区添加到VTIMEZONE中,现在它可以正常工作了。如果有人需要欧洲/布鲁塞尔的VTIMEZONE:BEGIN:VTIMEZONE TZID:Europe/Brussels X-LIC-LOCATION:Europe/Brussels BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD END:VTIMEZONE - user1026090
我尝试给自己发送Gmail邀请,但是我收到的ICS中没有VTIMEZONE。我不认为我在Gmail中见过这样的问题,所以一定有更简单的方法来解决它。 - pieroxy

0
我得到了这个ICS文件。
BEGIN:VCALENDAR
X-LOTUS-CHARSET:UTF-8
VERSION:2.0
PRODID:http://www.bahn.de
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:Europe/Berlin
X-LIC-LOCATION:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:bahn2023-09-18114700
CLASS:PUBLIC
SUMMARY:Bargteheide -> Essen Hbf
DTSTART;TZID=Europe/Berlin:2023-09-18T114700
DTEND;TZID=Europe/Berlin:2023-09-18T155800
DTSTAMP:2023-07-17T081800Z
END:VEVENT

但为什么它被存储在2022年12月9日,而不是2023年9月18日呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接