我有一个常见的问题:
需要在时区之间转换时间
1-我需要找到什么是客户端时区
2-将其转换为UTC
所以经过一番搜索,我发现找到客户端时区的唯一方法是使用java脚本,我也使用这个库,但这个库返回的时区格式是:Location/CityName
Like:"America/New_York"
那么我知道的在时区之间转换时间的唯一方法是:
TimeZoneInfo.ConvertTimeToUtc(clientsidedatetime, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time") /*Client Time Zone Name*/);
因此,正如您所看到的,FindSystemTimeZoneById
中使用的时区格式与我返回的java脚本不同。
问题是如何将这两种格式相互转换,例如将Asia/Singapore
转换为Singapore Time
?
或者有没有更好的方法来查找客户端时间并将其转换为UTC时间?
像"美国/纽约"这样的时区是基于unix/linux的系统和一般互联网上的标准。它们被称为"奥尔森"时区,以原作者亚瑟·奥尔森的名字命名。它们所基于的数据库有时被称为"Olson数据库"、"tz数据库"或"zoneinfo数据库"。它们现在由IANA维护。你可以在维基百科上阅读更多关于他们的信息。
Olson时区与.Net TimeZoneInfo类使用的Microsoft Windows时区标识符完全不兼容。微软长期以来一直有自己的时区数据库,由Windows Update维护,微软在这里对此进行了讨论。
在这些标准之间进行转换的权威来源是Unicode CLDR。它们发布了一个可用于转换的表,但我建议您使用库来进行转换。
.Net有几个库可用于处理Olson时区和CLDR数据。最好的(IMHO)是StackOverflow名人Jon Skeet的NodaTime。这是Java中一个非常流行的库的端口,该库包括Olson时区实现,以及一组用于日期时间操作的经过重新设计的类,这些类在许多方面都优于Microsoft。
据我所知,在.Net中实现IANA/Olson数据库的库有:
- NodaTime(推荐)
- 区域信息
- TZ4网络
更新
所有这些信息以及更多信息都可以在StackOverflow TimeZone标记wiki中找到。