2012-04-20 42 views
9

爲什麼下面的代碼(在C#)返回false:DateTime.Ticks,DateTime.Equals和時區

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

我期望日期時間的刻度是基於UTC時間。 上DateTime.Ticks的MSDN頁提到說

此屬性的值表示自午夜12:00:00,0001年1月1,表示DateTime.MinValue已經過去的100納秒的間隔的數量。它不包括可歸因於閏秒的滴答數。

午夜第一,0001一月..在時區?

爲什麼會DateTime.Ticks是時區相關?

我想這一個事實,即蜱是不同的就是下面的代碼也將返回false

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

DateTime.Equals的MSDN文檔中提到

T1和T2是如果他們的蜱屬性等於值是相等的。在平等測試中不考慮他們的Kind屬性值。

我的期望是DateTime.Ticks將是平等的,不管時區。

我所期待的時間兩個時刻等於他們發生了什麼時區沒有關係。我的期望錯了嗎?

+1

注(http://msdn.microsoft.com/en-us/library/system.datetimeoffset.op_equality.aspx),它比較兩種情況下的時刻進行比較。 – 2012-04-20 19:04:21

+0

@ChrisShaffer謝謝,我認爲這是我應該使用的,因爲我正在尋找的是確切的時刻,而不是實際的「日期」。 – GuiSim 2012-04-20 19:13:20

回答

9

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

DateTime.Ticks記錄爲 「自午夜12:00:00,0001年1月1時起已經過100納秒間隔 號碼」。那是當地時間0001年1月1日 。如果將日期時間轉換爲UTC,那麼Ticks 將會是自UTC時間1月1日午夜12:00:00以來已過去 的100納秒間隔的數量。可能不同 即1月1日0001當地時間,ergo這兩個Ticks值將是 不同。您可以使用的DateTimeOffset

0

DateTime.Now是根據你的時區偏移,這意味着它不會是相同的普及時間,除非你確定抵消爲零。這將沒有意義DateTime.Now轉換成蜱在兩個不同的時區,並得到同樣的結果 - 它們是相同的絕對時間(UTC),但不一樣的相對時間(使用時區偏移量)。

1

您當前的日期時間(除非你住在一個特定的時區 - GMT)是由X小時UTC時間偏移,所以DateTime.Now可能讓你在凌晨4點,而Datetime.Now.ToUniversalTime()可能是在下午11點,取決於你當前的時區。

蜱計算從您的時區通用時間轉換,所以唯一的時候,他們應該是平等的,如果你住在GMT時區。

更簡單地說,1/1/2011 8:00 AM之間蜱的數量是不一樣的,因爲2011/1/1 11:00 PM蜱的數量。在你的代碼中,日期被轉換爲通用日期,然後在等式右邊進行計算,但它只是使用當地日期來獲得左邊的差異,因此它們是!=每個其他。

+0

我假設兩者相同,因爲它們代表了完全相同的時刻。我沒有想到,參照系的改變會改變平等。 – GuiSim 2012-04-20 19:03:30

+2

@GuiSim - 第一行不應該在我的回答中。當我重新閱讀時,聽起來像我正在居高臨下。對於那個很抱歉。我不是故意的。我在書面溝通方面非常糟糕。 – David 2012-04-20 19:05:30