我在代码中使用TimeZoneInfo.FindSystemTimeZoneById()
。
我知道这种方法适用于系统注册表中的ID。
所以我想知道当它进入服务器时是否有可能无法正常工作,因为服务器注册表上的ID与我的本地服务器不同。
有人知道吗?
答案 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()
。那么你根本不需要担心注册表或时区。