2010-12-27 17 views
2

Datetime.CompareTo()メソッドを使用して、Datetime変数を設定したDatetime変数と比較しようとしています。私はタイマーを使ってこれらを毎秒比較して結果を表示しますが、現在の時間が設定した時間に近づくにつれて、結果は1から-1に変わりますが、決して0ではないことを意味します。 Datetime構造にミリ秒が含まれていると思われますか?2つの日時変数はいつ等しいですか?

答えて

3

...これを試してみてください(もちろん、試験日を変更します)。

最も簡単な方法は、DateTimeを取得し、DateTime.Nowを減算することです。その後、TimeSpanになります。 TimeSpanのTotalSecondsプロパティが0の場合、その差は1秒未満です。

+2

TimeSpan.TotalSecondsはdoubleなので、== 0ではなく1.0未満をチェックする必要があります。 – Holstebroe

+2

DateTime構造体は* 100 *に正確ですが、 "Now"プロパティは実際には*正確* 64分の1秒。タイマーの精度*は、その精度*を反映する必要はありません。 –

+0

@エリック - あなたの洞察に感謝します。私はこれを認識しませんでしたが、Stopwatchクラスについて学ぶ前に、いくつかのタイミング問題を説明します。ちなみに、なぜNowプロパティは最初の場所でストップウォッチより精度が低く作られていますか? –

6

あなたは正しく疑わしいです。しかし、それはミリ秒よりも長くなる。最大解像度は"tick"で、100ナノ秒に相当します。

2

あなたの疑惑は正しいですか? DateTime構造最小単位は、012nsであり、単位は100nsです。

あなたがしたいことは、秒に等しいものがすべて等しいかどうかを確認してから、まずDateプロパティを比較し、次に時、分、秒のプロパティを比較して確認できます。個別に

1

秒と比較するより正確です。シナリオでは、「エラー範囲」を定義することができます。 2つの間の隙間が1秒未満の場合は、(プログラム内で)同じとみなされます。

1

は、他のは、ここで述べたように、解像度が100nsのある

 DateTime d1 = new DateTime(2011, 12, 27, 4, 37, 17); 
     DateTime d2 = DateTime.Now; 

     if (d1.Subtract(d2).Seconds <= 1) 
     { 
      //consider these DateTimes equal... continue 
     } 
+4

違いが同様に正確に1分、1時間などの場合は実際には、秒は0になります。 TotalSecondsを使用する必要があります。 –

+0

うわー!良いキャッチ。 – Flipster

0

私は正確な値ではなく、正確な値ではなく値の範囲でDatetime(とdouble)を比較することをお勧めします。

DateTime d1 = new DateTime(2011, 12, 27, 4, 37, 17); 
    DateTime d2 = DateTime.Now; 

    if ((d2 >= d1) && (d2 <= d1.AddMinutes(1))) 
     .... 
0
'simulate comparison of two datetimes 
    d1 = DateTime.Now 
    Threading.Thread.Sleep(250) 
    d2 = DateTime.Now 

    'see if two dates are within a second of each other 
    Dim ts As Double = ((d2 - d1).TotalSeconds) 
    If ts < 1 Then 
     'equal 
     Debug.WriteLine("EQ " & ts.ToString("n4")) 
    Else 
     Debug.WriteLine("neq " & ts.ToString("n4")) 
    End If 
関連する問題