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

nin*_*der 1 c# citrix

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

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

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

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

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

Mat*_*int 6

一些东西:

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

  • 实际上,您应该避免DateTime.Now在基于服务器的应用程序中使用.与服务器的时区设置无关.根据需要使用DateTime.UtcNow,, DateTimeOffset.UtcNowDateTimeOffset.NowTimeZoneInfo课程一起使用.或者,使用Noda Time.

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

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

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

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

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

    4. 应用偏移量获取本地时间,如果截断MinTicksMaxTicks在转化率超过.

    5. 用步骤4标记在步骤4中计算的值DateTimeKind.Local,并在DateTime结构中返回它.