TimeZoneInfo Id取决于机器?

时间:2013-12-17 09:12:36

标签: c# .net timezone

我在代码中使用TimeZoneInfo.FindSystemTimeZoneById()

我知道这种方法适用于系统注册表中的ID。

所以我想知道当它进入服务器时是否有可能无法正常工作,因为服务器注册表上的ID与我的本地服务器不同。

有人知道吗?

4 个答案:

答案 0 :(得分:2)

TimeZone东西总是让我感到困惑,但我的回答是。有可能在不同的服务器上不起作用。

TimeZoneInfo.FindSystemTimeZoneById()方法使用HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Time Zones注册表信息。有时微软会发布一些Windows更新来改变这些信息。

例如 August 2012 cumulative time zone update for Windows operating systems ;

  
      
  • 电子。欧洲标准时间:此时区的显示名称已更新为“(UTC + 2:00)E。Europe”。来自“(UTC + 2:00)尼科西亚。”
  •   
  • 亚速尔群岛标准时间:将2013 DST开始时间更改为3月最后一个星期日凌晨00:00:00,结束时间为   10月的最后一个星期日01:00:00。
  •   
  • Pacific SA标准时间:如先前在Microsoft知识库文章2681116中所宣布的那样,智利已延长2012年日光   节约时间。智利政府改变了2012年的夏令时开始   日期发生在9月23日的第一个星期六:59:59.999并结束   日期将于4月的最后一个星期六23:59:59.999发生。
  •   

如您所见,您的某个服务器在其注册表中没有相同的信息(例如,一个无法更新),这些TimeZone信息看起来不同。

答案 1 :(得分:2)

虽然可能找不到ID(请参阅其他答案),如果两台计算机都有当前的Windows更新,那么可能你会有不匹配。

即便如此,虽然每年多次更改夏令时和显示名称的定义,但很少会创建全新的时区,并且ID一旦建立就永远不会改变。

因此,只要至少您的服务器具有时区的当前Windows更新,那么您应该能够处理来自客户端的任何有效输入,即使它们没有达到日期。您可以在this site上查看Windows的所有时区更新。

然而,尽管如此,我最好的建议是放弃使用Microsoft时区并使用标准的IANA时区。有关详细信息,请参阅the timezone tag wiki。在.NET中,实现此目的的最佳方法是使用Noda Time库。

答案 2 :(得分:0)

根据MSDN - TimeZoneInfo.FindSystemTimeZoneById Method,如果找不到ID,您将获得TimeZoneNotFoundException

  

找不到id指定的时区标识符。这意味着   一个名称与id匹配的注册表项不存在,或者是   密钥存在但不包含任何时区数据。

答案 3 :(得分:0)

由于您只需要将服务器日期时间转换为本地客户端时间(而不是跨客户端转换),因此请在通信中使用UTC时间,并在客户端上使用DateTime.ToLocal()。那么你根本不需要担心注册表或时区。