如何处理 RemoteApp 中的不同时区

How to take care of different timezones in RemoteApp

我有一个 windows 部署为远程应用程序的应用程序。我正在尝试使用 C# DateTime.Now 生成时间戳。我很想知道,如果用户从时区与托管应用程序的服务器时区不同的地方使用应用程序,将如何生成时间戳。它是服务器特定的还是用户机器特定的。如果是根据服务器时区,有没有什么办法让它特定于用户机器?

I'm trying to generate a timestamp using C# DateTime.Now.

强烈建议不要这样做。这将使用代码为 运行 的系统的时区。它只是不适合时间戳。特别是:

  • 除非您还记录了 UTC 偏移量,否则您不会以任何特别有意义的方式知道事件实际发生的时间,包括将一个时间戳与另一个可能在不同时区捕获的时间戳进行比较
  • 您会发现由于时区转换,时间戳可能会倒退

相反,对所有时间戳使用 UTC - 所以 DateTime.UtcNow - 并确保使用这些时间戳的任何地方知道它们是 UTC。

即使在使用 UTC 时,如果您使用的是 DateTime.UtcNow,时间戳将基于系统时钟,因此如果它们是在多台机器上生成的,而这些机器的系统时钟可能与彼此,你的时间戳不会给出明确的顺序......但你会比仅仅使用系统本地时区更好。

我会推荐两件事:

  1. 在承载 RemoteApp 的 Windows 服务器上启用 time zone redirection policy。这将允许 RemoteApp 使用客户端的本地时区。

  2. 更新您的代码以使用 DateTimeOffset.Now 而不是 DateTime.Now。这将保留您与 UTC 的偏移量,以便您稍后可以比较时间戳,同时仍使用本地值进行显示。

回答您的问题:如果您使用 DateTime.Now,则生成的时间戳将位于运行代码的机器的本地时区。

如果您要与服务器共享时间戳并且不仅仅用于显示本地时间,请不要使用 DateTime.Now。以后会给你带来很多麻烦。

如果您想使用内置的 .NET Framework 类型,我建议使用 DateTime.UtcNow 来生成时间戳。每当你想显示它时,你可以在客户端系统上调用 DateTime.ToLocalTime() 来获取时间戳的本地表示。

我建议使用 NodaTime 来处理与时间相关的数据,因为它具有专门的类型,可以更好地处理日期和时间数据。

Jon Skeet 曾经就时间处理发表过精彩演讲,您可以找到 here