Question

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

Je ne ont besoin d'un niveau de tolérance de millisecondes ou secondes.

Comment cela peut-il être fait?

Était-ce utile?

La solution

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 le valeur absolue de cette période est à 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 requête 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). Prenez note cependant, que la résolution de DateTime est de 1 Encoche = 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)

Autres conseils

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 des problèmes sur les machines avec différents paramètres régionaux que le vôtre.

En général, si vous voulez un seul comparer à vous dire quelle date est moins, égale ou supérieure, l'utilisation DateTime.Compare (). Dans le cas contraire, 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))
  ...

TimeSpan pour votre contrôle de tolérance - TimeSpan est le type retourné de DateTimes soustracteurs:

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

Compare, CompareTo et Equals ne prendront pas une tolérance pour la comparaison, ne peut donc pas utilisé de cette façon.

D'autres options sont à créer de nouveaux DateTimes de ceux existants, en rejetant l'exactitude indésirables et à comparer les nouveaux:

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top