假设我在单个方法中对DateTime.UtcNow
的两次调用之间有一个很长的简单数学循环。
如果两者之间的代码超过系统的计时器分辨率(例如10毫秒),DateTime.UtcNow
是否会在同一方法中返回两个不同的值?
通过扩展,是否有可能,如果代码在日期转换为新的一天时正常运行,那么DateTime.UtcNow.Date
将在同一方法中产生两个不同的日期?
答案 0 :(得分:4)
DateTime.UtcNow
,也不会在方法开始时捕获其值。它在执行到达时进行评估,并在每次执行到达时进行评估。所以是的,如果函数需要足够长的时间,你将在两次执行之间达到不同的值。
答案 1 :(得分:4)
为什么不进行实验?
DateTime t1 = DateTime.UtcNow;
while (true) {
DateTime t2 = DateTime.UtcNow;
if (t2 != t1) {
Console.Write($"{(t2 - t1).TotalMilliseconds}");
break;
}
}
结果:
1.0001
因此,我的工作站DateTime.UtcNow
的分辨率 1 毫秒。如果该方法需要 10 ms完成,DateTime.UtcNow
将 definetely 返回不同的值:
DateTime t1 = DateTime.UtcNow;
// 10 ms routine here
DoSomething();
// t1 != t2; t2 ~ t1.AddMilliseconds(10)
DateTime t2 = DateTime.UtcNow;
某些PC没有高重新定时器 Stopwatch.IsHighResolution的可能性微乎其微;在这种情况下,分辨率降至3600 / 65536 * 1000 =
55 ms (系统计时器分辨率 - 每小时65536
个刻度)并且t1
和{{{ 1}}将是相同的
答案 2 :(得分:2)
总之一句:是的。
如果你想拥有相同的值,你需要先调用这个函数并将值存储在变量上,然后使用这个变量。
答案 3 :(得分:1)
是的,它将返回不同的值。
以下来自Microsoft:
获取一个DateTime对象,该对象在此计算机上设置为当前日期和时间,表示为协调世界时(UTC)。
运行代码需要时间和时间才能返回。所以是的,即使在相同的功能中它也会改变。