3

我有一个带有两个 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")
4

2 回答 2

3

您想查看有关 DateTime.Compare 的 .Net 文档,值为 1 表示 dtpFrom.Value 大于 dtpTo。

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

我建议比较 .ToString("yyyy MM dd HH:mm:ss") 值来解决毫秒差异

更新

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

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

于 2012-09-20T10:17:29.553 回答
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}
于 2012-09-20T10:14:48.720 回答