代码之家  ›  专栏  ›  技术社区  ›  Ian Ringrose

如何检测系统时间是否更改?(来自.NET)

  •  7
  • Ian Ringrose  · 技术社区  · 15 年前

    我正在使用datetime.utcnow在我的软件中测量时间,并且需要能够判断在操作b_157;之后10秒钟内是否发生了__操作a_157;

    但是,如果系统时间改变了呢?那么,我如何检测系统时间是否发生了变化呢?

    我不想使用秒表,因为我们需要在多个CPU的服务器上运行,请参见 http://kristofverbiest.blogspot.com/2008/10/beware-of-stopwatch.html

    我还需要处理暂停和重新启动的虚拟机,因此__tick count_157;对我来说不太可能有用。

    4 回复  |  直到 8 年前
        1
  •  9
  •   Philip Rieck    15 年前

    你可以使用 SystemEvents.TimeChanged 用于检测时间更改的事件。但是,只有在运行messagepump的情况下,这才会触发——这对于Windows客户端应用程序来说很好,但对于大多数服务器应用程序(如服务、Web应用程序等)则不太好。

    否则你可以用 Environment.TickCount -它没有很好的分辨率,但如果你的“10”秒可以是“近10秒”,你可能很好。a对于vm限制,请注意,当机器运行足够长的时间后,滴答数就会滚动,因此您必须处理这个问题,可能需要 DateTime.UtcNow 无论哪种方式,都要进行健康检查。

    我会同时使用这两种方法,但是请注意,除了检查一些已知准确(会影响性能)的外部时间服务器之外,没有绝对准确的方法可以在VM情况下工作…在你花更多的时间去解决这个问题之前,一定要确定什么是“足够可靠的”。

        2
  •  4
  •   Jim Mischel    15 年前

    我还是建议使用 StopWatch . 如果中描述的问题 Beware of QueryPerformanceCounter 仍然存在,你说的只是几毫秒的差别。如果你担心消极的时间(我从未见过,我用 秒表 很多时间间隔很小),然后将-1毫秒到-1000毫秒之间的任何时间都视为零。

    使用 DateTime.Now DateTime.UtcNow 因为如果有人更改了机器上的日期/时间,任何类型的定时都会给您带来麻烦。您必须使用完全在计算机内部且无法更改的内容。 秒表 是我找到的最可靠的。

        3
  •  1
  •   Tim Lloyd    15 年前

    可以使用SystemEvents类的TimeChanged事件在运行时检测对系统时钟的更改:

    http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.timechanged.aspx

    这依赖于您的应用程序具有消息循环(我认为是因为需要处理wm_timechanged消息),因此如果是无头应用程序(如Windows服务),则需要隐藏表单。

    至于在应用程序因处于挂起的虚拟机上而挂起时检测系统时钟的变化,那么,所有的赌注实际上都是为了获得真正可靠的解决方案而取消的。您可以定期记录上一次执行检查的时间,并确保时间没有倒退。无论如何,挂起和恢复虚拟机可能需要10秒以上的时间。

        4
  •  0
  •   Martin Kosicky    8 年前

    我将比较系统时间差和两个时间间隔之间的单时钟。如果差异比某些更改日期和时间的人大