DateTime.UtcNow会在同一方法中返回不同的值吗?

时间:2017-06-06 15:02:57

标签: c# .net

假设我在单个方法中对DateTime.UtcNow的两次调用之间有一个很长的简单数学循环。

如果两者之间的代码超过系统的计时器分辨率(例如10毫秒),DateTime.UtcNow是否会在同一方法中返回两个不同的值?

通过扩展,是否有可能,如果代码在日期转换为新的一天时正常运行,那么DateTime.UtcNow.Date将在同一方法中产生两个不同的日期?

4 个答案:

答案 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)。

运行代码需要时间和时间才能返回。所以是的,即使在相同的功能中它也会改变。