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

c#不能正确地比较两个日期时间

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)