0

C# コードを使用して .ics ファイルを生成し、イベントを Outlook カレンダーに追加しています。

.ics ファイルは、次のコードで正常に生成されます。しかし、ここで 1 つ問題があります。それは、タイム ゾーンに従って開始/終了時間を設定することです。たとえば、.ics ファイルのシンガポール標準時間の開始/終了時刻があります。誰かがシンガポールでファイルを開いた場合はシンガポール時間を表示し、インドで開いた場合はインド時間を表示する必要があります。2012-04-20 13:00 のように、今回はインドで 10:30Am になります。インドで .ics ファイルが開かれた場合、.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");
4

1 に答える 1

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 である英国時間で) DateTime、時刻が 14:00 の値が作成されます。

値をローカルの日付/時刻として解析する場合は、そこに「Z」を含めないでください。

値を書き込むとき、次の 3 つの方法のいずれかで日付/時刻を表すことができます (IIRC - iCal の作業を行ってからしばらく経ちます)。

  • 「Z」を含めて UTC 値として (現在間違っているように -ローカル値の最後に Z を含めています)、混乱を招きます。
  • タイムゾーンが指定されていない一般的な「ローカル」の日付/時刻として、たとえば「どこにいても午前 8 時に起こして」
  • 特定のタイムゾーンの日付/時刻として

(各タイプの形式の詳細については、RFC 2445を参照してください。)

これらのうちどれが必要かは明確ではありません - 最初のものはおそらく最も単純ですが、ローカルの日付/時刻ではなくUTCの日付/時刻を使用する必要があります。

1 つのポイント: .NET は、.NET と混同するため、ここではあまり役に立ちませんDateTime。「ローカルの日付/時刻」と「特定のゾーンの日付/時刻」を別々に保持する私のNoda Timeプロジェクトの使用を検討することをお勧めします。

于 2012-04-17T06:16:29.577 に答える