2012-09-26 58 views
0

下面的C#代碼所有的.NET安裝都存在相同的TimeZoneInfos嗎?

TimeZoneInfo.FindSystemTimeZoneById("foo") 

將拋出一個TimeZoneNotFoundException(如你所期望的),而

TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time") 

正確返回歐洲中部的一個TimeZoneInfo對象。

這是一個稍微偏執的問題,但.NET框架保證在.NET版本的所有實例上都有相同的TimeZoneInfo實例嗎?它們是否因版本而異?

回答

2

這是基於存儲在系統本身的時區信息,而不是框架的一部分。從文檔FindSystemTimeZoneById

FindSystemTimeZoneById嘗試匹配ID到HKEY_LOCAL_MACHINE \ SOFTWARE \註冊表中的Microsoft \ Windows NT的\ CURRENTVERSION \ Time區域分公司在Windows XP和Windows Vista中的子項的名稱。該分支不一定包含全面的時區標識符列表。

基本上,如果您使用默認情況下在Windows中定義的時區,它應該是安全的 - 但它基於系統本身,而不是框架。

2

它根據CLI實現(.NET和Mono),操作系統版本(不同版本的Windows支持不同程度的歷史數據,我相信)和肯定是,並且安裝了更新。

這大多會影響特定時區ID的時區信息,而不是時區ID本身的列表,但即使這樣也會隨時間而改變。我希望「中歐標準時間」能夠得到相當全面的支持。 (正如Reed所說,這首先是.NET .NET 3.5+中TimeZoneInfo的存在,而不是.NET支持的操作系統。)

1

啓動Regedit.exe並導航到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones密鑰。展開節點,您會看到一個時區名稱列表。

TimeZoneInfo類獲取其信息的地方。

所以不,.NET沒有辦法保證信息在那裏。該註冊表項由Windows擁有。但是現在你知道如何解決造成麻煩的機器。這是非常罕見的,最好機器沒有得到Window Update更新,因此也不會獲得這些密鑰的更新。夏令時規則變化是最常見的一種。註冊表腐敗總是可能的。

相關問題