Ric*_*ins 8 .net c# windows timezone
我一直在尝试使用.net4中的TimeZoneInfo.GetSystemTimeZones来替换使用COM调用某些MFC代码的旧方法.但是,我不得不恢复到COM方法,因为GetSystemTimeZones不会返回所有时区.在我们的英国,并且在我们的选项列表中不包括GMT标准时间是一个问题.
当我查看注册表时,我发现GMT标准时间有一个动态DST子项,没有定义规则.我下载了.net4源代码,在TimeZoneInfo.cs中,GetSystemTimeZones最终调用TryCreateAdjustmentRules,如果Dynamic DST键没有定义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;
}
Run Code Online (Sandbox Code Playgroud)
当TryCreateAdjustmentRules返回false时,TryGetTimeZoneByRegistryKey会抛出InvalidTimeZoneException,这意味着GMT标准时间不会被添加到时区集合中.我已经尝试删除空的Dynamic DST子项,但有些东西又重新添加(可能是Windows Update).
我做了很多搜索,但没有看到其他人报告这个问题.我不确定是否存在GetSystemTimeZones修复,或者我是否可以停止出现在第一个位置的空Dynamic DST子项.有任何想法吗?
事实证明,问题出在我们的 COM 对象上,而不是 .NET 代码上。读取注册表的代码应该只是读取,但它错误地调用RegCreateKey来优化对同一注册表分支的多次调用。
当 COM 对象因新版本而注册(具有管理员权限)时,它会加载时区并为本地时区(在我的例子中为 GMT/UTC)创建动态 DST 。
管理员,我想这个问题应该标记为删除。