如何在RemoteApp中处理不同的时区

时间:2017-09-29 13:52:48

标签: c# datetime timezone remoteapp

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

3 个答案:

答案 0 :(得分:5)

  

我正在尝试使用C#DateTime.Now生成时间戳。

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

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

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

即使使用UTC,如果您使用的是DateTime.UtcNow,时间戳也将基于系统时钟,因此如果它们是在多台计算机上生成的,这些计算机可能具有彼此不同步的系统时钟,你的时间戳不会给出明确的排序......但是你会比使用系统本地时区更好的位置。

答案 1 :(得分:0)

我建议两件事:

  1. 在托管RemoteApp的Windows Server上启用time zone redirection policy。这将允许RemoteApp使用客户端的本地时区。

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

答案 2 :(得分:0)

回答您的问题:如果使用angle,生成的时间戳将位于运行代码的计算机的本地时区。

如果要与服务器共享时间戳并将其用于显示本地时间以外的操作,请不要使用DateTime.Now。这会在以后给你带来很多麻烦。

如果要使用内置.NET Framework类型,建议使用DateTime.Now生成时间戳。无论何时想要显示它,都可以在客户端系统上调用DateTime.UtcNow来获取时间戳的本地表示。

我建议使用NodaTime来处理与时间相关的数据,因为由于其特殊类型,它可以更好地处理日期和时间数据。

Jon Skeet曾经对时间处理进行过精彩的讨论,你可以找到here