DateTime.Compare(开始,结束)在我的系统中产生了结果

时间:2015-11-26 09:25:49

标签: c#

enter image description here

在上图中,您可以看到startend值相同。但是compare方法返回-1,表示开始时间小于结束时间。这怎么可能?

我在控制台应用程序中尝试过样本值来测试comapre方法,&它的工作正常。我想这里可能是datetime对象的内部值不匹配。但无法找到。

以下是代码。

DateTime start = Convert.ToDateTime(pi.StartTime), end = Convert.ToDateTime(pi.EndTime);

int t1 = DateTime.Compare(start, end);

if (t1 == 0)
{
     MessageBox.Show("Start Time and End Time are same.");
     return;
}
else if (t1 == 1)
{
     MessageBox.Show("Start Time is greater then end time.");
     return;
}

4 个答案:

答案 0 :(得分:4)

我建议与容忍进行比较,例如修剪毫秒

int t1 = DateTime.Compare(
  new DateTime(start.Ticks - (start.Ticks % TimeSpan.TicksPerSecond), start.Kind),
  new DateTime(end.Ticks - (end.Ticks % TimeSpan.TicksPerSecond), end.Kind));

答案 1 :(得分:2)

  

在发布问题之后,我检查了每个属性,发现有127毫秒的差异。哇!然后我将我的系统日期时间转换为字符串,然后再次转换为datetime(因为毫秒变为0)。所以现在一切正常。所以我正在做什么呢?

没有。通过转换,您不会传达意图。阅读代码的人不会理解你为什么这样做。

更好的方法是:

var difference = date1.Substract(date2).TotalSeconds;
return Math.Abs(difference) < 1;

因为那时你在代码中显示你接受一个小差异(你允许的差异有多大)。

答案 2 :(得分:1)

来自MSDN

  

比较两个DateTime实例并返回一个整数   指示第一个实例是否早于,等于或   晚于第二个实例。

然后它说:

  

为确定t1与t2的关系,Compare方法进行比较   t1和t2的Ticks属性但忽略了它们的Kind属性。   在比较DateTime对象之前,请确保对象表示   在同一时区的时间。

这就是为什么你有这个结果:这是一个例子:

修改:

using System;

public class Example
{
   public static void Main()
   {
      DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
        DateTime date2 = new DateTime(2009, 8, 1, 0, 0, 0);

        date2 = date2.AddMilliseconds(2);

        int result = DateTime.Compare(date1, date2);
        string relationship;

        if (result < 0)
            relationship = "is earlier than";
        else if (result == 0)
            relationship = "is the same time as";
        else
            relationship = "is later than";

        Console.WriteLine("{0} {1} {2}", date1, relationship, date2);
   }
}
// The example displays the following output:
//    8/1/2009 12:00:00 AM is earlier than 8/1/2009 12:00:00 AM

希望有所帮助。

答案 3 :(得分:1)

你可以比较

DateTime.Compare(
    start.AddMilliseconds(-start.Millisecond), 
    end.AddMilliseconds(-end.Millisecond)
); 

甚至更好的扩展方法

DateTime.Compare(start.TrimMilliseconds(), stop.TrimMilliseconds())

public static class DateTimeExtensions
{
    public static DateTime TrimMilliseconds(this DateTime date)
    {
        return date.AddMilliseconds(-date.Millisecond);
    }
}

请注意,DateTime值是不可变的,因此您要比较两个不同的DateTime值。开始和结束不会被修改,但仍然不同。您可以通过在分配期间修剪毫秒来避免这种情况

var start = DateTime.Now.TrimMilliseconds();