“DateTime.Now - DateTimeNow.AddSecond(-1)”可以为零 [英] How can `DateTime.Now - DateTimeNow.AddSecond(-1)` be zero

查看:1219
本文介绍了“DateTime.Now - DateTimeNow.AddSecond(-1)”可以为零的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  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。小时* 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second)始终为 1 (但是我在 23:59:59 => 00:00:00 中应该写一个值)

解决方案

因为您的 DateTime.Now > dt2 变量,这就是为什么这个小小的差异是完全预期的。这意味着您的第二个 DateTime.Now 至少计算1 Tick ,最多1000万 Ticks (这是相等的至1秒)。



由于 DateTime.Second 属性 InternalTicks TicksPerSecond ,当 InternalTicks 小于 TicksPerSecond 在calcualte余数之后返回零 60

  public int Second 
{
get
{
return(int)((InternalTicks / TicksPerSecond)%60);
}
}

如果您使用相同的 DateTime 。$ / $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
DateTime dt1 = now;
DateTime dt2 = now.AddSeconds(-1);




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




让我们假设你的第一个 DateTime.Now (这是 dt1 )生成 00:00:00.00000 。第二个 DateTime.Now 生成 00:00:00.00002 (这些是理论值)和你的 dt2 将为 23:59:59.002



code>小时,分钟第二个值;

  dt1.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


I run below code in a console application:

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

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

And I thought (dt1 - dt2).Seconds is always 1 but as I saw it write many 0 in the output !!??

Why does (dt1 - dt2).Seconds become 0 ?


Then I try below code:

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());

And this new code say may (dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second) is always 1 (However I know in 23:59:59 => 00:00:00 it should write a value)

解决方案

Because you evaluate your DateTime.Now value again for your dt2 variable, that's why this little difference is completely expected. That means your second DateTime.Now calculated at least 1 Tick and at most 10 million Ticks (which is equal to 1 second) after the first one.

And since DateTime.Second property calculated with InternalTicks and TicksPerSecond, it returns zero when InternalTicks is less than TicksPerSecond value after calcualte remainder with 60.

public int Second
{
     get
     {
        return (int)((InternalTicks / TicksPerSecond) % 60); 
     }
} 

If you use same DateTime.Now value for both variable, that should be ok.

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

Why (dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second) is always 1?

Well, it is not always 1. Let's assume your first DateTime.Now (which is dt1) generates 00:00:00.00000. And second DateTime.Now generates 00:00:00.00002 (those are theoretical values) and your dt2 will be 23:59:59.002.

Let's look at the Hours, Minute and Second values;

dt1.Hour = 0;
dt2.Hour = 23;
dt1.Minute = 0;
dt2.Minute = 59;
dt1.Second = 0;
dt2.Second = 59;

And the result of dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second) will be -86399 not 1.

这篇关于“DateTime.Now - DateTimeNow.AddSecond(-1)”可以为零的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆