System.DateTime.Now给出了错误的结果

时间:2013-03-13 11:43:08

标签: c# .net .net-2.0

实用工具的主要逻辑是这样的函数:

private void Run()
{
    DateTime startTime = DateTime.Now;
    Prepare();
    Search();
    Process();
    DateTime endTime = DateTime.Now;
    TimeSpan duration = endTime.Subtract(startTime);
    Console.WriteLine("Run took {0:00}:{1:00}:{2:00}",
        (int)duration.TotalHours, duration.Minutes, duration.Seconds);
}

当我运行这个时,我可以亲眼看到它需要至少5秒钟(Process()方法喷出控制台输出,我可以观察到发生了5-6秒)。但它报告“Run run 00:00:01”。

我不希望时间有微秒精度,但为什么它在这里完全不准确?

更新 根据建议,我在同一时期运行了StopWatch,并与减去两个DateTime进行了比较,并调试了代码。这两种方法同意一小部分......调试器中的StopWatch有1139毫秒。我的假设是,不知何时写入控制台的时间不包括在内但我没办法支持它(或反驳它)。

5 个答案:

答案 0 :(得分:2)

为了对你所看到的真实情况充满信心,请为测试而写:

DateTime startTime = DateTime.Now;
Thread.Sleep(5000);
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime.Subtract(startTime);
Console.WriteLine("Run took {0:00}:{1:00}:{2:00}",
        (int)duration.TotalHours, duration.Minutes, duration.Seconds);

此外,最好将Stopwatch课程用于您的目的

答案 1 :(得分:2)

我怀疑问题出在DateTime。可能,程序完成并将输出发送到控制台缓冲区,这实际上是显示它的甜蜜时间。你看到的是输出滞后。

答案 2 :(得分:1)

为什么不使用秒表?

Stopwatch ss = new Stopwatch();
ss.Start();
// Some quantity of work..... 
ss.Stop();

Console.WriteLine("Elapsed time: {0}", ss.Elapsed.TotalMilliseconds);

答案 3 :(得分:0)

对于这种测量,DateTime不是很准确。你应该使用秒表类。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

答案 4 :(得分:0)

DateTime startTime = DateTime.Now;
Thread.Sleep(5000);
DateTime endTime = DateTime.Now;
TimeSpan duration = endTime.Subtract(startTime);
Console.WriteLine(duration.Seconds);

打印“5”。你确定你的测试用例是什么吗?