【发布时间】:2012-03-27 01:04:07
【问题描述】:
我一直在尝试使用 .net4 中的 TimeZoneInfo.GetSystemTimeZones 来替换我们使用 COM 调用某些 MFC 代码的旧方法。但是,我不得不恢复到 COM 方法,因为 GetSystemTimeZones 不会返回所有时区。总部设在英国并且在我们的选项列表中不包括 GMT 标准时间是一个问题。
当我查看注册表时,我发现 GMT 标准时间 有一个没有定义规则的 Dynamic 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;
}
由于 TryCreateAdjustmentRules 返回 false,TryGetTimeZoneByRegistryKey 会引发 InvalidTimeZoneException,这意味着 GMT 标准时间 不会被添加到时区集合中。我已尝试删除空的 Dynamic DST 子键,但有些东西将它们重新添加回来(可能是 Windows 更新)。
我进行了很多搜索,但没有看到其他人报告此问题。我不确定是否有 GetSystemTimeZones 修复,或者我是否可以停止首先出现的空 Dynamic DST 子键。有什么想法吗?
【问题讨论】:
-
这太奇怪了——我肯定会返回“GMT 标准时间”。你能发布你用来确定它丢失的代码吗?可能没问题,但我们看到了奇怪的结果......
-
我不想这么说,但它适用于我的系统,我在英国,我在返回的 101 个值中看到
GMT Standard Time。你在另一个系统上试过这个吗? -
乔恩,您的 GMT 标准时间注册表项是否有一个空的动态 DST 子项?
-
@RichardHawkins:我应该查看的注册表项到底在哪里? (您是否出于兴趣在其他机器上查看了注册表项是否相同?)
-
@RichardHawkins:好的。好吧,听起来您需要深入了解为什么您有一个空的动态 DST 子项...可能通过 regmon? (系统内部)