Создать файл .ics динамически - PullRequest
24 голосов
/ 22 апреля 2011

Я сделал сайт для клиента, где они могут публиковать события.Вместо того, чтобы вручную создавать файлы .ics из iCal для каждого события и загружать его, я подумал, что было бы лучше извлечь его из базы данных и автоматически создать файл .ics автоматически с помощью PHP.

Я могу получить информациюиз базы данных (без проблем), но при преобразовании его в метку времени для файла календаря это сложная задача.Вот что я храню в базе данных:

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";

Теперь, как мне преобразовать данные в моей базе данных в правильное время/ дата штамп?

1 Ответ

18 голосов
/ 22 апреля 2011

время iCal хранится в UTC, а не в часовом поясе, в котором они возникли, если не указано иное (см. Редактирование)

Если вы хотите, чтобы ваш код был универсальным, вам нужно сохранить часовой пояс какЧто ж.Если вы действительно хотите ... вы можете использовать жесткий код в преобразовании.

Я бы также рекомендовал не сохранять время в этом формате:

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

и переходить на формат меток времени.Вы пройдете от 4 (?) Столбцов до одного.Почему это хорошо?Потому что вы можете использовать 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

EDIT: Z представляет время UTC или абсолютное время.Вы можете установить часовой пояс в файле и оставить преобразование в программе календаря.http://tools.ietf.org/html/rfc5545#section-3.2.19

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...