使用 PHP 生成 iCal - 夏令时问题

Generating iCal with PHP - Daylight Saving Issue

我见过几个类似的问题,但据我所知,我做对了。

我正在尝试使用 PHP 脚本来创建考虑英国夏令时的日历提醒。我们目前处于夏令时,生成的日历提醒显示提前一个小时。无论我在 TZOFFSET 中输入什么值,似乎都不会以任何方式调整时间。

任何帮助将不胜感激:

    echo 'BEGIN:VCALENDAR'."\r\n";
echo 'VERSION:2.0'."\r\n";
echo 'PRODID:-//bookingtest.co.uk'."\r\n";
echo 'METHOD:REQUEST\n';
echo 'CALSCALE:GREGORIAN'."\r\n";

echo 'BEGIN:VTIMEZONE'."\r\n";
echo 'TZID:Europe/London'."\r\n";
echo 'TZURL:http://tzurl.org/zoneinfo-outlook/Europe/London'."\r\n";
echo 'X-LIC-LOCATION:Europe/London'."\r\n";

echo 'BEGIN:DAYLIGHT'."\r\n";
echo 'TZOFFSETFROM:+0100'."\r\n";
echo 'TZOFFSETTO:+0200'."\r\n";
echo 'TZNAME:BST'."\r\n";
echo 'DTSTART:19700329T010000'."\r\n";
echo 'RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU'."\r\n";
echo 'END:DAYLIGHT'."\r\n";

echo 'BEGIN:STANDARD'."\r\n";
echo 'TZOFFSETFROM:+0100'."\r\n";
echo 'TZOFFSETTO:+0000'."\r\n";
echo 'TZNAME:GMT'."\r\n";
echo 'DTSTART:19701025T020000'."\r\n";
echo 'RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU'."\r\n";
echo 'END:STANDARD'."\r\n";

echo 'END:VTIMEZONE'."\r\n";

echo 'BEGIN:VEVENT'."\r\n";
echo 'DTEND:'; echo dateToCal($dateend).'Z'."\r\n";
echo 'UID:'; echo uniqid()."\r\n";
echo 'DTSTAMP:'; echo dateToCal(time()).'Z'."\r\n";
echo 'LOCATION:'; echo escapeString($address)."\r\n";
echo 'DESCRIPTION:'; echo escapeString($description)."\r\n";
echo 'URL;VALUE=URI:'; echo escapeString($uri)."\r\n";
echo 'SUMMARY:'; echo escapeString($summary)."\r\n";
echo 'DTSTART:'; echo dateToCal($datestart).'Z'."\r\n";

echo 'BEGIN:VALARM'."\r\n";
echo 'TRIGGER:-PT2H'."\r\n";
echo 'ACTION:DISPLAY'."\r\n";
echo 'DESCRIPTION:'; echo escapeString($summary)."\r\n";
echo 'END:VALARM'."\r\n";

echo 'END:VEVENT'."\r\n";
echo 'END:VCALENDAR'."\r\n";

您正在做:

echo 'BEGIN:DAYLIGHT'."\r\n";
echo 'TZOFFSETFROM:+0100'."\r\n";
echo 'TZOFFSETTO:+0200'."\r\n";
echo 'TZNAME:BST'."\r\n";

当它应该从 +0000 到 +0100 时。

然后看不到完整的事件,因此我们必须假设您在 DTSTART/DTEND

中正确引用了 TZID

知道了。

经过一番折腾,我终于搞定了。我只需要删除 VEVENT 中 DTSTART 和 DTEND 末尾的 'Z',以阻止它强制进入 GMT 而不是夏令时。