DateTime.UtcNow Not Change,为什么?

时间:2011-12-08 19:31:33

标签: .net windows utc systemtime

检查代码

        StringBuilder s = new StringBuilder();
        for (var i = 0; i < 100; i++)
        {
            TimeSpan t = (DateTime.UtcNow - new DateTime(2010, 1, 1));
            ulong timestamp = (ulong)(t.TotalMilliseconds * 100000000);
            s.Append("<li>" + timestamp.ToString());
        }

你会得到相同的结果100次,这意味着DateTime.UtcNow永远不会改变,即使我将毫秒乘以100000000次。

这里有人知道如何每次都获得新鲜的DateTime.UtcNow吗?

3 个答案:

答案 0 :(得分:3)

在这样一个紧凑的循环中,你很有可能获得相同的时间。

Ticks属性中的每个刻度表示100纳秒的切片。你的代码会比这更快地迭代。

答案 1 :(得分:0)

我只是将你的代码片段放在LinqPad中,并在for循环结束前添加t.TotalMilliseconds.Dump(),这是前几个结果:

61068982141.4911    
61068982143.9916    
61068982143.9916    
61068982144.4917    
61068982144.4917    
61068982144.4917    
61068982144.4917    
61068982144.9918    
61068982144.9918    
61068982144.9918    
61068982144.9918    
61068982145.4919    
61068982145.4919    
61068982145.4919    
61068982145.4919    
61068982145.992    
61068982145.992    
61068982145.992    
61068982145.992

循环执行得相当快,你在小数点后看到小数ms。

答案 2 :(得分:0)

最好的方法是使用System.Diagnostics.Stopwatch类来测量高分辨率的时间跨度。在大多数计算机上,默认时钟间隔为15.625 ms,这意味着在一个时钟间隔内,使用DateTime.UtcNow检索的两个时间戳的差异将为0. Stopwatch在可用时使用perf计数器(即在大多数PC上)分辨率通常小于1 us。有关详细信息,请参阅Time Span Measurement in Managed Code