1

DateTimeOffset は、.Kind プロパティを UTC へのオフセットであるより便利なものに置き換えるため、DateTime と比較して、単一の時点を参照する方が適切で信頼性の高い方法であることを理解しています。

これは、単一のポイントを日時に格納することに関するすべての問題を解決しますか?それとも、懸念すべきいくつかのケースがまだありますか? (DateTimeOffset が信頼できない例があれば教えてください。)

ありがとう

4

1 に答える 1

1

が与えられたDateTimeOffset場合、それが表す時点について混乱することは決してありません。そのため、常に信頼できます。

DateTimeOffsetただし、 aだけでは不十分な場合もあります。一般的な状況の例を次に示します。

  • あなたは 2013 年 3 月 10 日にアメリカのニューヨークにいます。
  • 現地時間の午前 1 時にイベントが発生していることを知りました。
  • として記録します。DateTimeOffset値は です2013-03-10T01:00:00-05:00
  • 後で、誤った情報が提供されたことに気付きました。イベントは実際には午前 3:00 に発生しました。
  • したがって、編集に移動し、値を に変更します2013-03-10T03:00:00-05:00
  • しかし、これは正しくありません。その特定の日はサマータイムが始まるため、午前 3:00 は午前 1:00 よりわずか 1 時間遅いだけです。オフセットが変更された可能性があることを考慮せずに時間を進めるだけでは、間違った時点を参照しています。
  • だったはず2013-03-10T03:00:00-04:00です。

この状況を克服するには、時刻がニューヨークで記録されたことも知っておく必要があります。最初のステップでそれを知っていましたが、それを録音したときに捨てられました。アプリケーションのどこかで、この事実を保持する必要があります。できれば、正しいオフセットを再計算できるように、タイム ゾーン ID を保持することをお勧めします。

TimeZoneInfoアプリケーションでクラスを使用する場合は、.Idプロパティの値をDateTimeOffset. ニューヨークの場合、タイム ゾーン ID は"Eastern Standard Time". DST が有効であるかどうかに関係なく、この同じ値が使用されるため、これは少し混乱します。Id(の付いた Windows タイム ゾーンはありません"Eastern Daylight Time")。TimeZoneInfoまた、 aと aをペアにする組み込みのクラスまたは構造体はありませんDateTimeOffset。あなたはそれを自分でしなければなりません。

Noda Timeを使用している場合(これを強くお勧めします)。次に、 の IANA タイム ゾーン ID と"America/New_York"、まさにZonedDateTimeこの状況向けに設計されたオブジェクトを利用できます。

DateTime vs DateTimeOffsetも参照してください。そこにあるアナロジーが非常に役立つことがわかるはずです。


適さない場合もありDateTimeOffsetます。これは明らかなことかもしれませんが、言及する価値はあります。

  • ある瞬間を指すのではなく、カレンダー上の相対的な時点を指す場合

これは、あなたが思っているよりも頻繁に起こります。例えば:

  • 米国では、今年の夏時間が 2013 年 3 月 10 日午前 2 時に始まりました。
  • しかし、それはまったく同じ瞬間に起こったわけではありません。各タイム ゾーンには独自のローカル AM 2:00 があるため、瞬間的なタイムラインには実際にはいくつかの異なる移行ポイントがあります。
  • (余談ですが、言及する価値があるのは、ヨーロッパでは、DST (「夏時間」) が一度に発生することです。移行は、西ヨーロッパ、中央ヨーロッパ、および東ヨーロッパ時間の同じ UTC 時間に基づいています。)

カレンダー上の同じ時点が同じ時点ではないという実例が他にもありますが、人々はそれらをあたかも同じ時点であるかのように考える傾向があります。

  • 日の境界 (「今日」、「昨日」、「明日」)
  • その他の完全指定日 (「今週の水曜日」、「先週の金曜日」)
  • テレビ番組 (「火曜日の夜 7 時」)
  • 通話プラン(「夜間・土日無料」)
  • 他にも数え切れないほど...

Noda Time では、LocalDateTimeこれらのシナリオに a を使用します。Noda Time がなければ、 with を使用DateTime.Kind == Unspecifiedます。

于 2013-06-17T21:18:02.433 に答える