5

给定从另一台机器 A 到机器 B 的时间戳字符串(例如hh:mm:ss.fff)并假设两台机器的时钟同步,我如何让机器 B 计算其时钟与来自机器 A 的字符串中的时间之间的时间跨度?

我试过比较DateTime.Now.Ticks,但分辨率似乎是 10-20 毫秒。我想计算接近 1 毫秒的分辨率。

一段时间以来,我已经成功地使用Stopwatch.GetTimestamp()了高分辨率计时,但请记住,这并不是那么简单,因为我只有机器 B 中可用的字符串,并且没有Stopwatch.GetTimestamp用实际系统时间校准的好方法。

4

2 回答 2

3

DateTime.Now 使用底层操作系统的日期,其分辨率约为 15 毫秒,在 Windows XP 之前的系统中甚至更差。你能得到的最好的就是秒表和它的滴答声/时钟中完全可用的高分辨率计时器。

您必须首先同步时钟,但这并不意味着设置系统的日期”。同步时钟意味着计算读数之间的差异,可选地验证它是否随着时间流逝而恒定(即检查是否没有时钟比其他时钟计数更快),然后使用计算出的偏移量来..偏移读数,以便“实际值”是在同一时基上相对的——这是您的选择。

谷歌“时钟同步算法”阅读更多关于它的信息。

于 2013-01-07T18:11:29.567 回答
2

你不能做这样的事情:

  • 在机器 A 上调用 Stopwatch.GetTimestamp()
  • 将结果发送到机器 B
  • 在机器 B 上调用 Stopwatch.GetTimestamp()
  • 将结果发送到机器 A
  • 在机器 A 上调用 Stopwatch.GetTimestamp()
  • 计算调整因子(机器 A 的平均结果与机器 B 的结果之间的差异)
  • 比较机器 A 和 B 上的后续结果时使用此调整因子
于 2013-07-22T19:15:35.880 回答