0

以下 C# 代码

TimeZoneInfo.FindSystemTimeZoneById("foo")

会抛出一个TimeZoneNotFoundException(如你所料),而

TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time")

正确返回TimeZoneInfo中欧的对象。

这是一个有点偏执的问题,但是 .NET Framework 是否保证相同TimeZoneInfo的实例在 .NET 版本的所有实例上都可用?它们是否因版本而异?

4

3 回答 3

2

这是基于存储在系统本身上的时区信息,而不是框架的一部分。从FindSystemTimeZoneById的文档中:

FindSystemTimeZoneById 尝试将 id 与 Windows XP 和 Windows Vista 下注册表的 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones 分支的子项名称匹配。此分支不一定包含时区标识符的完整列表。

基本上,如果您使用默认情况下在 Windows 中定义的时区,它应该是安全的 - 但它基于系统本身,而不是框架。

于 2012-09-26T16:57:16.443 回答
2

它因 CLI 实现(.NET 与 Mono)、操作系统版本(我相信不同版本的 Windows 在不同程度上支持历史数据)以及安装了哪些更新而有所不同。

这主要影响特定时区 ID 的可用时区信息,而不是时区 ID 列表本身,但即使是随着时间的推移也会发生变化。我希望“中欧标准时间”得到相当全面的支持。(正如 Reed 所说,这更多是关于操作系统提供的内容,而不是 .NET 支持的内容,而不仅仅是TimeZoneInfo.NET 3.5+ 中的内容。)

于 2012-09-26T16:58:15.017 回答
1

启动 Regedit.exe 并导航到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones密钥。展开节点,您将看到时区名称列表。

TimeZoneInfo 类从那里获取其信息。

所以不,.NET 无法保证信息的存在。注册表项归 Windows 所有。但是现在您知道如何对引起故障的机器进行故障排除了。这是极其罕见的,充其量机器没有获得 Window Update 更新,因此也没有获得这些键的更新。夏令时规则更改是最常见的类型。注册表损坏总是可能的。

于 2012-09-26T17:00:25.053 回答