.NET DateTime是否访问主机时间或虚拟机时间?

时间:2017-01-27 00:48:18

标签: c# citrix

我遇到了通过Citrix服务器在远程位置运行的应用程序的问题。当应用程序在远程位置运行时,即使用户通过Citrix访问应用程序,它也会使用远程位置的时间将事件记录到数据库。

.NET的DateTime.Now以某种方式"逃脱" Citrix容器并找到远程计算机的时间还是有其他解释?

以下是该应用程序的当前设置。

  • 应用程序将事件记录到美国的数据库
  • 远程用户位于欧洲,通过Citrix访问应用程序,模拟在美国运行应用程序
  • Citrix服务器计算机时间设置为美国时间

P.S。该应用程序已更新,以便在将来保存时从数据库中查询时间。

1 个答案:

答案 0 :(得分:6)

一些事情:

  • Citrix的“时区重定向”功能可能是您观察到的内容的解释。详细信息特定于您使用的特定Citrix产品(您未提供)。您可以禁用该功能。谷歌,或在ServerFault上询问。

  • 实际上,您应该避免在基于服务器的应用程序中使用DateTime.Now。与服务器的时区设置无关。根据需要,使用DateTime.UtcNowDateTimeOffset.UtcNowDateTimeOffset.Now以及TimeZoneInfo类。或者,使用Noda Time

  • 要回答标题中的问题,您可以看到DateTime.Now here的源代码。它的工作原理如下:

    1. 调用DateTime.UtcNow,它本身调用GetSystemTimeAsFileTime Win32 API。这是系统时钟。它是UTC的 - 不是任何特定的时区。如果您在VM中运行,通常此系统时钟将与主机的时间同步。

    2. 获取有关本地计算机时区的数据。它使用完整时区的截断版本(出于性能原因),并缓存数据以供将来重用。

      请注意,如果Citrix重定向时区,则会影响此步骤。

    3. 使用检索到的数据,计算UTC的偏移量 - 针对步骤1中检索到的特定UTC点。

    4. 应用偏移量来获取当地时间,如果转化中超出MinTicksMaxTicks则截断。

    5. 使用DateTimeKind.Local标记步骤4中计算的值,并将其返回DateTime结构。