我一直试图在.net4中使用TimeZoneInfo.GetSystemTimeZones替换我们的旧方法,该方法使用COM来调用某些MFC代码。但是,由于GetSystemTimeZones不会返回所有时区,因此我不得不恢复为COM方法。总部设在英国且不在我们的选项列表中包括格林尼治标准时间是一个问题。

当我查看注册表时,我发现GMT标准时间具有未定义规则的动态DST子项。我下载了.net4源代码,并且在TimeZoneInfo.cs中,GetSystemTimeZones最终调用了TryCreateAdjustmentRules,如果动态DST key 未定义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标准时间不会添加到时区集合中。我尝试删除空的Dynamic DST子项,但又将它们重新添加回去(可能是Windows Update)。

我已经做了很多搜索,但是还没有看到其他人报告此问题。我不确定是否有GetSystemTimeZones修复程序,或者我是否可以停止首先出现的空Dynamic DST子项。有任何想法吗?

最佳答案

我猜这只是一个注册表问题。

对于WinXP/Server 2003 SP1,这里概述了类似的内容。
请查看以下内容是否有帮助:
http://blogs.technet.com/b/dst2007/archive/2007/03/06/missing-time-zones-in-registry.aspx

我的猜测是您可以从另一台计算机导出整个注册表项,并将其应用于有问题的框。

关于c# - GetSystemTimeZones缺少GMT标准时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9636439/

10-11 17:06