为什么timepan totalmilliseconds在整数和小数部分中具有相同的数字?

时间:2013-02-28 15:53:19

标签: c# datetime timespan

当计算两个DateTime个对象之间的毫秒差异时,我似乎总是得到一个数字,其中数字的小数部分与数字的整数分量相同。例如:1235.1235

为什么会这样?难道我做错了什么?这是语言的怪癖还是DateTime粒度的限制?

可以使用以下代码演示:

        DateTime then = DateTime.Now;
        Thread.Sleep(1234);
        DateTime now = DateTime.Now;
        TimeSpan taken = now - then;
        string result = taken.TotalMilliseconds.ToString(CultureInfo.InvariantCulture);
        //result = "1235.1235"

由CodesInChaos评论:

DateTime`不准确达到此精确度:请参阅C# DateTime.Now precision

但是 - 这并没有完全解释这种行为。

1 个答案:

答案 0 :(得分:4)

对此有一个技术解释,我不能证明它解释了你的观察。它肯定不会在我的机器上重现。

对于初学者而言,您正在查看噪声数字,操作系统时钟不够准确,无法提供亚毫秒精度。所以要确保你永远不要依赖他们的价值做任何重要的事情。如果要测量高分辨率的间隔,则必须使用秒表。

操作系统时钟受时间服务器更新的影响。大多数机器都设置为定期联系time.windows.com以重新校准时钟。这摆脱了时钟漂移,机器硬件通常不够好,以保持时间精确到一个月以上的一秒钟。低耐受性晶体是昂贵的,并且由于温度和老化效应而永远不会完全没有漂移。并且偶尔插入闰秒以使时钟与行星的减速旋转保持同步。最后一个崩溃了许多Linux机器,谷歌“Linux闰第二个bug”进行了一些有趣的阅读。

这里重要的是当您的机器获得需要调整时钟的新更新时会发生什么。 Windows 突然跳过时钟值,这会导致正在关注时钟的程序出现重大问题,并期望它以可预测的数量持续增加。

相反,它会在每个时钟滴答增量的情况下一次添加一点。实际上,使时钟运行速度稍慢或更快,因此它将逐渐弥补差异并再次获得准确。也许你可以看到它的位置,额外增加的微秒与间隔的长度成正比。因此,看到噪声数字中重复的间隔是合理的。

证明这一理论的唯一真正方法是对GetSystemTimeAdjustment()进行调整。系统时间调整正在进行时,它将返回非零值。然后调用SetSystemTimeAdjustment()来禁用它并观察它是否会对您看到的值产生影响。或者只是等待足够长的时间,直到时钟赶上,所以它不再被调整。