我刚刚发现了这个古老的未回答的问题,所以我想我应该试一试。
简而言之-这种方法有效/安全吗?
这一切都取决于你打算用它们做什么。
如果您只是在服务器端代码中使用它,那么可以。您只需存储Id
时区的 ,并向用户显示相应的DisplayName
. FindSystemTimeZoneById
并且GetSystemTimeZones
对此完全有效。
请记住,虽然Id
值始终相同,但DisplayName
属性将根据您运行代码的 Windows 操作系统的语言而有所不同。该实现不支持文化,因此仅在 .Net 中设置不同的目标文化不会更改DisplayName
字符串。
Microsoft Windows 时区数据库中的记录相当稳定,并通过 Windows Update 保持更新。 一些信息来自注册表,但本地化的资源字符串来自tzres.dll
. 当然,所有这些都被TimeZoneInfo
相关类隐藏起来。
但是,如果您将这些时区Id
值传递给其他系统 - 请注意。与以前的 Windows 版本存在一些差异。例如,我知道过去的显示名称都说“GMT”,现在更正确地说是“UTC”。值是相同的Id
,但谁知道还有什么不一致。特别是如果目标计算机没有收到与您相同的一组 Windows 更新。顺便说一下,更新在这里公布。
您还应该了解一些有关 Windows 时区数据库的信息:
您还应该知道,它与和类TimeZoneInfo
有着千丝万缕的联系。这些都有自己的一套怪癖。 有点用,但充满了细微差别。读:DateTime
DateTimeOffset
DateTimeOffset
DateTime
.Net 中日期和时间的更好解决方案是使用NodaTime。这个库实现了两个时区数据库,包括它们之间的 CLDR 映射。它还提供了一个更安全的 API,不会让您陷入麻烦。这可能需要重新学习,但在不知不觉中,您将使用诸如LocalDateTime
、和之类ZonedDateTime
的类。OffsetDateTime
Instant
您仍然存在时区数据库经常更新的问题,因为我们将计时规则留给政客。但是TZDB 人员在保持数据库历史准确性方面做得很好,并在区域名称更改时提供别名/链接。您可以在此处查看 tz 名称列表。
此外,如果您使用 NodaTime,您可以选择坚持使用编译到发行版中的 TZDB 副本,或者您可以将自己的副本与您的应用程序一起发布。您可以(理论上)编写自己的代码以从 IANA 下载最新版本并保持应用程序更新——所有这些都无需依赖主机操作系统。