2017-06-06 40 views
2

假設我在一次調用DateTime.UtcNow兩次調用之間有一個簡單的數學循環。DateTime.UtcNow會在同一個方法中返回不同的值嗎?

如果代碼之間的代碼比系統的定時器分辨率高出10毫秒,那麼DateTime.UtcNow是否會在同一個方法內返回兩個不同的值?

通過擴展,是否有可能,如果代碼在日期轉換爲新的一天時正確運行,那麼DateTime.UtcNow.Date將在同一方法內產生兩個不同的日期?

+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.UtcNowdefinetely返回不同的值:

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未被評估,也沒有在方法開始時捕獲它的值。它在執行到達時以及每次執行到達時進行評估。所以是的,如果函數需要足夠長的時間,你會在兩次執行之間得到不同的值。

+0

備註:「如果函數花費足夠長時間」 - 零時間足夠好 - 「DateTime.UtcNow!= DateTime.UtcNow'偶爾會爲真... –

+0

@AlexeiLevenkov - 嗯,是的,沒有在同一時間。它看起來好像是零時間,但實際上並非如此。它調用左邊的'.UtcNow',將返回值保存在一個寄存器中,然後執行相同的操作並將值保存在另一個寄存器中,然後執行指令來比較'!='。左側和右側的調用'.UtcNow'不是同一時間,因此不是零時間。這就是價值可以改變的原因,因此兩者並不相同。 – LB2

2

總之一句話:是的。

如果您想要具有相同的值,則需要先調用此函數並將該值存儲在變量中,然後使用此變量。

1

是的,它會返回不同的值。

以下是Microsoft

獲取被設置爲當前日期和時間在此計算機上一個DateTime對象,表示爲協調世界時(UTC)。

運行你的代碼需要時間和時間是它返回的。所以是的,即使在相同的功能下它也會改變。

相關問題