2010-10-16 47 views
5

DateTime yöntemlerini kullanarak iki DateTime nesnesini .NET'te karşılaştırmayı merak ediyorum. Karşılaştırma yapmadan karşılaştırmalar Compare, CompareTo veya Equals.İki kez nasıl karşılaştırılır?

Sadece bir milisaniye veya saniye tolerans düzeyine ihtiyacım var.

Bu nasıl yapılabilir?

cevap

9

Bir DateTime ürününü, diğeri arasındaki zaman farkını temsil eden TimeSpan üretmek için çıkartabilirsiniz. Bu aralığın mutlak değeri'un istenilen tolerans içinde olup olmadığını test edebilirsiniz.

ilk DateTime diğerinden daha önceki bir zamana noktası temsil edemez biliyorsanız TimeSpan.Duration() çağrısı atlanabilir
bool dtsWithinASecOfEachOther = d1.Subtract(d2).Duration() <= TimeSpan.FromSeconds(1); 

, yani d1 >= d2.

karşılaştırma yöntemleri hakkındaki soruya cevap vermek için, DateTime.Compare(d1, d2) d1.CompareTo(d2) aynı sonucu üretir:

  • 0 onlar (d1.Equals(d2)d1 == d2) zamanında aynı noktayı temsil. Bununla birlikte, DateTime'ın çözünürlüğünün 1 tick = 100 nanoseconds = 10^-7 saniye olduğunu unutmayın. d1 d1, d2 önce kronolojik olarak en az 0 D2 (d1 > d2)
  • bir değerden sonra kronolojik ise 0'dan büyük
  • değeri (d1 < d2)
2

için tolerans kontrolü için kullanımı TimeSpan-TimeSpan olduğu çıkarılarak tarihsaat döndü tipi:

TimeSpan tolerance = new TimeSpan(0,0,1); 
return (date1 - date2) <= tolerance; 

Compare, CompareTo ve Equals karşılaştırma için bir tolerans sürmez, bu yüzden bu şekilde kullanılamaz. , Tek az olduğu tarih söylemek karşılaştırmak istiyorsanız, Genellikle

DateTime noSeconds1 = new DateTime(d1.Year, d1.Month, d1.Day, d1.Hour, d1.Minute, 0); 
DateTime noSeconds2 = new DateTime(d2.Year, d2.Month, d2.Day, d2.Hour, d2.Minute, 0); 

noSeconds1.Equals(noSeconds2); 
DateTime.Compare(noSeconds1, noSeconds2); 
noSeconds1.CompareTo(noSeconds2); 
2

:

Diğer seçenekler istenmeyen doğruluğunu atmadan ve yenilerini karşılaştırarak, mevcut olanlardan DateTime yeni oluşturmak için vardır eşit veya daha büyük, DateTime.Compare() kullanın. Aksi takdirde, DateTime.Equals() öğesini kullanabilirsiniz. Bir tolerans değeri ekleyin Birini diğerinden çıkarma ve bazı TimeSpan daha az olacak şekilde sonuçlanır karşılaştırın için:

// For seconds 
if (laterDate-earlierDate<=TimeSpan.FromSeconds(1)) 
    ... 

// For milliseconds 
if (laterDate-earlierDate<=TimeSpan.FromMilliseconds(1)) 
    ... 
2

Sen dizeye hem tarihsaat dönüştürmek ve elde dizeleri karşılaştırabilirsiniz. Farklı bölgesel ayarlara sahip makinelerdeki sorunları önlemek için dize formatını belirlediğinizden emin olun.