我一直在嘗試使用.net4中的TimeZoneInfo.GetSystemTimeZones來替換我們使用COM調用某些MFC代碼的舊方法。但是,我不得不恢復到COM方法,因爲GetSystemTimeZones不會返回所有時區。在英國居住但不包括GMT標準時間在我們的選項列表中是一個問題。GetSystemTimeZones缺失GMT標準時間
當我看到在註冊表中,我發現GMT標準時間有動態DST子項沒有定義的規則。我下載了.net4源代碼,並在TimeZoneInfo.cs中,GetSystemTimeZones最終調用TryCreateAdjustmentRules,如果該鍵沒有定義FirstEntry或LastEntry,則返回false。
//
// loop over all of the "<time_zone_name>\Dynamic DST" hive entries
//
// read FirstEntry {MinValue - (year1, 12, 31)}
// read MiddleEntry {(yearN, 1, 1) - (yearN, 12, 31)}
// read LastEntry {(yearN, 1, 1) - MaxValue }
// read the FirstEntry and LastEntry key values (ex: "1980", "2038")
Int32 first = (Int32)dynamicKey.GetValue(c_firstEntryValue, -1, RegistryValueOptions.None);
Int32 last = (Int32)dynamicKey.GetValue(c_lastEntryValue, -1, RegistryValueOptions.None);
if (first == -1 || last == -1 || first > last) {
rules = null;
return false;
}
由於TryCreateAdjustmentRules返回false,TryGetTimeZoneByRegistryKey拋出一個InvalidTimeZoneException這意味着GMT標準時間不會被添加到該時區集合。我試過刪除空的動態DST子鍵,但有些東西再次將它們添加回來(可能是Windows Update)。
我已經做了很多搜索,但沒有看到任何人報告這個問題。我不確定是否有GetSystemTimeZones修復程序,或者我是否可以停止首先出現的空子模塊Dynamic DST子項。有任何想法嗎?
這非常奇怪 - 「格林威治標準時間」絕對是我的回報。你能發佈你使用的代碼來確定它缺少嗎?這很可能是好的,但是我們看到了奇怪的結果...... – 2012-03-09 15:21:56
我討厭這樣說,但它在我的系統上運行,我在英國,並且在101個值中看到'GMT標準時間'。你在另一個系統上試過這個嗎? – Lazarus 2012-03-09 15:25:48
Jon,您的GMT標準時間註冊表項是否有空的Dynamic DST子項? – 2012-03-09 15:26:40