我很难让我的订阅日历与Google日历配合使用。以下URL可以在Outlook和Apple Calendar(iCal)上正常使用,但是我从Google处收到错误消息:“您提供的地址未包含有效iCal或GData格式的日历。”
我的URL通过了以下验证器的验证(icalvalid.cloudapp.net/和severinghaus.org/projects/icv /)
有人可以提供任何想法吗?这是网址:https://beta.vcallboard.com/calls/exportcalendar.php?userID=Mg%3D%3D&token=MjB6N2E0OTk%3D
我已经尝试过的理论:-无法在https上运行-(我将.ics文件保存并上传为服务器根目录中的文件,并且该URL有效-似乎与自动生成有关)-某些字段的空白值无效(如果我将其上传为.ics文件,则可以使用)
您没有在ICS文件中定义您要引用的时区。您有许多行,如下所示:
DTSTART;TZID=America/Chicago:20140121T010000
但是要使用这些,您需要定义时区,例如:
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Test calendar
X-WR-TIMEZONE:Indian/Reunion
BEGIN:VTIMEZONE
TZID:Indian/Reunion
TZURL:http://tzurl.org/zoneinfo/Indian/Reunion
X-LIC-LOCATION:Indian/Reunion
BEGIN:STANDARD
TZOFFSETFROM:+034152
TZOFFSETTO:+0400
TZNAME:RET
DTSTART:19110601T000000
RDATE:19110601T000000
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
...
获取时区定义文件的好地方是tzurl.org
我对我的问题感到困惑,因为我可以手动导入脚本输出的.ics文件,并且Google日历可以毫无问题地读取该文件。因此,我认为我对iCal文件的实际格式没有任何问题-我认为这与标头或某些服务器配置有关。所以我做了一些实验...
长话短说,通过执行以下操作,我可以在Google日历上使用它:
将所有iCal数据加载到变量中,从数据库中提取数据,站点常量等。请确保使用\r
和\n
在验证器中进行更好的验证。
$iCal = "BEGIN:VCALENDAR\r
VERSION:2.0\r
PRODID:-//VirtualCallboard//".SITENAME."//EN\r
CALSCALE:GREGORIAN\r
METHOD:PUBLISH\r";
while ($r=mysql_fetch_assoc($result))
{
// i do a bunch of stuff here to get variables ready for the output
$iCal .= "BEGIN:VEVENT\r
DTSTAMP:".gmdate("Ymd\THis\Z")."\r
DTSTART:".date("Ymd\THis\Z", strtotime($r[tdstart]))."\r
DTEND:'.date("Ymd\THis\Z", strtotime($r[tdend]))."\r
SUMMARY:$r[title]\r
UID:$r[callid]@".$_SERVER['HTTP_HOST']."\r
DESCRIPTION:$r[notes].\r
LOCATION:$r[location_name].\r
STATUS:CONFIRMED\r
END:VEVENT\r\n";
}
$iCal .= "END:VCALENDAR";
转义特殊字符(我现在所知道的都是逗号)。然后(这是秘密)-使用file_put_contents将iCal变量中的字符串写入缓存目录中具有.ics扩展名的文件中。
//escape special characters.
$iCal = str_replace(",","\,",$iCal);
//output to a file
$filename = 'site/cache/'.date("YmdHis").'.ics';
file_put_contents($filename,$iCal);
调用标题:
//set correct content-type-header
header("Content-Type:text/calendar");
header("Content-Disposition:inline;filename=my_ical.ics");
使用file_get_contents从文件中读取.ics数据,并将其输出到浏览器。
print file_get_contents($filename);
清理我在缓存目录中创建的.ics文件。
unlink($filename);
exit;
由于某些原因,我无法解释,这使得相同的文件在Google日历中可以正常工作。因此,它与Outlook,Google日历和Apple日历兼容。
可能值得记住的是,Google缓存日历URL,并且仅每x小时刷新一次(12?)。因此,如果您尝试在无法正常运行之前添加URL,则它可能仍会显示该旧版本,可能什么也没有。
尝试对URL添加不相关的更改,例如在末尾查询(?foo = 1),或者如果可以的话,更改服务器上的地址。
https://www.binarysludge.com/2012/02/01/how-to-force-refresh-google-calendar/
((在头和ic格式混乱的最后几个小时里,缓存是一种我从未想到的问题。人们倾向于认为一个人的改变至少起了作用。)]