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

Does .NET DateTime access host machine time or virtual machine time?

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

.NET 的 DateTime.Now 是否以某种方式 "escape" Citrix 容器并找到远程计算机的时间,或者是否有其他解释?

这是应用程序的当前设置。

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

几件事:

  • Citrix 的 "time zone redirection" 功能可能是对您观察到的内容的解释。详细信息特定于您使用的特定 Citrix 产品(您未提供)。您可以禁用该功能。 Google它,或在ServerFault.

  • 上询问
  • 真的,您应该避免在 server-based 应用程序中使用 DateTime.Now。服务器的时区设置应该无关紧要。酌情使用 DateTime.UtcNowDateTimeOffset.UtcNowDateTimeOffset.Now 以及 TimeZoneInfo class。或者,使用 Noda Time.

  • 回答标题中的问题,可以查看DateTime.Nowhere的源码。它的工作原理如下:

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

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

      注意如果Citrix是重定向时区,会影响这一步

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

    4. 应用偏移量获取本地时间,如果在转换中超过 MinTicksMaxTicks 则截断。

    5. DateTimeKind.Local标记在第4步中计算的值,并在DateTime结构中return它。