我刚刚发现这个老十岁上下的悬而未决的问题,所以认为我应该在它采取刺伤。
总之 - 是这种方法有效/安全吗?
这一切都取决于你打算用他们做什么。
如果你只是在服务器端代码中使用它,那么是的。您只需存储时区的Id
,并向用户显示相应的DisplayName
。 FindSystemTimeZoneById
和GetSystemTimeZones
对此完全有效。
请记住,虽然Id
值总是一样的 - DisplayName
属性将根据您正在运行的代码的Windows操作系统的语言是不同的。执行是而不是文化意识,所以只需在.Net中设置不同的目标文化将不会更改DisplayName
字符串。
在Microsoft Windows时区数据库中的记录是相当稳定,并保持通过Windows Update更新。 某些的信息来自注册表,但本地化的资源字符串来自tzres.dll
。当然,所有这些都是由TimeZoneInfo
和相关类隐藏的。
但是,如果你路过这些时区Id
值与其它系统 - 当心。与以前版本的Windows有一些变化。例如,我知道用于显示名称的显示名称都在其中,现在更正确地说“UTC”。 Id
值是相同的,但是谁确切地知道还有哪些不一致。特别是如果目标计算机尚未收到您拥有的同一组Windows Update。顺便说一句 - 更新公布here。
你也应该知道有关Windows时区数据库中的几件事情:
你也应该知道,TimeZoneInfo
是密不可分的DateTime
和DateTimeOffset
类。这些都有他们自己的怪癖。 DateTimeOffset
有点用处,但DateTime
充满了细微差别。阅读:
一个远更好的解决日期和时间在.NET是使用NodaTime。该库实现了两个时区数据库,包括它们之间的CLDR映射。它还提供了一个更安全的API,不会让你陷入困境。这可能需要一些重新学习,但在您知道之前,您将使用类如LocalDateTime
,ZonedDateTime
,OffsetDateTime
和Instant
。
您仍然有时区数据库经常更新的问题,因为我们将计时规则留给政客。但the TZDB folks在保持历史数据库准确性方面做得非常好,并且在区域名称更改时提供别名/链接。您可以看到tz名称here的列表。此外,如果您使用NodaTime,则可以选择将TZDB的副本粘贴到发行版中,也可以将自己的副本随应用程序一起发送。您可以(理论上)编写您自己的代码,从IANA下载最新版本并保持应用程序更新 - 所有这些都不依赖于主机操作系统。
你看过['DateTimeOffset'](http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx)吗?或['NodaTime'](http://code.google.com/p/noda-time/)? – Oded
相关:http://stackoverflow.com/q/2532729/1583 – Oded
@Oded与DateTimeOffset的问题是,它不是日光节约知道 – Paparazzi