0


0

UTCからユーザーの現地時間

アプリケーション内で発生したさまざまなイベント(たとえば、作成中のドキュメントなど)の日付を表示するWebアプリケーションを作成しています。 もちろん、表示される日付は、ユーザーがどこにいるのかを考慮する必要があります(サーバーのローカル時間になるため、保存された日付を盲目的に出力するだけではありません)。

すべてのタイムゾーンを一覧表示し、選択して、選択したタイムゾーンに保存されているUTC日付を出力し、タイムゾーンがDSTを監視している1時間を追加するサンプルアプリケーションを作成しました。

私の質問は、これは最適なアプローチであるか、および/またはこのアプローチではすべての場合に機能しない何かを見逃したかどうかです。

static void Main(string[] args)
{
 List events = new List();

 events.Add(DateTime.UtcNow);
 events.Add(DateTime.UtcNow.AddDays(1));
 events.Add(DateTime.UtcNow.AddDays(7));

    var timeZones = TimeZoneInfo.GetSystemTimeZones();

 for (var i = 0; i < timeZones.Count; i++)
 {
  Console.WriteLine(i + " : " + timeZones[i].DisplayName);
 }

 var currentZone = timeZones[Convert.ToInt32(Console.ReadLine())];

 Console.WriteLine("UTC Event: {0}", events[0]);
 Console.WriteLine("Local Event: {0}", correct(events[0], currentZone));

 Console.ReadKey();
}

static DateTime correct(DateTime date, TimeZoneInfo timeZone)
{
 var correctedDate = date.AddHours(timeZone.BaseUtcOffset.TotalHours);

 if (timeZone.IsDaylightSavingTime(date))
 {
  return correctedDate.AddHours(1);
 }

 return correctedDate;
}

出力から期待する結果を得ています。タイムゾーンの複雑な問題は、これほど簡単に解決することはできないのではないかと心配しています。

1 Answer


1


それよりもはるかに簡単です:)

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx [TimeZoneInfo.ConvertTimeFromUtc]を使用します - 自分でオフセットをいじる必要はありません:)(特に、 現在のコードでは、DSTの差が正確に1時間であると想定していますが、これは常に正しいとは限りません。)

そうではないときに何かがUTCにあると考えるのを避けるために、 `DateTimeOffset`を使用することができます。