我在控制台应用程序中运行以下代码:
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
它应该写一个值)
答案 0 :(得分:4)
因为您再次为DateTime.Now
变量评估dt2
值,这就是为什么这个小差异完全可以预料到的。这意味着您的第二个DateTime.Now
在第一个Ticks
之后计算出至少1 Tick
和最多1000万InternalTicks
(等于1秒)。
自从使用TicksPerSecond
和InternalTicks
计算DateTime.Second
property以来,TicksPerSecond
在60
计算余数后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.00000
(DateTime.Now
)生成00:00:00.00002
。第二个dt2
生成23:59:59.002
(这些是理论值),Hours
将生成Minute
。
让我们看看Second
,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
的结果将是{{1}}而不是{{1}}。
答案 1 :(得分:3)
尝试这样做
DateTime dt1 = DateTime.Now;
DateTime dt2 = dt1.AddSeconds(-1);
当您访问DateTime.Now
时,您已初始化了2个不同的时间戳(只需很短的一小部分时间)。