3 回答
TA贡献1847条经验 获得超7个赞
你是两个不同的结果,因为根据GetSystemTimeZones()TimeZoneInfo.cs
的实现将尝试查找和收集时区数据。Registry.LocalMachine
在FindSystemTimeZoneById的情况下,它具有如下条件。如果不匹配,它将从Registry.LocalMachine
.
if (String.Compare(id, c_utcId, StringComparison.OrdinalIgnoreCase) == 0) { return TimeZoneInfo.Utc; }
TA贡献1856条经验 获得超17个赞
答案可在以下参考资料中找到FindSystemTimeZoneById
:
// Special case for Utc as it will not exist in the dictionary with the rest
// of the system time zones. There is no need to do this check for Local.Id
// since Local is a real time zone that exists in the dictionary cache
if (String.Compare(id, c_utcId, StringComparison.OrdinalIgnoreCase) == 0) {
return TimeZoneInfo.Utc;
}
它所指的字典是从 填充的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones,并且是GetSystemTimeZones返回的内容。
但是,我不认为评论和逻辑是正确的,因为我的 Windows 10 build 1803 机器在上述注册表路径中有一个“UTC”条目(假设您的计算机具有相同的条目)。看起来这在早期版本的 Windows 中可能是正确的,但也许不再是这样了 -已在 corefx 存储库中提交错误以获得清晰度。
TA贡献1821条经验 获得超6个赞
这段代码是很久以前写的,在那段时间假设 Utc 没有在机器上枚举,也不会存储在本地字典中。我同意现在情况并非如此。虽然我没有看到这会导致真正的问题,因为两个 Utc 创建的对象都会正确运行,但我认为最好修复它并确保我们使用一个 Utc 对象。
@Ian Kemp,感谢您在 corefx 存储库中打开问题。我们将在 .NET Core 的未来版本中处理这个问题。
- 3 回答
- 0 关注
- 106 浏览
添加回答
举报