【发布时间】:2015-08-23 04:43:32
【问题描述】:
我使用 TimeZoneInfo.Id .net 属性列出了所有时区 ID,我发现这些 ID 是特定于语言的。这意味着我在使用不同语言的操作系统上找不到我要查找的名称。
根据列表中的索引简单地选择我需要的索引非常诱人,但给定索引是否总是指向同一时区,还是因操作系统版本而异?
【问题讨论】:
我使用 TimeZoneInfo.Id .net 属性列出了所有时区 ID,我发现这些 ID 是特定于语言的。这意味着我在使用不同语言的操作系统上找不到我要查找的名称。
根据列表中的索引简单地选择我需要的索引非常诱人,但给定索引是否总是指向同一时区,还是因操作系统版本而异?
【问题讨论】:
TimeZoneInfo 中的 Id 值对应于以下路径下的注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
它们始终使用英语,并且未按操作系统语言进行本地化。已本地化的值位于 DisplayName、StandardName 和 DaylightName 属性中,这些属性由 OS 语言(不是当前的 .NET 文化)本地化。
一般来说,只要机器保持更新,您就可以依靠这些在机器之间保持合理一致。如果它们不保持更新,则可能会出现不一致。
时区会通过 Windows 更新定期更新,并且在microsoft.com/time 中描述了修补程序。如果机器不是最新的,它可能没有新引入的时区,或者它没有现有时区的夏令时规则的最新更改。
例如:
KB3039024 引入了“东部标准时间(墨西哥)”时区,该时区覆盖墨西哥金塔纳罗奥州,包括切图马尔和坎昆两个城市。这是由于 2015 年墨西哥法律的变化而引入的,该变化将该区域从 UTC-06:00 移至 UTC-05:00。
如果没有这个更新,那么他们就不会在他们的计算机上找到这个时区,因此无法通过TimeZoneInfo.FindSystemTimeZoneById 找到它。
KB3049874 进行了跟进,随后将夏令时从这个新时区中删除,因为最初的墨西哥公告在这方面并不清楚。
如果有第一次更新,但没有第二次更新,那么当使用TimeZoneInfo 转换此区域的时间时,他们可能会得到不同的结果。
如果您的情况要求您不能依赖特定机器保持更新,那么您可以考虑从一台机器序列化时区信息并在另一台机器上反序列化它。这可以通过TimeZoneInfo 类上的ToSerializedString 和FromSerializedString 方法来完成。
【讨论】:
GetSystemTimeZones 返回的集合的数字索引。您应该使用FindSystemTimeZoneById 和Id 属性——它们总是相同的。是的,即使在中文系统上,这些键名也是英文的。
TimeZoneInfo。相反,您可以使用 Noda Time 和 IANA 时区 ID(例如 America/New_York)。另见the timezone tag wiki。一致性部分来自于您可以控制应用程序中使用的updating the time zone database,而不是依赖于操作系统。