这是.net DateTime.Compare函数中的错误吗?

时间:2012-09-20 10:11:49

标签: .net vb.net

我有一个带有两个DateTimePicker控件的表单

DateTime.Compare如果它们具有相同的值,则应返回0,但它认为它们不相同:

?DateTime.Compare(DatePicker.dtpFrom.Value, DatePicker.dtpTo.Value)
1

?datepicker.dtpFrom.Value
#9/20/2012 7:00:46 PM#

?DatePicker.dtpTo.Value
#9/20/2012 7:00:46 PM#

我不知道怎么想不清楚?当然,这不是.NET Framework中的一些错误。

更新 好的,我检查了毫秒值,它们都关闭了(非常轻微)。新奇!我想这与构造控件并设置其默认值时的一些微妙延迟有关。

?DatePicker.dtpTo.value.ToString("fff")
"616"
?datepicker.dtpFrom.Value.ToString("fff")
"619"

我只关心日期部分,所以我解决了它:

If DateTime.Compare(DatePicker.dtpFrom.Value.Date, DatePicker.dtpTo.Value.Date) > 0 Then
                MsgBox("From_Date cannot be after To_Date", MsgBoxStyle.OkOnly, "Data validation error")

2 个答案:

答案 0 :(得分:3)

您要检查.Net documentation on DateTime.Compare,值为1意味着dtpFrom.Value大于dtpTo。

我还建议日期之间有一两毫秒的差异,因为即使到第二天,它们也可能不一样。

我建议比较.ToString(“yyyy MM dd HH:mm:ss”)值以获得毫秒差异

<强>更新

除了评论之外,这里有一个更好的建议,即剥离毫秒

dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));

答案 1 :(得分:1)

比较多个DateTimePicker控件时要小心。即使没有用户编辑其默认值,其值的毫秒部分的微小差异也可能导致意外的比较结果。

例如,假设您的表单上有两个DateTimePicker控件:FromDate和ToDate,用于为报表建立日期范围。

如上面的问题所示,比较这两个值以确保FromDate不大于ToDate,可能会导致意外结果。

如果您只关心这些控件的Date部分,则可以通过读取Value属性上的Date属性来删除比较时的时间值。

If DateTime.Compare(dtpFrom.Value.Date), DateValue(dtpTo.Value.Date) > 0 Then
{invalid range error message}