C# DateTime.Now 精度

标签 c# .net datetime precision time-precision

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

我知道有一个秒表类更适合进行精确的时间测量,但我很好奇是否有人可以解释 DateTime 中的这种行为? DateTime.Now 是否有官方精度记录(例如,精确到 50 毫秒以内?)?为什么 DateTime.Now 的精度低于大多数 CPU 时钟可以处理的精度?也许它只是为最低公分母 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();
}

最佳答案

Why would DateTime.Now be made less precise than what most CPU clocks could handle?

一个好的时钟应该既精确准确;那些是不同的。正如老笑话所说,停走的时钟一天准确两次,慢一分钟的时钟在任何时候都不会准确。但是慢一分钟的时钟总是精确到最近的分钟,而停止的时钟根本没有任何有用的精度。

为什么 DateTime 应该精确到微秒,而它不可能精确到微秒?大多数人没有任何精确到微秒的官方时间信号来源。因此,在精度的小数点后给出六位,其中最后五位是垃圾将是说谎

请记住,DateTime 的目的是表示日期和时间。高精度计时根本不是 DateTime 的目的;正如您所注意到的,这就是 StopWatch 的目的。 DateTime 的用途是表示日期和时间,用于向用户显示当前时间、计算下周二之前的天数等。

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

感谢您的提问;这将成为一篇很好的博客文章! :-)

关于C# DateTime.Now 精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143140/

相关文章:

c# - 动态列表<T> 类型

c# - 如何为 Windows 应用商店应用程序创建自定义按钮?

IOS 找不到真正的格式来解析日期

C# 最佳实践 - 计算每个日期出现的次数

javascript - JS。转换格式日期

c# - 处理属性(property)变更事件

c# - Controller 操作中的异步等待 : Error: Can not await 'void'

.NET Web 服务——新方法未出现

c# - 如何从 ASP.NET MVC 中的不同 Controller 和操作呈现的 Html.Action 中检索 Controller 和操作名称

c# - 仅当我从组合框中选择一个项目时才执行操作