2010-07-12 42 views
4

如果我運行像一個片段:UtcNow和現在是相同的日期時間?他們知道他們不同嗎?

bool areTheyTheSame = DateTime.UtcNow == DateTime.Now 

我究竟會得到什麼? DateTime返回是否知道它的時區,以便我可以比較?

我的具體問題是,我試圖構建一個類似緩存的API。如果需要一個DateTime AbsoluteExpiration,是否必須強制我的API的用戶知道是否給我一個UTC時間或基於時區的時間?

[編輯]這太問題是我的問題,也是極其相關:Cache.Add absolute expiration - UTC based or not?

[編輯]只是爲了澄清對未來的讀者,在DateTimeKind是什麼,是不同的。未定義的DateTimeKind常常是一個問題,例如,當您從數據庫中取出某個數據庫時,會出現這種問題。設置DateTimeKind在DateTime構造...

[編輯] JonSkeet寫了一個可愛的博客文章,譴責這種行爲,並提供瞭解決方案:http://noda-time.blogspot.co.uk/2011/08/what-wrong-with-datetime-anyway.html

回答

6

你真的嘗試自己的片段?

它們不同,直接比較沒有考慮到差異,但可以通過調用ToUniversalTime將本地轉換爲UTC。

var now = DateTime.Now; 
var utcNow = DateTime.UtcNow; 

Console.WriteLine(now);       // 12/07/2010 16:44:16 
Console.WriteLine(utcNow);      // 12/07/2010 15:44:16 
Console.WriteLine(now.ToUniversalTime());  // 12/07/2010 15:44:16 
Console.WriteLine(utcNow.ToUniversalTime()); // 12/07/2010 15:44:16 

Console.WriteLine(now == utcNow);       // False 
Console.WriteLine(now.ToUniversalTime() == utcNow);  // True 
Console.WriteLine(utcNow.ToUniversalTime() == utcNow); // True 
+1

我沒有嘗試,但主要是因爲我很驚訝,這個問題是不是已經SO並認爲這將是對人有益的。也許有點懶惰,但我發誓,主要是好心! ;) – 2010-07-12 14:51:46

+0

我想看到的關鍵測試可能是,「Console.WriteLine(utcNow.ToUniversalTime()== utcNow)」的結果;「... – 2010-07-12 14:52:59

+2

+1。另外,還有一個不同的DateTimeKind。有另一個方向的'ToLocalTime()'。小心'DateTimeKind.Undefined',這些時間總是被轉換('ToUniversalTime'將它們當作本地時間,'ToLocalTime'視爲UTC)。 – 2010-07-12 14:57:28

0

DateTime.Now返回系統時間,而DateTime.UtcNow返回UTC時間。

相關問題