2017-06-06 10 views
2

単一の方法でDateTime.UtcNowへの2回の呼び出しの間に、単純な数学の長いループがあるとします。DateTime.UtcNowは同じメソッド内で異なる値を返しますか?

DateTime.UtcNowは、その間のコードがシステムのタイマーの分解能、たとえば10ミリ秒を超えた場合、同じメソッド内で2つの異なる値を返しますか?

拡張子によって、日付が新しい日に切り替わる瞬間にコードが正しく実行された場合、DateTime.UtcNow.Dateは同じメソッド内で2つの異なる日付になりますか?

+5

になることを良いチャンスがありますはい、はい、はい? –

+8

はい、時間はコードがないのを待ちます。しかし、あなたがそれを変数に入れたければ... – Nkosi

+1

これは非常に興味深い質問です。多くの人が指摘しているように、答えは「はい」です。何を求めてくるのですか? – n8wrl

答えて

4

なぜ実験をしないのですか?

DateTime t1 = DateTime.UtcNow; 

    while (true) { 
    DateTime t2 = DateTime.UtcNow; 

    if (t2 != t1) { 
     Console.Write($"{(t2 - t1).TotalMilliseconds}"); 

     break; 
    } 
    } 

結果:

1.0001 

だから、私のワークステーションでDateTime.UtcNowはミリ秒の解像度を持ちます。メソッドが完了するまでにミリ秒を要する場合や、DateTime.UtcNowはdefinetely異なる値を返すます:

DateTime t1 = DateTime.UtcNow; 

    // 10 ms routine here 
    DoSomething(); 

    // t1 != t2; t2 ~ t1.AddMilliseconds(10) 
    DateTime t2 = DateTime.UtcNow; 

一部のPCがハイResilutionタイマーを持っていないことを非常に小さい可能性がありますStopwatch.IsHighResolution。この場合には、解像度が3600/65536 * 1000 =55ミリ(システムタイマーの分解能 - 時速65536ティック)に低下するとの両方t1t2同じ

+0

実際には、あなたが示したコードでは "t1とt2の両方が同じになる"という方法はありません。最終的にUtcNowは次の値を返します... –

4

DateTime.UtcNowは評価されず、メソッドの開始時にその値も取得されません。それは、実行がそれに到達した時点で評価され、実行がそれに達するたびに評価されます。したがって、関数が十分に時間がかかる場合は、2回の実行の間に異なる値になります。

+0

サイドノート:「関数の時間が十分にかかる場合」 - ゼロ時間で十分です - 'DateTime.UtcNow!= DateTime.UtcNow'はときどきtrueになります... –

+0

@AlexeiLevenkov - まあ、はい、いいえ、同時に。あたかもゼロ時間であるかのように見えますが、実際にはそうではありません。左側に '.UtcNow'を呼び出し、あるレジスタに戻り値を保存し、同じことをして別のレジスタに値を保存し、'!= 'を比較する命令を実行します。左側と右側の '.UtcNow'の呼び出しは同時にではなく、したがってゼロ時間ではありません。そして、それが価値が変わることができ、それゆえ2つが等しくない理由です。 – LB2

2

一言で言えば:はい。

この値を同じ値にしたい場合は、変数に値を格納してからこの変数を使用する必要があります。

1

はい、異なる値が返されます。続い

Microsoftからのものである:

このコンピュータに現在の日付と時刻に設定されているDateTimeオブジェクトを取得し、協定世界時(UTC)で表されます。

コードの実行には時間と時間がかかります。だから、同じ機能でさえ変わるでしょう。

関連する問題