.Net DateTimeには、それが作成されたタイムゾーンに関する情報が含まれていますか?
末尾に「+ zz」が付いたフォーマットからDateTimeを解析するライブラリがあります。ライブラリは正しく解析され、現地時間を調整しますが、DateTimeオブジェクトから特定のタイムゾーンを取得する必要があります。
これはまったく可能ですか?表示されるのはDateTime.Kindだけです。これは、時間がローカルかUTCかを指定します。
.Net DateTimeには、それが作成されたタイムゾーンに関する情報が含まれていますか?
末尾に「+ zz」が付いたフォーマットからDateTimeを解析するライブラリがあります。ライブラリは正しく解析され、現地時間を調整しますが、DateTimeオブジェクトから特定のタイムゾーンを取得する必要があります。
これはまったく可能ですか?表示されるのはDateTime.Kindだけです。これは、時間がローカルかUTCかを指定します。
回答:
DateTime自体には、実際のタイムゾーン情報は含まれていません。それはあり、それはUTCまたはローカルだ場合は知っているが、実際にはローカルではないものを意味します。
DateTimeOffsetの方がいくらか優れています。これは、基本的にUTC時間とオフセットです。ただし、多くの異なるタイムゾーンが任意の時点で同じオフセットを持つ可能性があるため、それでもタイムゾーンを特定するには十分ではありません。日付/時刻を解析するときに作業する必要があるのはオフセットだけなので、これで十分かもしれません。
.NET 3.5の時点でのタイムゾーンのサポートは、以前よりもはるかに優れていますが、標準の "ZonedDateTime"などのUTC時刻と実際のタイムゾーンが本当に必要です。自分で作成するのは簡単ですが、標準ライブラリで見るといいでしょう。
編集:ほぼ4年後、日付/時刻タイプのセットがかなり豊富な野田時間を使用することをお勧めします。野田タイムの主な著者として、私は偏っています:)
あり、.NETのためのパブリックドメインのタイムゾーンライブラリが。本当に便利です。ニーズにお応えします。
一般的なケースのタイムゾーン問題を解決することは、あなたが考えるより難しいです。
TimeZoneInfoクラスを使用できます
TimeZoneクラスはローカルタイムゾーンを認識し、協定世界時(UTC)とローカル時間の間で時間を変換できます。TimeZoneInfoオブジェクトは任意のタイムゾーンを表すことができ、TimeZoneInfoクラスのメソッドを使用して、1つのタイムゾーンの時刻を他のタイムゾーンの対応する時刻に変換できます。TimeZoneInfoクラスのメンバーは、次の操作をサポートします。
オペレーティングシステムで既に定義されているタイムゾーンを取得する。
システムで使用可能なタイムゾーンを列挙します。
異なるタイムゾーン間の時間の変換。
オペレーティングシステムでまだ定義されていない新しいタイムゾーンを作成する。
後で取得するためにタイムゾーンをシリアル化します。
API(http://msdn.microsoft.com/en-us/library/system.datetime_members ( VS.71 ) .aspx)からは、使用されているタイムゾーンの名前を表示できないようです。
一般的には、「タイムゾーン」がUTCのDateTimeとしてデータを渡し、次にTimeZoneInfoオブジェクトを渡します。データを表示する準備ができたら、TimeZoneInfoオブジェクトを使用してUTC DateTimeを変換します。
もう1つのオプションは、現在のタイムゾーンを使用してDateTimeを設定し、DateTimeオブジェクトの「timezone」が不明であることを確認してから、渡されたDateTimeのTimeZoneを示すTimeZoneInfoでDateTimeが再び渡されることを確認します。
他の人がここで指摘しているように、Microsoftがこれに乗り越えて、1つのオブジェクトを作成してすべてを実行できると便利ですが、ここでは2つのオブジェクトを処理する必要があります。
DateTimeはタイムゾーンのオフセットを認識していません。オフセットまたはタイムゾーン名(EAT、CEST、ESTなど)を返す組み込みメソッドはありません。
他の人から提案されたように、日付をUTCに変換できます:
DateTime localtime = new DateTime.Now;
var utctime = localtime.ToUniversalTime();
そして、違いだけを計算します:
TimeSpan difference = localtime - utctime;
また、DateTimeOffsetを使用して、ある時間を別の時間に変換することもできます。
DateTimeOffset targetTime = DateTimeOffset.Now.ToOffset(new TimeSpan(5, 30, 0));
しかし、これは一種の不可逆な圧縮です。2つの異なる国が異なるタイムゾーンにあり、1年の一部のみ(たとえば、南アフリカとヨーロッパ)に同じ時間を持っている可能性があるため、オフセットだけではどのタイムゾーンであるかはわかりません。また、夏の夏時間は異なる日付で導入される場合があることに注意してください(ESTとCET-3週間の違い)。
TimeZoneInfoクラスを使用して、ローカルシステムのタイムゾーンの名前を取得できます。
TimeZoneInfo localZone = TimeZoneInfo.Local;
localZone.IsDaylightSavingTime(localtime) ? localZone.DaylightName : localZone.StandardName
私はGerrie Schenckに同意します。彼が提案した記事を読んでください。