2015-11-05 145 views
3

我有一個非常奇怪的行爲TimeZoneInfo.ConvertTimeFromUtc。 你如何看待這個回報?TimeZoneInfo.ConvertTimeFromUtc返回不正確的結果

var date = new DateTime(2000, 1, 1, 12, 0, 0); 
var dest = TimeZoneInfo.FindSystemTimeZoneById("Belarus Standard Time"); 
TimeZoneInfo.ConvertTimeFromUtc(date, dest); 

白俄羅斯標準時間是UTC + 3。我期望{01.01.2000 15:00:00}。 但我看到下一個: enter image description here

WAT?

這在前幾天正常工作。但是今天我運行了單元測試並注意到了這一點。在運行測試之前,我安裝了Visual Studio 2015.會發生什麼,爲什麼?如何解決它?

PS:它在另一臺機器上正常工作。

+0

你是否確定?這似乎很奇怪。它會在我身上返回'{01.01.2000 15:00:00}'。 –

+0

@SonerGönül,是的,我確定。它看起來像安裝了VS的新版本後得到了一個DLL的bug。 – Neshta

+0

順便問一下你的環境是什麼? .Net Framework版本和Windows版本? –

回答

2

其實,轉換是正確的。

雖然這是真的,白俄羅斯目前有是全年UTC + 3時區,它只能是自2012年

此前這種方式,其標準偏移是UTC + 2 ,並觀測到從三月的最後一個星期日到十月的最後一個星期日,UTC + 3的夏令時(又名「夏令時」)。這一改變是在2011年夏季時間制定的,並永久保留在那裏,而不是回落。

You can see the history of changes here

當您使用"Belarus Standard Time"時區,此區域的信息從Windows註冊表中的數據在以下位置拉:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Belarus Standard Time 

在那裏,你將看到的基本信息,並呼籲一個子項包含同比變化的Dynamic DST。你會發現,Windows有三個條目此區域:

  • 一個用於2010年及以前,該標準時間和夏令時之間交替
  • 一爲2011,這使得日光時間單變化而無需返回標準時間
  • 一個用於2012和更大,這與新基地固定在標準時間偏移

注意,這是full IANA TZDB entry of "Europe/Minsk"的簡化,其跟蹤在1992年和現有其他變化。 Windows不知道這些更改,所以如果您要使用此時區的歷史日期,則應考慮使用Noda Time而不是TimeZoneInfo,因爲Noda Time支持TZDB時區。

此外,請注意,由於數據在Windows中建模爲2011年和之前具有與2012年和前向規則不同的基準偏移量,因此它受到KB2012229中描述的問題的影響。該文章的狀態部分已過時,因爲該問題已在.NET 4.6中解決。即使您將.NET 3.5定位到.NET 4.5.2,如果.NET 4.6完全安裝在機器上,那麼它的行爲也會正確。如果機器上沒有安裝.NET 4.6,它將爲2011年,2010年和之前的白俄羅斯應用錯誤的基準偏移量。(這就是爲什麼SonerGönül得到15:00在問題評論中提到的時間的原因。)

+0

現在我明白了。謝謝澄清馬特。 –