一尘不染

C#DateTime.Now精度

c#

在执行一些单元测试时,我只是遇到了DateTime.UtcNow一些意外的行为。看起来,当您快速连续调用DateTime.Now/UtcNow时,似乎可以在比预期更长的时间间隔内返回相同的值,而不是捕获更精确的毫秒增量。

我知道有一个秒表类更适合于进行精确的时间测量,但是我很好奇是否有人可以在DateTime中解释这种行为?是否有记录DateTime.Now的官方精度(例如,精度在50毫秒内?)?为什么将DateTime.Now的精度降低到大多数CPU时钟无法处理的水平?也许它是为最低公分母设计的?

public static void Main(string[] args)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    for (int i=0; i<1000; i++)
    {
        var now = DateTime.Now;
        Console.WriteLine(string.Format(
            "Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond));
    }

    stopwatch.Stop();
    Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}",
        stopwatch.ElapsedMilliseconds);

    Console.ReadLine();
}

阅读 566

收藏
2020-05-19

共1个答案

一尘不染

为什么将DateTime.Now的精度降低到大多数CPU时钟无法处理的水平?

一个好的时钟既要 精确准确 ;
那些是不同的。就像老玩笑所说的那样,停下来的时钟每天准确地是两次,而慢一分钟的时钟在任何时候都永远不会准确。但是慢一分钟的时钟总是精确到最接近的分钟,而停止的时钟根本没有任何有用的精度。

日期时间为什么要 精确 到,说微秒时,它不可能是 精确 到微秒?大多数人没有任何精确到微秒的官方时间信号源。因此给予小数点后六位数字 精度
,其在过去五年中,有 垃圾撒谎

请记住,DateTime的目的是 代表日期和时间
。高精度计时完全不是DateTime的目的;如您所述,这就是StopWatch的目的。DateTime的目的是为了表示日期和时间,例如向用户显示当前时间,计算到下一个星期二的天数等等。

简而言之,“现在几点?” 和“那花了多长时间?” 是完全不同的问题;不要使用旨在回答一个问题来回答另一个问题的工具。

谢谢你的问题;这将是一篇不错的博客文章!:-)

2020-05-19