【问题标题】:Is there an event when windows system time changes from an NTP time update?Windows 系统时间从 NTP 时间更新更改时是否有事件?
【发布时间】:2012-08-16 07:10:38
【问题描述】:

我希望在我的 C# 应用程序中更改 Windows 系统日期/时间时收到通知。我找到了SystemEvents.TimeChanged 事件,MSDN 文档对此表示:

当用户更改系统时钟的时间时发生。

如果时钟被 NTP 更改,此事件是否也会被触发?或者我可以订阅其他活动吗?

实现细节:

我希望 timer.Elapsed 事件在特定日期/时间触发。我的代码计算用于计时器所需的时间间隔。如果系统时间发生变化,则需要重新评估此计算以计算出新的时间间隔并更新计时器。

答案摘要

感谢所有 cmets。我将它们总结在下面以供将来参考:

  • SystemEvents.TimeChanged 在用户更改和系统调用与 NTP 服务器重新同步时触发
  • 如果在 Windows 服务中运行,则需要处理消息泵以获取 TimeChanged 事件。这可以通过运行调度程序来实现。
  • NTP 服务器不应用离散的系统日期更改。逐步应用 NTP 时钟调整,同时考虑到计算的时钟漂移以及本地时钟与其他 NTP 服务器之间的偏移
  • 对于我的实现,最好定期评估计时器间隔以考虑任何系统时间更改,而不是设置一次间隔并让它触发。

【问题讨论】:

  • 感谢@StuartDunkeld,我刚刚查看了 Reflector 中的 SystemEvents,并且 TimeChanged 事件在内部使用了 WindowProc 本机方法。这是否意味着 SystemEvents.TimeChanged 将被调用任何时间更改事件?
  • 如果每次 NTP 服务器调整时间时您都期待一个事件,我怀疑您会得到一个。 NTP 通过减慢或加快时钟连续调整时钟,同时考虑到计算的时钟漂移以及本地时钟与其他 NTP 服务器之间的偏移。这些调整不是离散的跳跃,而是摆动。见stackoverflow.com/questions/7497242/…
  • 谢谢@Celada。这是否意味着使用上面的实现是安全的?还是我应该定期重新评估下一个间隔以获得更好的准确性?
  • NTP 时钟调整逐渐应用,通常以每个时钟中断 100 纳秒的速率进行。它可以补偿闰秒和时钟漂移,而不会扰乱依赖时钟稳定提前的过程。有关详细信息,请参阅 MSDN 文章 GetSystemTimeAdjustment()。

标签: c# windows datetime


【解决方案1】:

是的,TimeChanged 在您将 Windows 配置为使用 NTP 服务器以保持您的时间保持最新以及有人手动更改时间时引发。

这里需要注意的是,您必须有一个 UI。 (或启动一个隐藏窗口来获取消息泵)。 IE。您无法在 Windows 服务中获取 TimeChanged 事件。

【讨论】:

  • 谢谢。从命令行运行“w32tm /resync”时,我能够跳入事件处理程序,这预示着良好的发展。关于警告的好提示。如果我创建调度程序并运行它,我应该能够在 Windows 服务中获取事件,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2017-08-19
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
相关资源
最近更新 更多