2014-09-12 28 views
4

當我覺得應該返回8.25時,下面的代碼返回9.25,我誤解了什麼?DateTimeOffset TotalHours返回不同的值

(new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0))).Subtract(new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0)).Date).TotalHours 

更簡單地表現爲: - 對

DateTimeOffset start = new DateTimeOffset(2014,09,04,08,15,00,new TimeSpan(0,0,0)); 
double result = start.Subtract(start.Date).TotalHours 

當在時區GMT在Windows 7 PC上運行(調整爲夏令時間): -

9月12日的結果= 9.25

12月12日結果= 8.25

回答

10

的問題是,所述DateTimeOffset.Date財產返回一個DateTime未指定的Kind。那麼當你從DateTimeOffset中減去它時,就假設它是系統本地的。

您可以通過要求輸入UtcDateTime解決這個問題,並得到Date來自:

double result = start.Subtract(start.UtcDateTime.Date).TotalHours 

當然,這是假設您想要的Date是該日的UTC日期/時間下降。我們不太瞭解您的實際需求。您可能需要考慮使用我的Noda Time庫來避免這種模糊性 - 但有更多類型可供選擇,它允許您更清楚地指定您的意圖。

+0

謝謝你,讓我瘋狂一段時間,因爲開發和生產都在不同的時區。 – 2014-09-12 13:47:22

+0

我已經在去年多次閱讀了Noda時間 - 這可能是通過實體框架5 DateTimeOffset類型詢問SQL服務器DateTimeOffset(7)兼容性的正確時機。我是否會一直轉換到/來自DateTimeOffsets,從而依靠創建C#代碼進化模式,而不是將我的設計意圖嵌入到POCO對象中? – 2014-09-12 14:38:24

+0

@Oldfart:恐怕EF不支持直接使用自定義類型。但是你不需要「一直」這樣做 - 通常你只是創建一個「好友屬性」,我相信(我本人不是EF的人)。查看http://stackoverflow.com/questions/25143549 - 然後你的大部分代碼就可以使用Noda Time,並且它將從OffsetDateTime轉換爲DateTimeOffset以實現持久性。 – 2014-09-12 14:39:57