iCalendar夏令时

时间:2015-04-02 12:49:39

标签: php calendar outlook icalendar

我为用户提供了一个链接,他们可以使用iCalendar URL将他们在我的系统上的约会放在他们的日历软件中,例如Outlook,...。

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

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 =欧洲/布鲁塞尔:20150318T083000 DTEND; TZID =欧洲/布鲁塞尔:20150318T090000

这在我的日历中正确显示,从08:30到09:00

DTSTART; TZID =欧洲/布鲁塞尔:20150407T083000 DTEND; TZID =欧洲/布鲁塞尔:20150407T090000

这是我的问题,这在我的日历中显示不正确:从09:30到10:30。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要确保您的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