Я сделал сайт для клиента, где они могут публиковать события. Вместо того, чтобы вручную создавать файлы .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";
Теперь, как мне преобразовать данные в моей базе данных в правильную метку времени / даты?
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
РЕДАКТИРОВАТЬ:
Z представляет время UTC или абсолютное время.
Вы можете установить часовой пояс в файле и оставить преобразование в программу календаря.
http://tools.ietf.org/html/rfc5545#section-3.2.19