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

时间:2015-03-31 15:04:16

标签: php icalendar

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

我正在尝试使用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";

2 个答案:

答案 0 :(得分:1)

你在做:

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

答案 1 :(得分:1)

知道了。

经过一番搞砸后我才解决了。我只需要删除' Z'在VEVENT的DTSTART和DTEND结束时停止强制转换为GMT而不是夏令时。