我使用TimeZoneInfo.Id .net属性列出了所有时区ID,我发现这些ID是特定于语言的。这意味着我在使用不同语言的操作系统上找不到我要查找的ID。
根据列表中的索引选择我需要的那个是非常诱人的,但是给定的索引总是指向相同的时区,还是因操作系统发布而变化?
答案 0 :(得分:2)
Id
中的TimeZoneInfo
值对应于以下路径下的注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
它们始终使用英语,并且未通过操作系统语言进行本地化。本地化的值位于DisplayName
,StandardName
和DaylightName
属性中,这些属性由操作系统语言(不是当前的.NET文化)本地化。
通常,只要机器保持更新,您就可以依赖这些机器在各机器之间保持合理的一致性。如果不及时更新,则存在不一致的风险。
通过Windows Update以及microsoft.com/time中描述的修补程序定期更新时区。如果计算机不是最新的,则可能没有新引入的时区,或者它不会对现有时区的夏令时规则进行最新更改。
例如:
KB3039024介绍了东部标准时间(墨西哥)"时区,涵盖墨西哥的金塔纳罗奥州,包括切图马尔和坎昆的城市。这是由于2015年墨西哥法律的变化引入的,该法律将该区域从UTC-06:00移至UTC-05:00。
如果没有此更新,则他们无法在计算机上找到此时区,因此无法找到TimeZoneInfo.FindSystemTimeZoneById
。
在KB3049874进行了跟进,然后从这个新时区中删除了夏令时,因为墨西哥原来的公告在这方面不明确。
如果有第一次更新,而不是第二次更新,则在使用TimeZoneInfo
转换此区域的时间时,他们可能会得到不同的结果。
如果您的情况要求您不能依赖于保持更新的特定计算机,那么您可以考虑从一台计算机序列化时区信息并在另一台计算机上对其进行反序列化。这可以使用ToSerializedString
类上的FromSerializedString
和TimeZoneInfo
方法完成。