C#无法正确比较两个日期时间

时间:2014-07-14 17:42:11

标签: c# datetime compare

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

3 个答案:

答案 0 :(得分:5)

DateTime的分辨率低至刻度,即使默认情况下它们在大多数文化中仅打印秒。

如果您为dt1.ToString("o")打印dt2和相同,您会看到即使它们等于第二个,它们也可能会以亚秒级数量变化。这就解释了为什么您当前的代码可以打印“不同”,但仍然会为接下来的两行打印相同的值。

答案 1 :(得分:2)

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()调用以获得不能为负的绝对时间跨度。请注意,您不应该将此方法用于类似警报的事情,您的系统可能会暂时冻结(由于多种可能性)并且您会错过它。

答案 2 :(得分:1)

您当前的比较会比较两个DateTime对象的Ticks。如果你想比较小时,分钟和秒,那么请检查如下:

if (dt1.TimeOfDay.Hours == dt2.TimeOfDay.Hours && 
    dt1.TimeOfDay.Minutes == dt2.TimeOfDay.Minutes &&
    dt1.TimeOfDay.Seconds == dt2.TimeOfDay.Seconds)
相关问题