简体   繁体   English

DateTime.Now-DateTimeNow.AddSecond(-1)如何为零

[英]How can `DateTime.Now - DateTimeNow.AddSecond(-1)` be zero

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 !!?? 我以为(dt1 - dt2).Seconds始终为1但是正如我看到的那样,它在输出中写了许多0 !! ??

Why does (dt1 - dt2).Seconds become 0 ? 为什么(dt1 - dt2).Seconds变为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) 这个新代码说(dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second)始终为1 (但是我在23:59:59知道23:59:59 => 00:00:00它应该写一个值)

Because you evaluate your DateTime.Now value again for your dt2 variable, that's why this little difference is completely expected. 因为您再次评估dt2变量的DateTime.Now值,所以这就是完全可以预期的微小差异的原因。 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. 这意味着您的第二个DateTime.Now在第一个DateTime.Now计算了至少1个Tick ,并且最多计算了1000万个Ticks (等于1秒)。

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 . 并且由于使用InternalTicksTicksPerSecond计算的DateTime.Second属性 ,因此在InternalTicks余数小于60时,如果InternalTicks小于TicksPerSecond值,它将返回零。

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.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? 为什么(dt1.Hour * 3600-dt2.Hour * 3600 + dt1.Minute * 60-dt2.Minute * 60 + dt1.Second-dt2.Second)始终为1?

Well , it is not always 1 . 好吧 ,它并不总是1 Let's assume your first DateTime.Now (which is dt1 ) generates 00:00:00.00000 . 假设您的第一个DateTime.Now (即dt1 )生成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 . 然后第二个DateTime.Now生成00:00:00.00002 (这些是理论值),您的dt2将是23:59:59.002

Let's look at the Hours , Minute and Second values; 让我们看一下HoursMinuteSecond值;

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 . dt1.Hour * 3600 - dt2.Hour * 3600 + dt1.Minute * 60 - dt2.Minute * 60 + dt1.Second - dt2.Second)将是-86399而不是1

Try doing this 试试这个

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

You have initialized 2 different timestamps (which vary by a tiny fraction of time), when you accessed the DateTime.Now . 当您访问DateTime.Now时,您已经初始化了2个不同的时间戳(相差很小的时间)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM