c#不能正确地比较两个日期时间
本文关键字:两个 日期 时间 不能 正确地 比较 | 更新日期: 2023-09-27 18:13:06
我是c#新手,我想写一个简单的控制台应用程序。我有两个日期时间,但是我不能得到Same
的消息,它一直打印Different
。
我还在控制台中打印两个日期时间,以了解它们是否不同,但即使系统时间相同,它也不满足条件。
static void Main(string[] args)
{
while (true)
{
Thread.Sleep(1000);
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Parse("06:30:00 AM");
if (TimeSpan.Compare(dt1.TimeOfDay, dt2.TimeOfDay) == 0)
{
Console.WriteLine("Same");
}
else
{
Console.WriteLine("Different");
}
Console.WriteLine(dt1);
Console.WriteLine(dt2);
}
}
DateTime
具有精确到刻度的分辨率,尽管在大多数文化中,默认情况下它们仅以打印到秒。
如果您打印dt1.ToString("o")
和dt2
,您将看到,即使它们等于秒,它们也可能以次秒的数量变化。这就解释了为什么当前代码可以打印"different",但接下来的两行仍然打印相同的值。
DateTime
具有比秒更高的精度,它基于滴答,其中每个滴答是100纳秒。因此,即使DateTime.Now
在小时,分钟和秒中匹配,它也会在滴答声中偏离。
你最好使用>
或<
当你试图比较。或者做(a - b) < some timespan
!比如:
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Parse("06:30:00 AM");
bool matches = ( dt2 - dt1 ).Duration() < TimeSpan.FromMilliseconds( 100 ); // matches if dt1 and dt2 are within 0.1s
需要.Duration()
调用来获得不能为负的绝对时间跨度。请注意,您永远不应该将此方法用于诸如警报之类的事情,您的系统可能会短暂冻结(由于多种可能性),并且您会错过它。
您当前的比较将比较两个DateTime
对象的Ticks。如果你想比较小时,分钟和秒,然后有一个检查:
if (dt1.TimeOfDay.Hours == dt2.TimeOfDay.Hours &&
dt1.TimeOfDay.Minutes == dt2.TimeOfDay.Minutes &&
dt1.TimeOfDay.Seconds == dt2.TimeOfDay.Seconds)