TimeZoneInfo.Id 索引总是相同的吗?

Are TimeZoneInfo.Id indexes are always the same?

我使用 TimeZoneInfo.Id .net 属性 列出了所有时区 ID,我看到这些 ID 是特定于语言的 这意味着我找不到我要找的那个使用不同语言的操作系统上的名称。

根据列表中的索引简单地选择我需要的是非常诱人的,但是给定的索引是否总是指向相同的时区,或者它是否因 OS 版本而异?

TimeZoneInfo 中的 Id 值对应于以下路径下的注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

它们始终为英文,未本地化 OS 语言。本地化的值位于 DisplayNameStandardNameDaylightName 属性中,它们由 OS 语言(不是当前的 .NET 文化)本地化。

一般来说,只要机器保持更新,您就可以相信这些在机器之间是合理一致的。如果不及时更新它们,您可能会遇到不一致的情况。

时区通过 Windows 更新和 microsoft.com/time 中描述的修补程序定期更新。如果一台机器不是最新的,它可能没有新引入的时区,或者它没有现有时区的夏令时规则的最新变化。

例如:

  • KB3039024 引入了 "Eastern Standard Time (Mexico)" 时区,涵盖墨西哥金塔纳罗奥州,包括切图马尔和坎昆市。这是由于 2015 年墨西哥法律的变化而引入的,该法律将此区域从 UTC-06:00 移至 UTC-05:00。

    如果没有这个更新,那么他们就不会在他们的计算机上找到这个时区,因此 TimeZoneInfo.FindSystemTimeZoneById.

  • 也找不到
  • KB3049874 中有一个跟进,然后从这个新时区中删除了夏令时,因为墨西哥最初的公告在这方面并不清楚。

    如果有第一次更新,但没有第二次更新,那么他们在使用 TimeZoneInfo 转换时间时可能会得到不同的结果。

如果您的情况要求您不能依赖于保持更新的特定机器,那么您可以考虑从一台机器序列化时区信息并在另一台机器上反序列化它。这可以通过 TimeZoneInfo class.

上的 ToSerializedStringFromSerializedString 方法来完成