.NET DateTime 访问主机时间还是虚拟机时间?
Does .NET DateTime access host machine time or virtual machine time?
我 运行 通过 Citrix 服务器在远程位置 运行 遇到应用程序问题。当应用程序位于远程位置 运行 时,即使用户正在通过 Citrix 访问应用程序,它也会将远程位置的时间记录到数据库中。
.NET 的 DateTime.Now 是否以某种方式 "escape" Citrix 容器并找到远程计算机的时间,或者是否有其他解释?
这是应用程序的当前设置。
- 应用程序将事件记录到美国的数据库
- 远程用户位于欧洲并通过 Citrix 访问该应用程序,该应用程序模拟 运行在美国使用该应用程序
- Citrix 服务器机器时间设置为美国时间
P.S。应用程序已更新为在将来保存时从数据库中查询时间。
几件事:
Citrix 的 "time zone redirection" 功能可能是对您观察到的内容的解释。详细信息特定于您使用的特定 Citrix 产品(您未提供)。您可以禁用该功能。 Google它,或在ServerFault.
上询问
真的,您应该避免在 server-based 应用程序中使用 DateTime.Now
。服务器的时区设置应该无关紧要。酌情使用 DateTime.UtcNow
、DateTimeOffset.UtcNow
或 DateTimeOffset.Now
以及 TimeZoneInfo
class。或者,使用 Noda Time.
回答标题中的问题,可以查看DateTime.Now
here的源码。它的工作原理如下:
调用 DateTime.UtcNow
,它本身调用 GetSystemTimeAsFileTime
Win32 API。这是系统时钟。它是在 UTC 方面——而不是任何特定的时区。如果您 运行 在 VM 中,通常此系统时钟与主机的时间同步。
获取有关本地计算机时区的数据。它使用完整时区的截断版本(出于性能原因),并缓存数据以供将来重用。
注意如果Citrix是重定向时区,会影响这一步
使用检索到的数据,计算与 UTC 的偏移量 - 对于在步骤 1 中检索到的特定 UTC 点。
应用偏移量获取本地时间,如果在转换中超过 MinTicks
或 MaxTicks
则截断。
用DateTimeKind.Local
标记在第4步中计算的值,并在DateTime
结构中return它。
我 运行 通过 Citrix 服务器在远程位置 运行 遇到应用程序问题。当应用程序位于远程位置 运行 时,即使用户正在通过 Citrix 访问应用程序,它也会将远程位置的时间记录到数据库中。
.NET 的 DateTime.Now 是否以某种方式 "escape" Citrix 容器并找到远程计算机的时间,或者是否有其他解释?
这是应用程序的当前设置。
- 应用程序将事件记录到美国的数据库
- 远程用户位于欧洲并通过 Citrix 访问该应用程序,该应用程序模拟 运行在美国使用该应用程序
- Citrix 服务器机器时间设置为美国时间
P.S。应用程序已更新为在将来保存时从数据库中查询时间。
几件事:
Citrix 的 "time zone redirection" 功能可能是对您观察到的内容的解释。详细信息特定于您使用的特定 Citrix 产品(您未提供)。您可以禁用该功能。 Google它,或在ServerFault.
上询问
真的,您应该避免在 server-based 应用程序中使用
DateTime.Now
。服务器的时区设置应该无关紧要。酌情使用DateTime.UtcNow
、DateTimeOffset.UtcNow
或DateTimeOffset.Now
以及TimeZoneInfo
class。或者,使用 Noda Time.回答标题中的问题,可以查看
DateTime.Now
here的源码。它的工作原理如下:调用
DateTime.UtcNow
,它本身调用GetSystemTimeAsFileTime
Win32 API。这是系统时钟。它是在 UTC 方面——而不是任何特定的时区。如果您 运行 在 VM 中,通常此系统时钟与主机的时间同步。获取有关本地计算机时区的数据。它使用完整时区的截断版本(出于性能原因),并缓存数据以供将来重用。
注意如果Citrix是重定向时区,会影响这一步
使用检索到的数据,计算与 UTC 的偏移量 - 对于在步骤 1 中检索到的特定 UTC 点。
应用偏移量获取本地时间,如果在转换中超过
MinTicks
或MaxTicks
则截断。用
DateTimeKind.Local
标记在第4步中计算的值,并在DateTime
结构中return它。