日期时间刻度减去刻度将导致第一次运行中出现负数

时间:2015-12-10 12:11:11

标签: c# datetime

我一直在尝试开发一个函数来确定SQL数据库的日期在哪一天将条目限制为仅限于“星期六”。为了解决这个问题,我决定在C#中进行一些手动计算来开发一个有效的算法,但是偶然遇到了一些奇怪的东西。

我决定从Ticks返回的DateTime.Now中减去Ticks返回的DateTime.Now.TimeOfDay,我期望在一个有争议的循环中找到一个固定数字,但我看到了第一个结果令人惊讶的是,其余的是相同的。为了检查这个问题,我将代码稍微调整了一下

   static void Main(string[] args)
    {
        while (true) {
            Console.WriteLine(DateTime.Now.Ticks - DateTime.Now.Ticks);
            Thread.Sleep(1000);
        }
    }

以下是输出:

enter image description here

由于DateTime.Now返回一个Struct,TimeSpan同样如此,并且考虑到Structs不可满足这一事实,我认为不会发生突变,但为什么会发生?这背后的原因是什么?

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是,偶然发生的是你正在读两次钟。有时您会设法读取时钟,然后时钟会改变,然后再次读取它。

第一次发生这种情况时,JITting可能会干扰。

您可以尝试使用此代码,看看它会发生很多事情:

while (true)
{
    var delta = DateTime.Now.Ticks - DateTime.Now.Ticks;
    if (delta != 0)
        Console.WriteLine(delta);
}

我机器上的一秒钟是1000万,所以350.000约为0.03秒。

它变成否定号码的原因是序列如下:

  1. 阅读时钟
  2. 再次读取时钟(这将与第一个相同,或略高)
  3. 从第一个
  4. 中减去第二个值

    由于您从较低或相等的值中减去大于或等于的值,您将得到0或负数。