[英]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
. 并且由于使用InternalTicks
和TicksPerSecond
计算的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; 让我们看一下Hours
, Minute
和Second
值;
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.