php - 动态创建 .ics 文件

标签 php icalendar

我为客户制作了一个网站,他们可以在其中发布事件。与其从 iCal 中为每个事件手动创建 .ics 文件并上传它,不如将其从数据库中拉出并使用 PHP 自动创建 .ics 文件会更好。

我可以从数据库中提取信息(没问题),但是在将其转换为日历文件的时间戳时,这很困难。这是我存储在数据库中的内容:

Month: 05
Day: 02
Year: 2011
Time: 11:30am - 1:30pm

这是创建我的 .ics 文件的代码:

//This is the most important coding.
header("Content-Type: text/Calendar");
header("Content-Disposition: inline; filename=adamhouston_$id.ics");

echo "BEGIN:VCALENDAR\n";
echo "PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN\n";
echo "VERSION:2.0\n";
echo "METHOD:PUBLISH\n";
echo "X-MS-OLK-FORCEINSPECTOROPEN:TRUE\n";
echo "BEGIN:VEVENT\n";
echo "CLASS:PUBLIC\n";
echo "CREATED:20091109T101015Z\n";

echo "DESCRIPTION:Speaker: $event_query_row[speaker_name]\\n\\nTopic: $event_query_row[speaker_topic]\n";
echo "DTEND:20100208T040000Z\n";
echo "DTSTAMP:20100109T093305Z\n";
echo "DTSTART:20100208T003000Z\n";
echo "LAST-MODIFIED:20091109T101015Z\n";
echo "LOCATION:$event_query_row[location]\n";
echo "PRIORITY:5\n";
echo "SEQUENCE:0\n";
echo "SUMMARY;LANGUAGE=en-us:ADAM-Houston Event\n";
echo "TRANSP:OPAQUE\n";
echo "UID:040000008200E00074C5B7101A82E008000000008062306C6261CA01000000000000000\n";
echo "X-MICROSOFT-CDO-BUSYSTATUS:BUSY\n";
echo "X-MICROSOFT-CDO-IMPORTANCE:1\n";
echo "X-MICROSOFT-DISALLOW-COUNTER:FALSE\n";
echo "X-MS-OLK-ALLOWEXTERNCHECK:TRUE\n";
echo "X-MS-OLK-AUTOFILLLOCATION:FALSE\n";
echo "X-MS-OLK-CONFTYPE:0\n";
//Here is to set the reminder for the event.
echo "BEGIN:VALARM\n";
echo "TRIGGER:-PT1440M\n";
echo "ACTION:DISPLAY\n";
echo "DESCRIPTION:Reminder\n";
echo "END:VALARM\n";
echo "END:VEVENT\n";
echo "END:VCALENDAR\n";

现在如何将数据库中的数据转换为正确的时间/日期戳?

最佳答案

iCal 时间存储在 UTC 中,而不是它们所在的时区,除非另有说明(请参阅编辑)

如果您希望代码具有通用性,则还需要存储时区。如果你真的想......你可以在转换中硬编码。

我还建议不要以这种格式存储时间:

 Month: 05
 Day: 02 
 Year: 2011
 Time: 11:30am - 1:30pm

并移至时间戳格式。您将从 4(?) 列减少到 1 列。为什么这样好?因为可以使用 PHP date()将日期格式化为您所需要的! (我相信你需要使用 strtotime() 并且有人在评论中具有时区转换功能)

从 iCal 的角度来看需要做什么:

 echo "DTSTAMP:<year><month><day>T<hour><minutes><seconds>Z\n";  // Time iCal item was made
 echo "DTSTART:<year><month><day>T<hour><minutes><seconds>Z\n";  // Start time
 echo "DTEND:<year><month><day>T<hour><minutes><seconds>Z\n";    // End time

编辑:
Z 代表 UTC 时间,或绝对时间。
您可以在文件中设置时区,并将转换留给日历程序。
https://www.rfc-editor.org/rfc/rfc5545#section-3.2.19

关于php - 动态创建 .ics 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750249/

相关文章:

php - 我需要使用 mysql 比较不同行中的两个不同列

php - Textarea内容到td,同时保留回车

php - Zend Framework 2 session 生命周期

php - iCalendar 和描述格式

google-calendar-api - Google Calendar .ics 导入标准

php - 多次提交输出

正则表达式:无法找出表达式来匹配具有单个事件的行并且仅匹配包含特定单词的行

Swift 4.0 Eventkit 无法正确获取日历和事件

javascript - 如何在 php 中使用 jquery 更新当前日期