2012-04-17 25 views
0

私はOutlookのcalanderに私のイベントを追加するために.icsファイルを生成するためにC#コードを使用しています。.Icalファイルのタイムゾーンに応じて開始時刻と終了時刻を設定しますか?

.icsファイルは次のコードで正常に生成されています。 しかし、ここではタイムゾーンに応じて開始/終了時間を設定するのが問題です。 exampelについては、シンガポールの標準時開始時刻/終了時刻が.icsファイルにあります。シンガポールで誰かがファイルを開くとシンガポールの時間が表示され、ある人がインドでそれを開くとインドの時間が表示されます。 2012年4月20日13時00分にインドでこの時間は10:30Amになりますので、.icsファイルが表示されていれば開始時間は10:30と表示されます。

開始時刻と終了時刻をシステムのタイムゾーンに合わせてください。次のコードがうまくいきません。

お願いします。

コード:

DateTime StartTime = DateTime.Parse("2012-04-20 13:00:00.000Z");//Singapore Standard Time 
DateTime EndTime = DateTime.Parse("2012-04-20 14:00:00.000Z");//Singapore Standard Time 
bool UseAlarm = true; 
        StringBuilder sb = new StringBuilder(450); 
        sb.Append("BEGIN:VCALENDAR\n"); 
        sb.Append("BEGIN:VEVENT\n\n"); 
        sb.Append("DTSTART:"); 
        sb.Append(StartTime.ToString("yyyyMMdd\\THHmmss\\Z")); 
        sb.Append("\nDTEND:"); 
        sb.Append(EndTime.ToString("yyyyMMdd\\THHmmss\\Z")); 
        sb.Append("\nLOCATION:"); 
        sb.Append("Location"); 
        sb.Append("\nCATEGORIES:"); 
        sb.Append(string.Empty); 
        sb.Append("\nTRANSP:OPAQUE\n"); 
        sb.Append("SEQUENCE:0\n"); 
        sb.AppendFormat("UID:RFCALITEM{0}\n", DateTime.Now.Ticks); 
        sb.Append("DTSTAMP:"); 
        sb.Append(StartTime.ToString("yyyyMMdd\\THHmmss\\Z")); 
        sb.Append("\nX-ALT-DESC;FMTTYPE=text/html:");// 
        sb.Append("This is just for testing."); 
        sb.Append("\nSUMMARY:"); 
        sb.Append("Title:Test ICS File"); 
        sb.Append("\n\nPRIORITY:"); 
        sb.Append(5); 
        sb.Append("\nCLASS:PUBLIC\n"); 
        if (UseAlarm) 
        { 
         sb.Append("BEGIN:VALARM\n"); 
         sb.Append("TRIGGER:PT15M\n"); 
         sb.Append("ACTION:DISPLAY\n"); 
         sb.Append("DESCRIPTION:Reminder\n"); 
         sb.Append("PRIORITY:5\n"); 
         sb.Append("END:VALARM\n"); 
        } 
        sb.Append("END:VEVENT\n"); 
        sb.Append("END:VCALENDAR"); 

答えて

2

私はOutlookがiCalのデータを処理する方法に株式私の人生をしたくないので、これのどれが保証されていない...しかし、あなたのコード内のいくつかの誤解があります。

//Singapore Standard Time 
DateTime StartTime = DateTime.Parse("2012-04-20 13:00:00.000Z"); 

「Z」はここでは「ズールー時間」を意味する - これDateTime.ParseはUTC値としてこれを解釈し、その後、コードを実行しているシステム上のローカル時刻に変換します。だから、私のマシンでは、例えば、イギリス時間では2012年4月20日にUTC + 1になります。これにより、時刻が14:00のDateTimeの値が作成されます。

値がローカルののように解析されるようにするには、そこに「Z」を設定しないでください。

あなたは値を書き込みときは、することができます - 日付/時刻を表す(IIRC私はiCalの仕事をやったので、それはしばらくのです)の3つの方法のいずれかにより、UTC値として

  • 指定しない時間帯で、一般的な「ローカル」の日付/時刻として、それによって混乱物事
  • - (あなたはローカル値の最後にZを含めているあなたが現在誤っがそうであるように)「Z」を含みます、例えば

特定タイムゾーンの日付/時刻として

  • 「私はどこ午前8時に私を目覚め」(各種類のフォーマットの詳細についてはRFC 2445を参照してください。)

    それはありません最初のものはおそらく最も単純ですが、UTC日時を使用する必要がありますが、ローカル時刻は使用しないでください。

    ワンポイント:.NETは実際にはDateTimeと混同して、ここであなたを助けているわけではありません。 Noda Timeプロジェクトを使用して、「ローカル日付/時刻」と「特定のゾーンの日付/時刻」を分けることを検討することをお勧めします。

  • 関連する問題