データベース内の各住所のタイムゾーンの収集を開始したいと考えています。タイムゾーンを保存するためのベストプラクティスは何ですか?既存の住所レコードのタイムゾーンを取得するにはどうしますか?
Microsoft SQLサーバー、.net mvc、C#を使用しています。任意の提案をいただければ幸いです。
常に(または年に2回)変化しないものを保存したい。タイムゾーンデータベース https://en.wikipedia.org/wiki/List_of_tz_database_time_zones はまさに正しいものです。つまり、2つの文字を格納するだけです。
このデータベースから、時間オフセット、および夏時間がアクティブなときを照会できます。これは時間オフセットだけでなく、エリアも提供するため、同じ緯度にある多くの場所は異なるコードを持ち、タイムゾーンルールを個別に変更でき、ソフトウェアでそれを処理できます。
データベースを変更する必要があるのは、場所がどのタイムゾーンに属するかを変更するときだけです。これは非常にまれです。
絶対的なベストプラクティスは、SQL99で定義されたTIMESTAMP WITH TIMEZONE
データ型をサポートするデータベースを使用することです。
SQL Serverにはdatetimeoffset
と呼ばれるタイプがあり、実際のタイムゾーンの格納を除いて、TIMESTAMP WITH TIMEZONE
が実行できるすべてのことを実行します。できることは、UTCからのオフセット(2013-05-04 12:34:56 -5:00
など)を格納することだけです。つまり、タイムゾーンに基づいて格納する前に、それを決定する必要があります。
.Net Framework 4.0以上を使用していると仮定すると、必要なのは TimeZoneInfo です。
すべての日付値をUTC形式でデータベースに保存します。各クライアントのID値またはToSerializedString()の結果のいずれかを使用して、TimeZoneInfoオブジェクトを作成し、保存されている日付をローカル形式に変換して表示します。