从DateTime.Now获取高分辨率时间戳

时间:2013-01-07 18:01:55

标签: c# .net datetime

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

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

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

2 个答案:

答案 0 :(得分:3)

DateTime.Now使用底层操作系统的日期,其分辨率约为15毫秒,甚至更糟糕的是Windows XP之前的系统。您可以获得的最佳效果是高分辨率计时器,它可以在秒表及其刻度/时钟中使用。

您必须首先同步时钟,但不要意味着“设置系统的日期”。同步时钟意味着计算读数之间的差异,可选地验证它是否随着时间流动而变化(即,检查时钟中的任何一个是否比其他时钟更快),然后使用计算的偏移量来..抵消读数,使“实际值”在相同的时基上是相对的 - 这是你选择的。

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

答案 1 :(得分:2)

你不能做类似的事情:

  • 在机器A上调用Stopwatch.GetTimestamp()
  • 将结果发送至Machine B
  • 在机器B上调用Stopwatch.GetTimestamp()
  • 将结果发送至Machine A
  • 在机器A上调用Stopwatch.GetTimestamp()
  • 计算调整系数(机器A的平均结果与机器B的结果之间的差异)
  • 比较机器A和B上的后续结果时使用此调整系数