假設我在一次調用DateTime.UtcNow
兩次調用之間有一個簡單的數學循環。DateTime.UtcNow會在同一個方法中返回不同的值嗎?
如果代碼之間的代碼比系統的定時器分辨率高出10毫秒,那麼DateTime.UtcNow
是否會在同一個方法內返回兩個不同的值?
通過擴展,是否有可能,如果代碼在日期轉換爲新的一天時正確運行,那麼DateTime.UtcNow.Date
將在同一方法內產生兩個不同的日期?
假設我在一次調用DateTime.UtcNow
兩次調用之間有一個簡單的數學循環。DateTime.UtcNow會在同一個方法中返回不同的值嗎?
如果代碼之間的代碼比系統的定時器分辨率高出10毫秒,那麼DateTime.UtcNow
是否會在同一個方法內返回兩個不同的值?
通過擴展,是否有可能,如果代碼在日期轉換爲新的一天時正確運行,那麼DateTime.UtcNow.Date
將在同一方法內產生兩個不同的日期?
爲什麼不進行實驗?
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
蜱),並有一個很好的機會,既t1
和t2
將是相同
確實沒有辦法「t1和t2將與你顯示的代碼相同」 - 最終UtcNow將返回下一個值... –
DateTime.UtcNow
未被評估,也沒有在方法開始時捕獲它的值。它在執行到達時以及每次執行到達時進行評估。所以是的,如果函數需要足夠長的時間,你會在兩次執行之間得到不同的值。
備註:「如果函數花費足夠長時間」 - 零時間足夠好 - 「DateTime.UtcNow!= DateTime.UtcNow'偶爾會爲真... –
@AlexeiLevenkov - 嗯,是的,沒有在同一時間。它看起來好像是零時間,但實際上並非如此。它調用左邊的'.UtcNow',將返回值保存在一個寄存器中,然後執行相同的操作並將值保存在另一個寄存器中,然後執行指令來比較'!='。左側和右側的調用'.UtcNow'不是同一時間,因此不是零時間。這就是價值可以改變的原因,因此兩者並不相同。 – LB2
總之一句話:是的。
如果您想要具有相同的值,則需要先調用此函數並將該值存儲在變量中,然後使用此變量。
是的,它會返回不同的值。
以下是Microsoft:
獲取被設置爲當前日期和時間在此計算機上一個DateTime對象,表示爲協調世界時(UTC)。
運行你的代碼需要時間和時間是它返回的。所以是的,即使在相同的功能下它也會改變。
是,是,是的? –
是的,時間不等代碼。但如果你把它變成一個變量,然後... – Nkosi
這是一個非常有趣的問題。正如許多人指出的那樣,答案是肯定的。什麼提示你問? – n8wrl