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

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

通过扩展,是否有可能,如果代码在日期变为新日期的那一刻正确运行,那么DateTime.UtcNow.Date会在同一方法内导致两个不同的日期吗?

最佳答案

为什么不进行实验?

  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毫秒才能完成,则DateTime.UtcNow将明确返回不同的值:

  DateTime t1 = DateTime.UtcNow;

  // 10 ms routine here
  DoSomething();

  // t1 != t2; t2 ~ t1.AddMilliseconds(10)
  DateTime t2 = DateTime.UtcNow;


有些PC没有High Resilution Timer Stopwatch.IsHighResolution的可能性很小。在这种情况下,分辨率下降到3600 / 65536 * 1000 = 55毫秒(系统计时器分辨率-65536每小时滴答),并且t1t2很有可能会相同

关于c# - DateTime.UtcNow是否将在同一方法中返回不同的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44393542/

10-08 23:28