gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:22 24 4
gpt4 key购买 nike

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

.NET 的 DateTime.Now 是否以某种方式“逃脱”了 Citrix 容器并找到了远程机器的时间,或者是否有其他解释?

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

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

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

最佳答案

一些事情:

  • 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结构体中返回。

关于c# - .NET DateTime 访问主机时间还是虚拟机时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41885518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com