C#DateTime.Now精度C#DateTime.Now精度(C# DateTime.Now p

2019-05-09 00:40发布

我只是跑与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();
}

Answer 1:

为什么会DateTime.Now进行比大多数CPU时钟可以处理不太精确?

一个良好的时钟应该是既精确准确 ; 这些是不同的。 至于那个老笑话,停止时钟是完全准确的,一天两次,时钟慢一分钟都是从未在任何时候准确。 但时钟慢一分钟,始终是精确到最近分钟,而停止时钟没有有用的精度可言。

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

请记住,日期时间的目的是代表一个日期和时间 。 高精度定时不在日期时间的所有的目的; 当你注意,这是秒表的目的。 日期时间的目的是为了代表目的,如显示当前时间给用户,计算天数,直到下周二,等等日期和时间。

总之,“现在是什么时候?” 和“多长时间没那个时间?” 是完全不同的问题; 不要用设计来回答一个问题来回答对方的工具。

谢谢你的问题; 这将使一个好的博客文章! :-)



Answer 2:

日期时间的精度是有点具体到它正在运行的系统。 精度涉及上下文切换,这往往是约15或16毫秒的速度。 (在我的系统,它实际上是从我的测试中大约14毫秒,但我已经看到一些笔记本电脑在那里它更接近35-40毫秒的精度。)

彼得·布朗伯格写上高精度的计时码的一篇文章在C#中,其中讨论了这一点。



Answer 3:

我想精确Datetime.Now :),所以我做这件事:

public class PreciseDatetime
{
    // using DateTime.Now resulted in many many log events with the same timestamp.
    // use static variables in case there are many instances of this class in use in the same program
    // (that way they will all be in sync)
    private static readonly Stopwatch myStopwatch = new Stopwatch();
    private static System.DateTime myStopwatchStartTime;

    static PreciseDatetime()
    {
        Reset();

        try
        {
            // In case the system clock gets updated
            SystemEvents.TimeChanged += SystemEvents_TimeChanged;
        }
        catch (Exception)
        {                
        }
    }

    static void SystemEvents_TimeChanged(object sender, EventArgs e)
    {
        Reset();
    }

    // SystemEvents.TimeChanged can be slow to fire (3 secs), so allow forcing of reset
    static public void Reset()
    {
        myStopwatchStartTime = System.DateTime.Now;
        myStopwatch.Restart();
    }

    public System.DateTime Now { get { return myStopwatchStartTime.Add(myStopwatch.Elapsed); } }
}


Answer 4:

从MSDN你会发现DateTime.Now具有10毫秒的所有NT操作系统的近似分辨率。

实际精度依赖于硬件。 可以使用获得更好的精度QueryPerformanceCounter



Answer 5:

对于它的价值,实际上短检查.NET源,埃里克利珀设置在评论这太问题说,日期时间只精确到大约30毫秒。 对于不是纳秒准确的,用他的话说的理由,是它“并不需要的人。”



Answer 6:

从MSDN文档 :

此属性的分辨率取决于系统定时器。

他们还声称,在Windows NT 3.5和更高版本的近似分辨率为10毫秒:)



Answer 7:

此属性的分辨率取决于系统计时器,它取决于底层操作系统。 它往往是在0.5和15毫秒之间。

其结果是,在重复一个短的时间间隔来电来查阅属性,如在一个循环中,可以返回相同的值。

MSDN链接



文章来源: C# DateTime.Now precision