我遇到了通过Citrix服务器在远程位置运行的应用程序的问题。当应用程序在远程位置运行时,即使用户通过Citrix访问应用程序,它也会使用远程位置的时间将事件记录到数据库。
.NET的DateTime.Now以某种方式"逃脱" Citrix容器并找到远程计算机的时间还是有其他解释?
以下是该应用程序的当前设置。
P.S。该应用程序已更新,以便在将来保存时从数据库中查询时间。
答案 0 :(得分:6)
一些事情:
Citrix的“时区重定向”功能可能是您观察到的内容的解释。详细信息特定于您使用的特定Citrix产品(您未提供)。您可以禁用该功能。谷歌,或在ServerFault上询问。
实际上,您应该避免在基于服务器的应用程序中使用DateTime.Now
。与服务器的时区设置无关。根据需要,使用DateTime.UtcNow
,DateTimeOffset.UtcNow
或DateTimeOffset.Now
以及TimeZoneInfo
类。或者,使用Noda Time。
要回答标题中的问题,您可以看到DateTime.Now
here的源代码。它的工作原理如下:
调用DateTime.UtcNow
,它本身调用GetSystemTimeAsFileTime
Win32 API。这是系统时钟。它是UTC的 - 不是任何特定的时区。如果您在VM中运行,通常此系统时钟将与主机的时间同步。
获取有关本地计算机时区的数据。它使用完整时区的截断版本(出于性能原因),并缓存数据以供将来重用。
请注意,如果Citrix重定向时区,则会影响此步骤。
使用检索到的数据,计算UTC的偏移量 - 针对步骤1中检索到的特定UTC点。
应用偏移量来获取当地时间,如果转化中超出MinTicks
或MaxTicks
则截断。
使用DateTimeKind.Local
标记步骤4中计算的值,并将其返回DateTime
结构。