短暂连续多次致电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()); }
答案 0 :(得分:2)
不幸的是,你无法通过DateTime实现目标。
在最好的情况下, DateTime.UtcNow
准确度约为15-16毫秒。
可能WinApi可以帮助您(自Windows 8和Windows Server 2012以来)。有关详细信息,请参阅this article。