2

イベントを Outlook および iCal にインポートするための vCal および iCal ファイルを生成するページがあります。これらのメール クライアント (Outlook および iCal) は、ユーザーのオフセットを知っているため、UTC で日付を取り込み、適切な時刻を挿入します。このコードを書いているクライアントは米国東部時間帯を拠点としており、私もそうです。彼らのホストは中部時間帯 (東部時間から 1 時間遅れています) にいます。ハードコーディングされたオフセットなしで、コードでこれを処理できるようにしたいと思います。私のコードは現在、CMS から DateTime を取得し、Outlook/iCal の UTC に変換します。つまり、CMS からの DateTime 値は、ホスティングの場所に相対的です。

// Start Date Time
sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

これをローカルで実行すると、すべて問題ありません。CMS の DateTime はクライアントの東部時間帯に基づいているため、私もそうです。したがって、プロセスは東部 -> UTC -> Outlook に入り、UTC -> 東部になります。 、そしてすべてが良いです。Central のサーバーに展開すると、CMS からの DateTime は東部から 1 時間ずれています。東からのオフセットを自動的に取得し、UTC に変換する前に追加するにはどうすればよいですか? これは明らかに、標準時 (EST) と夏時間 (EDT) の両方を処理するために必要です。ハードコーディングされた値を使用せずにプログラムで実行したいので、現在のタイムゾーンに関係なく常に正しく機能します。つまり、このコードをインドで開発するために誰かに提供すると、ローカルサーバーのオフセットとそれに応じて調整します。

UTC に変換する前に東部時間にオフセットを適用する場合、次のようにする必要があります。

sb.AppendFormat("DTSTART:{0}\n", thisEvent.StartDate.ApplyEasternOffset().ToUniversalTime().ToString("yyyyMMddTHHmmssZ"));

これが以前に議論されたトピックである場合は申し訳ありませんが、このような質問を見つけるのに最適な用語がわかりません. 前もって感謝します。

4

2 に答える 2

7

TimeZoneInfo クラスを確認してください。任意のタイムゾーンの UTC オフセットを取得するメソッドがあります。

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

また、この以前の投稿を確認してください: TimeZoneInfo を使用して夏時間中に現地時間を取得する方法?

以下は、太平洋から東部への変換を示す例です。

var eastern = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var local = TimeZoneInfo.Local; // PDT for me
Console.WriteLine(DateTime.Now.Add(eastern.BaseUtcOffset - local.BaseUtcOffset));

ローカル クロックが 9:05:31 を示しているときに 4/4/2011 12:05:31 と表示されます。

于 2011-04-04T15:44:01.073 に答える
6

TimeZoneInfoクラスを使用できます。

このサンプルを見てください:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time");
TimeSpan offset = tzi.GetUtcOffset(DateTime.Now);

DateTime testDateTime = DateTime.Now.Add(offset);
于 2011-04-04T15:42:33.057 に答える