在上图中,您可以看到start
和end
值相同。但是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;
}
答案 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();