2012-03-09 41 views
8

我一直在嘗試使用.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子項。有任何想法嗎?

+0

這非常奇怪 - 「格林威治標準時間」絕對是我的回報。你能發佈你使用的代碼來確定它缺少嗎?這很可能是好的,但是我們看到了奇怪的結果...... – 2012-03-09 15:21:56

+0

我討厭這樣說,但它在我的系統上運行,我在英國,並且在101個值中看到'GMT標準時間'。你在另一個系統上試過這個嗎? – Lazarus 2012-03-09 15:25:48

+0

Jon,您的GMT標準時間註冊表項是否有空的Dynamic DST子項? – 2012-03-09 15:26:40

回答

1

事實證明,問題出在我們的COM對象而不是.NET代碼上。閱讀註冊表的代碼應該只是讀取,但它錯誤地調用RegCreateKey來優化對同一註冊表分支的多個調用。

當COM對象由於新版本而被註冊(具有管理員權限)時,它加載時區併爲本地時區創建動態DST,本地時區爲GMT/UTC。

管理員,我想這個問題應該標記爲刪除。

+0

啊哈!所以這是COM對象! :d – dyslexicanaboko 2012-04-30 19:14:05

1

我猜這只是一個註冊表問題。

這裏對WinXP/Server 2003 SP1進行了類似的概述。 請查看是否存在以下幫助: http://blogs.technet.com/b/dst2007/archive/2007/03/06/missing-time-zones-in-registry.aspx

我的猜測是,你可以在整個註冊表項從另一臺計算機導出,並將其應用到你的問題的空格中。

+0

我的問題是,我可以刪除_Dynamic DST_子鍵在註冊表編輯器中刪除它,註冊表看起來確定。在稍後的某個時候,鑰匙重新出現,但這可能會在幾天後。我只是不知道是什麼導致它重新出現。我會嘗試在測試服務器上使用regmon來查看是否給出了任何線索。 – 2012-04-26 13:51:22

0

查看完您的問題後,甚至運行您在評論中提供的代碼以打印出時區列表,我無法讓GMT顯示在我的系統上。我運行的是Windows 7 Professional,選擇GMT不是一種選擇。我知道這並不能解決你的問題,你 - 就像很多其他人一樣 - 聽起來像你真的需要得到這個與GMT合作。

然而,如果可能的話,如果你看到一個方式使用UTC然後我會檢查這些鏈接:

Windows 7 Lack of Support for GMT

Converting UTC to GMT

又一個可能的回答你的問題,是有無論如何,你可以創建一個圍繞UTC值的包裝來顯示GMT?我問,因爲這個問題似乎不會很快消失。即使你現在開始工作 - 在未來它可能會再次破裂。如果我想出了一個方法,我會更新我的答案。

+0

感謝您的回覆,但讓我澄清。註冊表中的關鍵字是_GMT標準時間_(英國時區),但時區列表中的顯示文本是_(UTC)都柏林,愛丁堡,里斯本,倫敦_。 UTC和GMT是同一事物的兩個名稱,Windows 2003顯示GMT,而2008顯示UTC。 – 2012-04-26 13:40:03

+1

這是一個遠射,但你有沒有嘗試取消註冊你的COM對象,看看是否停止顯示備份的關鍵? – dyslexicanaboko 2012-04-26 15:04:25

+0

我需要我的COM對象的其他功能。據我所知,它只能從這個註冊表分支讀取。我現在已經有了Process Monitor來查看註冊表來嘗試記錄誰重新創建它。 – 2012-04-27 11:07:54