Dot-Net
DateTime 差異運算符考慮夏令時?
據我所知,該
DateTime類型的差分運算符考慮閏年:所以new DateTime(2008, 3, 1) - new DateTime(2008, 2, 1) // should return 29 days new DateTime(2009, 3, 1) - new DateTime(2009, 2, 1) // should return 28 days但是夏令時呢?
我不認為它會。文件只是說 DateTime 儲存為自 0001 年 1 月 1 日午夜 12:00:00 以來的滴答數,但它沒有說明午夜實際在哪個 TimeZone - 我不得不假設如果它是總是以UTC內部儲存,他們會這麼說。
不過,您可以輕鬆解決此問題:只需執行以下操作:
var difference = Dt1.ToUniversalTime() - Dt2. ToUniversalTime()並且轉換為 UTC 將考慮夏令時
.NET 不能正確處理夏令時,即使它提供了您想要的答案。你想要不正確的答案。
精簡版:
- .NET 怎麼知道由於能源危機,1977 年夏時制是全年有效的?
- 當以色列議會逐年決定規則時,.NET 怎麼知道以色列的夏令時規則?
- .NET 怎麼知道美國在二戰期間全年都使用 DST,並且從 1945 年到 1966 年,DST 規則因地區而異,而且規則仍然因地區而異。
.NET 嘗試逃避,並使用目前的夏令時規則,即使它們沒有或將要生效。結果是你得到的答案,雖然是你認為你想要的,但不正確。
來自Raymond Chen的部落格文章,為什麼夏令時不直覺:
為什麼(win32)時區轉換函式不使用適合一年中時間的時區?
…
Win32 不會嘗試猜測在其他時間生效的時區規則。所以 Win32 說,“星期四,2002 年 10 月 17 日,太平洋標準時間上午 8:45:38 ”。
注:太平洋標準時間。儘管 10 月 17 日是太平洋 夏令時間,但 Win32 仍將時間顯示為標準時間,因為那是現在的時間。
.NET 說,“好吧,如果現在生效的規則也在 2003 年 10 月 17 日生效,那麼那將是夏令時”,因此它顯示“2003 年 10 月 17 日星期四,太平洋夏令時間上午 9:45” - 夏令時.
所以你得到的答案是錯誤的。但既然你期待錯誤的答案,那就是你得到的。