我一直在尝试开发一个函数来确定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);
}
}
以下是输出:
由于DateTime.Now
返回一个Struct,TimeSpan
同样如此,并且考虑到Structs不可满足这一事实,我认为不会发生突变,但为什么会发生?这背后的原因是什么?
答案 0 :(得分:1)
发生这种情况的原因是,偶然发生的是你正在读两次钟。有时您会设法读取时钟,然后时钟会改变,然后再次读取它。
第一次发生这种情况时,JITting可能会干扰。
您可以尝试使用此代码,看看它会发生很多事情:
while (true)
{
var delta = DateTime.Now.Ticks - DateTime.Now.Ticks;
if (delta != 0)
Console.WriteLine(delta);
}
我机器上的一秒钟是1000万,所以350.000约为0.03秒。
它变成否定号码的原因是序列如下:
由于您从较低或相等的值中减去大于或等于的值,您将得到0或负数。