web-dev-qa-db-ja.com

DateTimeからタイムゾーンを取得する

.Net DateTimeには、作成されたタイムゾーンに関する情報が含まれていますか?

最後に「+ zz」を含む形式からDateTimeを解析するライブラリがあり、正しく解析して現地時間を調整している間、特定のタイムゾーンがDateTimeオブジェクトから何であるかを取得する必要があります。

これはまったく可能ですか?表示されるのはDateTime.Kindだけです。これは、時刻がローカルかUTCかを指定します。

93
dbkk

DateTime自体には、実際のタイムゾーン情報は含まれていません。それはmayそれがUTCかローカルかを知っていますが、ローカルが本当に何を意味しているかはわかりません。

DateTimeOffsetはいくぶん優れています-これは基本的にUTC時間とオフセットです。ただし、多くの異なるタイムゾーンが任意の時点で同じオフセットを持つ可能性があるため、それでもタイムゾーンを決定するにはまだ十分ではありません。これは、日付/時刻の解析がオフセットであるときに作業しなければならないので、あなたにとって十分であるように思えます。

.NET 3.5でのタイムゾーンのサポートは以前よりもはるかに優れていますが、標準の "ZonedDateTime"またはそのようなもの(UTC時間と実際のタイムゾーン)が本当に見たいです。独自に構築するのは簡単ですが、標準ライブラリで見るといいでしょう。

編集:ほぼ4年後、 Noda Time を使用することをお勧めします。これには、より豊富な日付/時刻型のセットがあります。しかし、野田タイムの主な著者として、私は偏見があります:)

128
Jon Skeet

番号。

開発者は、何らかの外部メカニズムを介してDateTime値に関連付けられたタイムゾーン情報を追跡する責任があります。

優れた記事からの引用 こちら 。すべての.Net開発者について読む必要があります。

したがって、私のアドバイスは、ニーズに合った小さなラッパークラスを作成することです。

34
Gerrie Schenck

。NETのパブリックドメインTimeZoneライブラリ があります。本当に便利です。それはあなたのニーズに応えます。

一般的なケースのタイムゾーンの問題を解決することは、あなたが考えるより難しいです。

5
Cheeso

TimeZoneInfo classを使用できます

TimeZoneクラスはローカルタイムゾーンを認識し、協定世界時(UTC)とローカル時間の間で時間を変換できます。 TimeZoneInfoオブジェクトは任意のタイムゾーンを表すことができ、TimeZoneInfoクラスのメソッドを使用して、あるタイムゾーンの時間を他のタイムゾーンの対応する時間に変換できます。 TimeZoneInfoクラスのメンバーは、次の操作をサポートします。

  1. オペレーティングシステムによって既に定義されているタイムゾーンの取得。

  2. システムで使用可能なタイムゾーンを列挙します。

  3. 異なるタイムゾーン間の時間の変換。

  4. オペレーティングシステムによってまだ定義されていない新しいタイムゾーンを作成します。

    後で取得するためのタイムゾーンのシリアル化。

2
Shekhar

APIから( http://msdn.Microsoft.com/en-us/library/system.datetime_members(VS.71).aspx )時間の名前を表示できるとは思われない使用されるゾーン。

1
tehvan

一般的に、UTCの「タイムゾーン」を持つDateTimeとしてデータを渡し、次にTimeZoneInfoオブジェクトを渡し、データを表示する準備ができたら、TimeZoneInfoオブジェクトを使用してUTC DateTimeを変換します。

もう1つのオプションは、DateTimeを現在のタイムゾーンに設定し、DateTimeオブジェクトの「タイムゾーン」が不明であることを確認し、DateTimeが渡されたDateTimeのTimeZoneを示すTimeZoneInfoで再度渡されることを確認します。

他の人がここで示したように、Microsoftがこれに乗り、それをすべて行うために1つのNiceオブジェクトを作成したのは素晴らしいことですが、今のところは2つのオブジェクトを処理する必要があります。

0
Rob