4

DateTimeOffset と夏時間について質問があります。私の質問を説明するために、現在の日付と時刻が次のとおりであると仮定します。

11/6/2010  10:15:00 AM 

このコードを実行すると:

DateTimeOffset myTime = DateTimeOffset.Now;
Console.WriteLine("Local time: " + myTime.ToLocalTime().DateTime);

次に、次の結果が得られます。

現地時間: 2010 年 11 月 6 日 10:15:00 AM

イベントが午前 10 時 15 分に発生したことを意味します (私のタイムゾーンは山地夏時間 (-6 オフセット))。

そこで、この DateTimeOffset を SQL Server 2008 データベースに (DateTimeOffset として) 保存します。翌日、ユーザーに表示したい。しかし、現在、サマータイムは終了しています。

上記の WriteLine を (前日から) 保存された off 値で実行すると、何が表示されますか?

データベースに格納されるオフセットは -6 です。しかし、夏時間が終わった今、現在のオフセットは -7 です。ドキュメントを理解しているので、最初に時間をUTC時間に変換します(したがって、午前10時15分かかり、6時間(午後4時15分)が追加されます。次に、現地時間の現在のオフセット(4時15分)が減算されます午後 - 7 = 午前 9 時 15 分)。

したがって、私の計算が正しければ、イベントを表示すると、午前 10 時 15 分ではなく午前 9 時 15 分に発生したことが示されます。

これは良くない。タイム ゾーン情報を保存したいのですが、同じタイム ゾーンで静的な時間を維持する必要があります。(つまり、イベントがユタ州で午前 10 時 15 分に発生した場合、次に (ユタ州で) それを見るとき、夏時間の変更が発生したかどうかに関係なく、それが午前 10 時 15 分であったことを確認する必要があります。 .

私がこの問題を抱えた最初の人だとは思えません。これを修正するために他の人は何をしますか?(それとも、事実が間違っているのでしょうか?)

4

1 に答える 1

6

いいえ、現在のオフセットは追加されません。-6 のままであるその日付のオフセットが追加されます。したがって、関係する日付がわかっているため、10:15AM と表示されるはずです。したがって、その日付にはタイム ゾーン ルールが適用されます。

ところで、単純な UTC 時間とタイム ゾーン識別子を別々に保存することもできます。タイムゾーンを保存している場合DateTimeOffset、UTC の日付/時刻だけでは特に役に立ちません。(一方で、それが時間のある瞬間を表していることDateTime明らかです。表現しようとしているものを簡単に表現できない、恐ろしく混乱したタイプです。)

もちろん、個人的にはNoda Timeを参照することをお勧めします。これは、私の非常に偏った意見では、組み込み API よりもかなり明確な日付/時刻 API ですが、本番環境で使用する準備が整っていません。(しかし、私たちはそこに着いています...)

于 2011-07-20T22:49:23.477 に答える