2010-10-16 21 views
5

Je me demande comment comparer deux objets DateTime dans .NET en utilisant les méthodes DateTime Compare, CompareTo ou Equals sans comparer les ticks.Comment comparer deux dates

Je n'ai besoin que d'un niveau de tolérance de quelques millisecondes ou secondes.

Comment cela peut-il être fait?

Répondre

9

Vous pouvez soustraire un DateTime d'un autre pour produire un TimeSpan qui représente la différence de temps entre eux. Vous pouvez ensuite tester si la valeur absolue de cet intervalle est dans votre tolérance souhaitée.

bool dtsWithinASecOfEachOther = d1.Subtract(d2).Duration() <= TimeSpan.FromSeconds(1); 

L'appel à TimeSpan.Duration() peut être omis si vous savez que le premier DateTime ne peut pas représenter un point plus tôt dans le temps que l'autre, à savoir d1 >= d2.

Pour répondre à votre question sur les méthodes de comparaison, DateTime.Compare(d1, d2) produit le même résultat que d1.CompareTo(d2):

  • 0 si elles représentent le même point dans le temps (d1.Equals(d2), d1 == d2). Notez cependant que la résolution de DateTime est 1 tick = 100 nanosecondes = 10^-7 secondes.
  • Une valeur supérieure à 0 si d1 est chronologiquement après d2 (d1 > d2)
  • Une valeur inférieure à 0 si d1 est chronologiquement avant d2 (d1 < d2)
2

Utilisation TimeSpan pour la vérification des tolérances - TimeSpan est le type retourné de DateTimes soustracteurs:

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

Compare, CompareTo et Equals ne prendra pas une tolérance pour la comparaison, si ne peut pas être utilisé de cette façon.

D'autres options sont à créer de nouvelles DateTime s de ceux existants, en rejetant l'exactitude indésirables et en comparant les nouvelles:

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

En général, si vous voulez un seul comparer à vous dire quelle date est moins, égal ou supérieur, utilisez DateTime.Compare(). Sinon, vous pouvez utiliser DateTime.Equals(). Pour ajouter une valeur de tolérance, soustraire l'un de l'autre et comparer les résultats à moins que certains TimeSpan:

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

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

Vous pouvez convertir les deux DateTimes à cordes et comparer les chaînes résultantes. Assurez-vous de définir le format de chaîne pour éviter les problèmes sur les machines ayant des paramètres régionaux différents des vôtres.