私はこの古いish未回答の質問を見つけたので、私はそれを刺すべきだと思った。
簡潔に言えば、このアプローチは有効/安全ですか?
すべては、あなたがそれらをどのように計画しているかによって異なります。
サーバー側のコードでのみ使用している場合は、はい。単にタイムゾーンのId
を保存し、ユーザーに対応するDisplayName
を表示するだけです。 FindSystemTimeZoneById
とGetSystemTimeZones
はこれに対して完全に有効です。
Id
の値は常に同じですが、DisplayName
のプロパティは、コードを実行しているWindowsオペレーティングシステムの言語によって異なります。実装はであり、では認識されないため、.NETで異なるターゲットカルチャを設定するだけでDisplayName
文字列は変更されません。
Microsoft Windowsのタイムゾーンデータベースのレコードはかなり安定しており、Windows Update経由で更新されます。 の情報の一部はレジストリから取得されますが、ローカライズされたリソース文字列はtzres.dll
から取得されています。もちろん、そのすべてはTimeZoneInfo
とそれに関連するクラスによって隠されています。
ただし、これらのタイムゾーンId
の値を他のシステムに渡す場合は注意してください。以前のバージョンのWindowsではいくつかのバリエーションがあります。たとえば、私は表示名がすべて "GMT"と言い、現在はより正確に "UTC"と言われていることを知っています。 Id
の値は同じですが、それ以外のものが一貫していないことを正確に知っています。特に、ターゲットコンピュータがあなたが持っている同じWindows Updateセットを受信していない場合。ちなみに、更新は、hereと発表されています。
また、Windowsタイムゾーンデータベースに関するいくつかのことを知っている必要があります。
またTimeZoneInfo
が密接DateTime
とDateTimeOffset
クラスにリンクされていることを知っている必要があります。これらには独自のセットがあります。 DateTimeOffset
はやや使えますが、DateTime
はニュアンスが詰まっています。読む:
.NETでの日付と時刻にはるかよりよい解決策はNodaTimeを使用することです。このライブラリは、のタイムゾーンデータベースとその間のCLDRマッピングを実装しています。また、より安全なAPIを提供し、問題に陥ることもありません。再学習するには少し時間がかかるかもしれませんが、それを知る前に、LocalDateTime
、ZonedDateTime
、OffsetDateTime
、Instant
のようなクラスを使用します。
タイムゾーンデータベースを頻繁に更新するという問題はありますが、私たちは政治家に計時ルールを任せています。しかし、the TZDB folksは、データベースを歴史的に正確に保ち、ゾーン名が変わるとエイリアス/リンクを提供するのには大変良い仕事です。あなたはtzの名前hereのリストを見ることができます。
また、NodaTimeをお持ちの場合は、配布物にコンパイルされたTZDBのコピーを貼り付けるか、自分のアプリケーションと共に配布することができます。あなたは(理論的に)IANAから最新のバージョンをプルダウンして、アプリケーションを更新したままにするためのコードを書くことができます。すべて、ホストのオペレーティングシステムに依存しません。
['DateTimeOffset'](http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx)を見ましたか?または['NodaTime'](http://code.google.com/p/noda-time/)? – Oded
関連:http://stackoverflow.com/q/2532729/1583 – Oded
@Oded DateTimeOffsetの問題は、Day Light Savings対応ではないことです。 – Paparazzi