web-dev-qa-db-ja.com

.icsファイルを動的に作成する

イベントを投稿できるクライアント向けのウェブサイトを作成しました。イベントごとに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";

次に、データベース内のデータを正しい日時スタンプに変換するにはどうすればよいですか?

24
iosfreak

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時間または絶対時間を表します。
ファイルにタイムゾーンを設定して、変換をカレンダープログラムに任せることができます。
http://tools.ietf.org/html/rfc5545#section-3.2.19

18
afuzzyllama