2013-10-16 32 views
1

我一直在尋找高和低,無法找到答案。 TZI如何不同?FindSystemTimeZoneById.UTC與GetSystemTimeZones UTC不同嗎?

enter image description here

我已經做了一些MSDN挖掘,看到了這個: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.findsystemtimezonebyid.aspx

其中明確規定:

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

因此,我認爲這意味着它每次都要註冊表?

但隨後這個混淆的問題: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.utc.aspx

,並說:

這是一個內置的對象;有關此TimeZoneInfo對象的信息不會從註冊表中檢索。

因此,看起來我打電話給FindSystemTimeZoneById()實際上是短路並返回TimeZoneInfo.UTC,並且根本不會進入註冊表!這不是想法,因爲我想要另一個版本的DisplayName。是什麼賦予了???

回答

2

由於您搜索時區的方式不同,因此解釋了這個怪癖。具有全名的頂級域名來自注冊表,並由您使用GetSystemTimeZones()開始生活,它列舉了註冊表項。

底部一個被FindSystemTimeZoneById()產生的,它有一個捷徑:

public static TimeZoneInfo FindSystemTimeZoneById(string id) 
{ 
    if (string.Compare(id, "UTC", StringComparison.OrdinalIgnoreCase) == 0) 
    { 
     return Utc; 
    } 
    // etc.. 
} 

所以,你得到的預焙一個與短名稱。

+0

是的,我在原始問題中猜測的很多。我想我想知道的是爲什麼他們建立了這條捷徑?爲什麼不嘗試從系統註冊表獲取UTC,如果它不存在,那麼使用自定義時區? – Eric

+0

顯然,如果必須訪問註冊表,一個非常常用的通過方法優化的路徑並不是最優化的。您可以在connect.microsoft.com上提交錯誤。它確實需要制定一個合法的案例,您無法找到解決方法。堅強,祝你好運。 –

+0

對於踢我反彙編源,他們實際上不需要每次都打到註冊表,因爲他們不會每次都創建自定義時區。他們將結果保存到成員變量中。他們可以做到這一點.m_cachedUtc = GetUtcFromRegisty()? GetUtcFromCustom();無論如何,我能夠解決這個問題。感謝您花時間看看這個! – Eric