最近、.net のタイム ゾーン対応 Web アプリケーションでタイム ゾーンをいじっています。タイムゾーンを処理するための次のソリューションを思い付きました。
私の解決策は次のとおりです。
- ユーザー プロファイルに、ユーザーがいるタイム ゾーンを保存します。
- Web サーバーで、UTC との間のすべての変換を行います。
- 日付を UTC として DB に保存します。
私の質問は:
- これが .net での最善のアプローチだと思いますか?
- UTC で datetime2 を使用するだけで十分ですか、それともクライアントの時刻をオフセット付きで DB に保存する必要がありますか (基本的に 10-10-2012 4:00:00 と 10-10-2012 00:00:00 4:00)?
- 余談ですが、DST をまたぐジャンプはサーバー コードで処理されますが、DB 上の SP などにオフセットを渡すと、DST が正しく処理されないことに気付く人もいるでしょう。これに関するアイデアはありますか?
時間変換のサンプル コードを次に示します。
private TimeZoneInfo GetTimeZoneInfo()
{
var timeZone = TimeZoneDropdown.SelectedValue;
switch (timeZone)
{
case "Eastern":
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
case "Central":
return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
case "Mountain":
return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time");
case "Pacific":
return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
case "Alaskan":
return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time");
}
return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
}
public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone);
}
public DateTime ConvertUtcToLocalDateTime(DateTime dateTime)
{
var timeZone = GetTimeZoneInfo();
return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone);
}