TimeZonesをデータベースに保存するためのベストプラクティスは何ですか?


12

データベース内の各住所のタイムゾーンの収集を開始したいと考えています。タイムゾーンを保存するためのベストプラクティスは何ですか?既存の住所レコードのタイムゾーンを取得するにはどうしますか?

Microsoft SQLサーバー、.net mvc、C#を使用しています。任意の提案をいただければ幸いです。



ところで、通常のタイムゾーンの問題はintを使用することですが、一部のタイムゾーンは+または-30分、または15分にさえなる可能性があります。
ロックラン2013

2
@LachlanB言い換えると、タイムゾーンは時間オフセットよりも場所の方が多いということです。しかし、その見方だけでは十分ではありません。たとえば、ロシアは夏時間に関するポリシーを最近変更しました。つまり、実際の日付に応じて異なる方法で処理する必要があります。
ダニエルB

回答:


7

常に(または年に2回)変化しないものを保存したい。タイムゾーンデータベースhttps://en.wikipedia.org/wiki/List_of_tz_database_time_zonesは、まさに正しいものです。つまり、2つの文字を格納するだけです。

このデータベースから、時間オフセットを照会でき、夏時間がアクティブであるときも確認できます。これは時間オフセットだけでなく、エリアも提供するため、同じ緯度にある多くの場所は異なるコードを持ち、タイムゾーンルールを個別に変更でき、ソフトウェアがそれを処理できます。

データベースに変更を加える必要があるのは、場所がそれが属するタイムゾーンを変更するときだけです。これは非常にまれです。


ウィキペディアのリストには、すべての IANAタイムゾーンの2文字の省略形が含まれていないことに注意してください。さらに、マッピングは明確ではありません。完全な履歴情報が必要な場合は、代わりに完全な名前を使用してください。
ハルク

2
ウィキペディアのページに表示されている2つの文字コードは国コードだけです。これらはタイムゾーンを一意に定義するものではありません。たとえば、米国のすべてのタイムゾーンには、同じ2文字の国コードUSがあります。同様に、オーストラリア全土に国コードAUがあります。
Ian

3

絶対的なベストプラクティスはTIMESTAMP WITH TIMEZONE、SQL99で定義されたデータ型をサポートするデータベースを使用することです。

SQL Serverには、実際のタイムゾーンを格納する以外のdatetimeoffsetすべての処理TIMESTAMP WITH TIMEZONEを実行すると呼ばれるタイプがあります。できることは、UTCからのオフセット(例:)を格納する2013-05-04 12:34:56 -5:00ことだけです。つまり、タイムゾーンに基づいて格納する前に、それを決定する必要があります。


3

.Netフレームワーク4.0以降を使用していると仮定すると、TimeZoneInfoが必要です。

すべての日付値をUTC形式でデータベースに保存します。各クライアントのID値またはToSerializedString()の結果のいずれかを使用して、TimeZoneInfoオブジェクトを作成し、保存されている日付をローカル形式に変換して表示します。


2

各アドレスのタイムゾーンをDBに保存したいとおっしゃいましたが、それで何をしたいのかお話ししていません。DBに何かを保存すること自体が目的であることはめったにありません。

いずれにせよ、私はTZデータベース(別名Olsenデータベース)を直接使用するか、TZを統合する市販のソフトウェアを使用することを検討します。タイムゾーンを単に文字列として保存して、TZ DBエントリの 1つを参照することができます(例: 'Africa / Kampala'または 'Europe / Paris')。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.