3

我有一个常见的问题:

需要在时区之间转换时间

1-我需要找到什么是客户端时区

2-将其转换为 UTC

所以经过一番搜索,我发现找到客户端时区的唯一方法是使用java脚本,我也使用这个库,但是这个库返回了这种格式的时区:Location/CityName像:"America/New_York"

那么我知道在时区之间转换时间的唯一方法是:

TimeZoneInfo.ConvertTimeToUtc(clientsidedatetime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time") /*Client Time Zone Name*/);

如您所见,使用的时区格式FindSystemTimeZoneById与我返回的 java 脚本不同。

问题是如何将这两种格式相互转换,例如转换Asia/SingaporeSingapore Time

或者有没有更好的方法来查找客户端时间并将其转换为 UTC 时间?

4

1 回答 1

3

像“美国/纽约”这样的时区是基于 unix/linux 的系统和一般互联网上的标准。它们被称为“奥尔森”时区,以原作者亚瑟奥尔森的名字命名。它们所基于的数据库有时称为“Olson 数据库”、“tz 数据库”或“zoneinfo 数据库”。它们现在由 IANA 维护。您可以在 Wikipedia 上阅读有关它们的更多信息。

Olson 时区与 .Net TimeZoneInfo 类使用的 Microsoft Windows 时区标识符完全不兼容。微软早就有自己的时区数据库,由 Windows Update 维护,微软在这里讨论。

在这些标准之间进行转换的权威来源是Unicode CLDR 他们发布了一个可用于转换的表,但我建议您使用库来代替。

.Net 有几个库可用于处理 Olson 时区和 CLDR 数据。最好的(恕我直言)是StackOverflow 名人 Jon Skeet 的NodaTime。这是来自 Java 的一个非常流行的库的一个端口,其中包括一个 Olson 时区实现,以及一组经过重新设计的用于日期时间操作的类,这些类在许多方面都优于 Microsoft。

我知道在 .Net 中实现 IANA/Olson 数据库的库是:

更新
所有这些信息以及更多信息都可以在 StackOverflow时区标签 wiki中找到。

于 2012-09-17T20:58:19.327 回答