2013-09-23 18 views
2

奇怪的是,TimeZone.CurrentTimeZone.StandardName按照計算機顯示語言返回本地化名稱。我需要一個編程標識符,我可以在以下代碼中提供給TimeZoneInfo當OS顯示語言非英文時獲取本地時區標識符

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(timeZone); 

FindSystemTimeZoneById需要一個獨特的非本地化的程序標識符

我改變了我的電腦顯示語言爲中國和我得到一個本地化的unicode字符串,當我做TimeZone.CurrentTimeZone.StandardName。然而,這個值是正確的,但是它被本地化爲計算機顯示語言,這是我不想要的。

我現在沒有選擇使用TimeZoneInfo.Local.Id,因爲我的項目在.Net 2.0中。還有什麼其他選項可以獲得未本地化的時區標識符?

回答

2

要得到相當於TimeZoneInfo.Local.Id但不能使用TimeZoneInfo類,則必須直接進入註冊表。

在.NET 2.0 C#中,你可以用下面的方法檢索它:

private static string GetLocalTimeZoneId() 
{ 
    RegistryKey key = Registry.LocalMachine.OpenSubKey(
         @"SYSTEM\CurrentControlSet\Control\TimeZoneInformation"); 
    string value = (string)key.GetValue("TimeZoneKeyName"); 
    if (string.IsNullOrEmpty(value)) 
     value = (string)key.GetValue("StandardName"); 
    key.Close(); 
    return value; 
} 

Windows Vista和更高的有TimeZoneKeyName值,並有在StandardName@tzres.dll指針條目。

在Windows Vista之前,StandardName值包含密鑰名稱,並且未進行本地化。

上述代碼解釋了兩種變體。

+0

謝謝馬特。這是我正在尋找的答案!現在我唯一擔心的是註冊表路徑對Windows的所有風格都保持相同嗎? – murtazat

+0

查看我的更新答案。 –

+0

當我嘗試使用它時,我收到了非常奇怪的結果。該註冊表項在RegEdit中看起來是正確的,但是當我用key.GetValue(「TimeZoneKeyName」)讀取它時,我得到的是一個包含127個字符的裝箱字符串。第一個字符是時區的名稱,後面跟着幾個十六進制00字符(「\ 0 \ 0」),後面是看起來像隨機垃圾的東西。當然,我可以通過IndexOf('\ 0')自己提取名稱,但爲什麼key.GetValue()會返回垃圾字符以及正確的數據? – RenniePet

相關問題