`DateTime.Now - DateTimeNow.AddSecond(-1)`怎么能为零

时间:2015-04-09 06:05:12

标签: c# datetime

我在控制台应用程序中运行以下代码:

while (true)
{
    DateTime dt1 = DateTime.Now;
    DateTime dt2 = DateTime.Now.AddSeconds(-1);

    if ((dt1 - dt2).Seconds != 1)
        Console.Write((dt1 - dt2).Seconds.ToString());
}

我认为(dt1 - dt2).Seconds总是1但是我看到它在输出中写了很多0 !! ??

为什么(dt1 - dt2).Seconds成为0


然后我尝试下面的代码:

if ((dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second) != 1)
    Console.Write((dt1.Second - dt2.Second).ToString());

这个新代码可能(dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second)总是1(但我知道在23:59:59 => 00:00:00它应该写一个值)

2 个答案:

答案 0 :(得分:4)

因为您再次为DateTime.Now变量评估dt2值,这就是为什么这个小差异完全可以预料到的。这意味着您的第二个DateTime.Now在第一个Ticks之后计算出至少1 Tick和最多1000万InternalTicks(等于1秒)。

自从使用TicksPerSecondInternalTicks计算DateTime.Second property以来,TicksPerSecond60计算余数后public int Second { get { return (int)((InternalTicks / TicksPerSecond) % 60); } } 小于DateTime.Now时返回零}。

DateTime now = DateTime.Now;
DateTime dt1 = now;
DateTime dt2 = now.AddSeconds(-1);

如果对两个变量使用相同的1值,那应该没问题。

DateTime.Now
  

为什么(dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute   * 60 + dt1.Second - dt2.Second)总是1?

总是dt1。假设您的第一个00:00:00.00000DateTime.Now)生成00:00:00.00002。第二个dt2生成23:59:59.002(这些是理论值),Hours将生成Minute

让我们看看Seconddt1.Hour = 0; dt2.Hour = 23; dt1.Minute = 0; dt2.Minute = 59; dt1.Second = 0; dt2.Second = 59; dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second)值;

-86399

1的结果将是{{1}}而不是{{1}}。

答案 1 :(得分:3)

尝试这样做

 DateTime dt1 = DateTime.Now;
 DateTime dt2 = dt1.AddSeconds(-1);

当您访问DateTime.Now时,您已初始化了2个不同的时间戳(只需很短的一小部分时间)。