2011-07-20 36 views
4

我有一個關於DateTimeOffset和夏令時的問題。爲了解釋我的問題讓我們假設現在的日期和時間爲:夏令時後顯示DateTimeOffset顯示

11/6/2010 10:15:00 AM 

如果我運行此代碼:

DateTimeOffset myTime = DateTimeOffset.Now; 
Console.WriteLine("Local time: " + myTime.ToLocalTime().DateTime); 

然後我得到這樣的結果:

當地時間: 11/6/2010 10:15:00 AM

這意味着事件發生在早上10點15分(我的時區是山區夏令時(-6偏移))。

那麼,我將這個DateTimeOffset保存到我的SQL Server 2008數據庫(作爲DateTimeOffset)。第二天我想把它展示給用戶。但是現在夏令時已過期。

如果我用保存的關閉值(從前一天)運行上面的WriteLine,會顯示什麼?

存儲在數據庫中的偏移量是-6。但是現在夏令時已經結束,目前的偏移量爲-7。因此,據我瞭解documentation,它會首先將我的時間轉換爲UTC時間(因此需要上午10:15並增加6個小時(4:15 pm),然後減去當地時間的當前偏移量(4:15下午 - 7 = 9:15 AM)

所以,如果我我的數學是正確的,現在當我展示我的情況下,它會顯示它在上午9:15發生,而不是10:15 AM

這並不好,我想存儲時區信息,但我需要我的時間在同一時區保持靜態(意思是說,如果事件發生在猶他州上午10:15,那麼下一次我看它(在猶他州),我需要看到它是在上午10點15分,無論夏令時是否發生變化。

我不認爲我是第一個有這個問題。別人做了什麼來解決這個問題? (或我的事實錯了嗎?)

回答

6

沒有,也不會添加當前偏移 - 它會添加在該日期偏移這仍然是-6。所以它應該仍然顯示上午10點15分,因爲它知道日期涉及,並因此在該日期有效的時區規則。

順便提一下,您可能希望單獨存儲簡單的UTC時間和時區標識符。如果您要存儲時區,那麼使用DateTimeOffset對UTC時間不會特別有用。 (在另一方面,它更清晰,它確實時間表示瞬間 - DateTime是一個可怕的混亂型這不會讓你輕鬆地表達你想要代表什麼)

當然我我個人鼓勵你看看Noda Time,在我的非常有偏見的意見是一個比內置的更清晰的日期/時間API ...但是這不是完全準備好生產使用。 (儘管我們到達那裏...)

+0

同意 - 只要你跟蹤時區,存儲DateTimeOffset對象不會給你買太多東西。只需使用UTC並存儲時區標識符即可。 – Doug