【发布时间】:2019-07-29 15:35:02
【问题描述】:
我正在开发家长控制 Windows 桌面应用程序。许多动作/事件取决于正确的系统时间。问题是我不能相信系统时间,因为它可以改变。所以只要有可能,我想以某种方式从互联网上获取时间。时间应该是 UTC,因为我希望它在不同的时区工作。解决方案不必是防弹的。我确信孩子们总会找到解决它的方法;-) 我至少想要一些不能用两次鼠标点击来欺骗的东西。
目前我正在考虑这些选项以获得时间:
- 来自公共 NTP 服务器。但是我担心将来服务器可能会宕机。
- 来自 google.com 等网站的 WebClient 响应标头 我认为响应时间不是UTC,我担心如果请求太频繁,Web 服务器可能会阻止请求。
- 从我自己的 Web 服务器 API 获取服务器 UTC 时间。我认为这可能是我目前最好的选择。
如果我能够缓存时间,这样我就不必过于频繁地同步它,那也很棒。我不想每秒向时间服务器发送请求。
对于缓存部分,我正在考虑存储来自 Internet 的 DateTime 和上次同步的系统 DateTime 之类的东西。并根据这些值计算时间。
您认为从 Internet 获取和缓存正确 UTC 时间的最佳方法是什么?
非常感谢您的建议。
【问题讨论】:
-
选择一个stratum 2 time server near you 和一个备份(是的,不要经常同步是很体贴的)。如果它们倒下,你会遇到更大的问题——比如觅食。
-
谢谢,我会检查一下。和好笑话。 :-)
-
您可以订阅SystemEvents.TimeChanged(当用户修改当前时间时触发)。如果引发事件,请通过 API 检查当前时间并在必要时进行更正。
-
请注意@Jimi 推荐的
SystemEvents.TimeChanged事件往往会触发两次触发它的任何事件(实际用户启动时间已更改,更改“自动设置时间”)。 -
@TnTinMn 是的,这是真的。您将收到两次通知。但它很容易用秒表规避。如果您将事件处理程序设置为
async,则可以在顶部添加[StopWatch].IsRunning检查,引发自定义通知await Task.Delay(200).ConfigureAwait(false)(或更多),然后停止监视。当前时间也可以从www.google.com的Headers中提取。非常精确。