3

2 つの 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 のバグではありません。

UPDATE OKミリ秒の値を確認しましたが、オフになっています(ごくわずかです)。風変わりな!コントロールが構築され、デフォルト値が設定されるときの微妙な遅延に関係していると思います。

?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 より大きいことを意味します。

また、日付の間には 1 ~ 2 ミリ秒の違いがあることをお勧めします。

.ToString("yyyy MM dd HH:mm:ss") 値を比較して、ミリ秒の違いを回避することをお勧めします

アップデート

コメントに加えて、ミリ秒を取り除くためのより良い提案があります

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

于 2012-09-20T10:17:29.553 に答える
1

複数の DateTimePicker コントロールを比較する場合は注意してください。ユーザーがデフォルト値を編集していない場合でも、値のミリ秒部分のわずかな違いにより、予期しない比較結果が生じる可能性があります。

たとえば、フォームに FromDate と ToDate の 2 つの DateTimePicker コントロールがあり、レポートの日付範囲を設定するために使用されるとします。

上記の質問が示すように、FromDate が ToDate よりも大きくないことを確認するために 2 つの値を比較すると、予期しない結果になる可能性があります。

これらのコントロールの 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 に答える