2012-07-20 6 views
12

私は引き継いだasp.net-mvcのWebサイトを持っています。人々が情報と時間を入力するページページがあります(ローカルタイムゾーンを含む)。データベースは開始時間、終了時間、タイムゾーンを維持しています。ここから選択するリストを取得するコードは次のとおりです。私のDBにタイムゾーン情報を保存する最良の方法は何ですか?

static private IEnumerable<SelectListItem> GetTimeZones(string selected) 
    { 
     var timeZoneNames = TimeZoneInfo.GetSystemTimeZones() 
      .Where(tz => tz.DisplayName.Contains("London") 
         || tz.DisplayName.Contains("Hong Kong") 
         || tz.DisplayName.Contains("Mumbai") 
         || tz.DisplayName.Contains("Eastern Time")) 
      .ConvertAll(tz => tz.DisplayName).ToList(); 

     var items = new List<SelectListItem>(); 
     foreach (var item in timeZoneNames) 
     { 
      var slItem = new SelectListItem(); 
      slItem.Text = item; 
      slItem.Value = item; 
      slItem.Selected = item == selected; 
      items.Add(slItem); 
     } 

     return items; 
    } 

だから、その、単にTimeZoneInfo.GetSystemTimeZonesから返される完全な文字列を格納()

は、このアプローチには不備がありますか?私はちょっと心配していますreading hereこれは、異なるマシンが異なる設定を持っている場合、これがマシンからローカルに来るものです。また、すべてがUTCかGMTなどとしてリストされているかどうかを調べようとしています。 。より良い提案はありますか?たとえば、私はウェブサイト上でUTCへの変換を行い、データベース内のすべての時間を正規化する必要がありますか?

+2

SQL Serverののバージョンは? SQL Server 2008には、['DATETIMEOFFSET'](http://msdn.microsoft.com/en-us/library/bb630289(v= sql.100).aspx)が導入されました。私はまだそれのための使用を見つけるために(私はむしろユーザーのタイムゾーンを一度格納し、UTCとして日付を格納し、ユーザーごとに調整する)が、この目的のために使用することができると主張する。 –

+0

DBに日付時刻をUTCとして格納することには1つの欠点があります。 DB側でDSTをどのように考慮しますか?タイムゾーンとDSTに関して、DateTimeまたはDateTime2をユーザーのローカル時刻に変換する方法はありません。オフセットを渡すと、ある日はDSTに、もう1つはDSTになっているため、まだオフになっている可能性があります。例3/10/2012 2:00:00 ESTは3/09/2012 20:00:00 UTCですが、2012/03/13 2:00:00 ESTは2012年3月12日19:00:00 UTCです。基本的に-4と-5のオフセット。 UTCをローカルに変換するには、オフセットをSP -4または-5に渡しますか?いずれにせよ、どちらかが間違っています。 – aBetterGamer

答えて

19

TimeZoneInfo.Idで返されたIDを保存する必要があります。これは識別子です - の文字列はのタイムゾーンを示します。表示名を使用するのは、文化によって異なる可能性があり、安定性が低い可能性があるため、本当に悪い考えです。

TimeZoneInfo.FindSystemTimeZoneByIdを使用して、IDからゾーンを取得できます。

確かに私は、タイムゾーンの処理のためのTZDBを好むが、それは別の問題だ:)

+0

あなたはTZDBについてもっと光を当てることができますか?なぜそれを好むのですか? –

+0

@Jon Skeet - 明確にするために、Idプロパティも文字列(「東部標準時」など)であるように見えます。 。それはあなたが私が提案しているフィールドですか? – leora

+0

@leora - 彼はドキュメントにリンクしています。そうです、それはあなたが使うべきフィールドです。 –

関連する問題