我有一个部署为 remoteapp 的 Windows 应用程序。我正在尝试使用 C# DateTime.Now 生成时间戳。我很想知道时间戳将如何生成,以防用户从与托管应用程序的服务器具有不同时区的地方使用应用程序。它是特定于服务器还是特定于用户机器。如果是根据服务器时区,有没有办法让它特定于用户机器?
3 回答
我正在尝试使用 C# DateTime.Now 生成时间戳。
强烈建议不要这样做。这将使用运行代码的系统的时区。它只是不适合时间戳。尤其:
- 除非您还记录 UTC 偏移量,否则您将不知道事件何时以任何特别有意义的方式实际发生,包括将一个时间戳与可能在不同时区捕获的另一个时间戳进行比较
- 您会发现由于时区转换,时间戳会在时间上倒退
相反,对所有时间戳使用 UTC - 所以DateTime.UtcNow
- 并确保使用这些时间戳的任何地方都知道它们是 UTC。
即使使用 UTC,如果您使用DateTime.UtcNow
时间戳将基于系统时钟,因此如果它们是在可能具有彼此不同步的系统时钟的多台机器上生成的,您的时间戳不会给出确定的顺序...但是您将比仅使用系统本地时区处于更好的位置。
我会推荐两件事:
在托管 RemoteApp 的 Windows Server 上启用时区重定向策略。这将允许 RemoteApp 使用客户端的本地时区。
更新您的代码以使用
DateTimeOffset.Now
而不是DateTime.Now
. 这将保留您与 UTC 的偏移量,以便您稍后可以比较时间戳,同时仍使用本地值进行显示。
回答您的问题:如果您使用DateTime.Now
生成的时间戳将位于代码运行所在机器的本地时区。
如果您与服务器共享时间戳,并且不仅仅用于显示本地时间,请不要使用DateTime.Now
. 以后会给你带来很多麻烦。
如果您想使用内置的 .NET Framework 类型,我建议您使用DateTime.UtcNow
它来生成时间戳。无论何时要显示它,都可以调用DateTime.ToLocalTime()
客户端系统以获取时间戳的本地表示。
我建议使用NodaTime来处理与时间相关的数据,因为由于它的特殊类型,它可以更好地处理日期和时间数据。
Jon Skeet 曾经举办过一场关于时间处理的精彩演讲,您可以在这里找到。