如何保证调用DateTime.UtcNow两次将在.NET中给出两个不同的时间

时间:2017-01-07 16:44:49

标签: c# .net datetime

短暂连续多次致电DateTime.UtcNow时,有没有办法保证它会返回两次不同的时间,后续的通话会有不断增加的值?

我更关注精确度而不是准确性,这不是计时器问题(也就是说,我没有尝试计算时间有多长,我只是想得到2+"当前"但唯一的DateTimes)。

问题示例:以下代码将多次重复相同的Ticks值,并且每15-30ms只会增加一次,具体取决于计算机的速度。

for(int i = 0; i < 1000; i++) { Console.WriteLine(DateTime.UtcNow.Ticks); }

现在我正在做以下事情,但对于让当前时间达到高精度 - 特别是睡眠(1)这样简单的事情来说似乎有点过头了。有没有更好的方法,这是否符合我原来的问题?虽然在统计上我不太可能在Ticks级别获得重复值,但我不确定这可以保证我的值不断增加,因为我的时钟可能被时间服务器重置,闰秒,或其他我可能没想到的问题。由于我使用UTC,因此夏令时不应成为问题。

private static DateTime prevDateTime = DateTime.UtcNow;
private static object nowLock = new object();
public static DateTime Now()
{
    lock(nowLock)
    {
        DateTime now = DateTime.UtcNow;
        if (now <= prevDateTime)
        {
            System.Threading.Thread.Sleep(1);
            now = DateTime.UtcNow;
        }
        prevDateTime = now;
        return now;
    }
}

// then call
for(int i = 0; i < 1000; i++) { Console.WriteLine(Now()); }

1 个答案:

答案 0 :(得分:2)

不幸的是,你无法通过DateTime实现目标。

在最好的情况下,

DateTime.UtcNow准确度约为15-16毫秒。

可能WinApi可以帮助您(自Windows 8和Windows Server 2012以来)。有关详细信息,请参阅this article