12

次のコード (C#) が false を返す理由:

DateTime d = DateTime.Now;
d.Ticks == d.ToUniversalTime().Ticks; // false

DateTime の目盛りは UTC 時間に基づいていると思います。DateTime.Ticksの MSDN ページには、次のように記載されています。

このプロパティの値は、DateTime.MinValue を表す 0001 年 1 月 1 日の真夜中の 12:00:00 から経過した 100 ナノ秒間隔の数を表します。うるう秒に起因するティック数は含まれません。

0001 年 1 月 1 日の午前 0 時 .. どのタイムゾーンですか?

DateTime.Ticks がタイムゾーンに依存するのはなぜですか?

ティックが異なるという事実が、次のコードも false を返す理由だと思います

DateTime d = DateTime.Now;
d == d.ToUniversalTime(); // false

DateTime.Equalsに関する MSDN doc の言及

Ticks プロパティの値が等しい場合、t1 と t2 は等しくなります。それらの Kind プロパティ値は、等しいかどうかのテストでは考慮されません。

私の期待は、タイムゾーンに関係なく、DateTime.Ticks が等しいということでした。

どのタイムゾーンで発生したかに関係なく、2 つの瞬間は等しいと思います。私の期待は間違っていますか?

4

3 に答える 3

12

ソース: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fde7e5b0-e2b9-4d3b-8a63-c2ae75e316d8

DateTime.Ticks は、「0001 年 1 月 1 日午前 0 時 12:00:00 から経過した 100 ナノ秒間隔の数」として文書化されています。これは、現地時間の 0001 年 1 月 1 日です。DateTime を UTC に変換すると、Ticks は 0001 年 1 月 1 日午前 0 時 (UTC) の 12:00:00 から経過した 100 ナノ秒間隔の数になります。0001 年 1 月 1 日現地時間と異なる可能性があるため、2 つの Ticks 値は異なります。

于 2012-04-20T18:59:52.343 に答える
2

現在の日時 (1 つの特定のタイム ゾーン (GMT) に住んでいる場合を除く) は、UTC 時間から x 時間ずれているため、DateTime.Now は午前 4 時になる可能性がありますが、Datetime.Now.ToUniversalTime() は状況によっては午後 11 時になる可能性があります。あなたの現在のタイムゾーンで。

タイム ゾーンから世界時への変換後にティックが計算されるため、GMT タイム ゾーンに住んでいる場合にのみ、ティックが等しくなるはずです。

もっと簡単に言えば、2011 年 1 月 1 日午前 8:00 の間のティック数は、2011 年 1 月 1 日午後 11:00 以降のティック数と同じではありません。あなたのコードでは、日付は世界共通の日付に変換され、方程式の右側でティックが計算されますが、ローカル日付を使用して左側の差を取得しているだけなので、それらは != each です他の。

于 2012-04-20T18:59:09.097 に答える
0

DateTime.Nowタイムゾーンオフセットに基づいて決定されます。つまり、オフセットがゼロでない限り、世界時と同じにはなりません。2 つの異なるタイム ゾーンのティックに変換DateTime.Nowして同じ結果を得ることは意味がありません。それらは同じ絶対時間 (UTC) ですが、同じ相対時間ではありません (タイム ゾーン オフセットを使用)。

于 2012-04-20T18:58:55.727 に答える