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


103

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

末尾に「+ zz」が付いたフォーマットからDateTimeを解析するライブラリがあります。ライブラリは正しく解析され、現地時間を調整しますが、DateTimeオブジェクトから特定のタイムゾーンを取得する必要があります。

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


タイムゾーンとDateTimeStylesの処理については、DateTime.Parseのドキュメントに関するメモを参照してください。しかし、いいえ、あなたが望むものは実際には可能ではありません。
ヨーヨー

回答:


136

DateTime自体には、実際のタイムゾーン情報は含まれていません。それはあり、それはUTCまたはローカルだ場合は知っているが、実際にはローカルではないものを意味します。

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

.NET 3.5の時点でのタイムゾーンのサポートは、以前よりもはるかに優れていますが、標準の "ZonedDateTime"などのUTC時刻と実際のタイムゾーンが本当に必要です。自分で作成するのは簡単ですが、標準ライブラリで見るといいでしょう。

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


2
CodePlexのPublicDomainプロジェクトがこれを行います。
Cheeso

BCLのTimeZone列挙型は、世界のタイムゾーンが静的で変更されない場合に適しています。
ジェフLaFay

1
@jlafay:ただし、変更は行われます-たとえば、昨年だけWindowsにタイムゾーンが追加されました。
Jon Skeet、

このプロジェクトは作者によってもはや維持されていません。 publicdomain.codeplex.com おそらくこれは役立つかもしれませんが、使用方法によっては、使用する前に設定する必要があります。timezone.codeplex.com
AnneTheAgile 2013年

3
@AnneTheAgile:個人的にはもちろん、自分の野田タイムライブラリを使用することをお勧めします。もちろん:)
Jon Skeet

36

番号。

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

ここで優れた記事からの引用。すべての.Net開発者にとって必読です。

だから私のアドバイスはあなたのニーズに合った小さなラッパークラスを書くことです。



2

TimeZoneInfoクラスを使用できます

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

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

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

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

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

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


1
...しかし、DateTimeが与えられても、TimeZoneInfoを使用してDateTimeのTimeZoneを決定する方法はまだありません。
Remi Despres-Smyth

@ RemiDespres-Smyth DateZとともにTimeZoneInfoを1つのクラスに格納します。
Konrad、


0

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

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

他の人がここで指摘しているように、Microsoftがこれに乗り越えて、1つのオブジェクトを作成してすべてを実行できると便利ですが、ここでは2つのオブジェクトを処理する必要があります。


0

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に同意します。彼が提案した記事を読んでください。

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