2010-10-16 37 views
5

Me pregunto cómo comparar dos objetos DateTime en .NET usando los métodos DateTime Compare, CompareTo o Equals sin comparar los ticks.Cómo comparar dos fechas

Solo necesito un nivel de tolerancia de milisegundos o segundos.

¿Cómo se puede hacer esto?

Respuesta

9

Puede restar un DateTime de otro para producir un TimeSpan que representa la diferencia de tiempo entre ellos. Luego puede probar si el valor absoluto de este lapso está dentro de su tolerancia deseada.

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

La llamada a TimeSpan.Duration() se puede omitir si se sabe que la primera DateTime no puede representar a un punto anterior en el tiempo que el otro, es decir, d1 >= d2.

Para contestar a su pregunta sobre los métodos de comparación, DateTime.Compare(d1, d2) produce el mismo resultado que d1.CompareTo(d2):

  • 0 si representan el mismo punto en el tiempo (d1.Equals(d2), d1 == d2). Sin embargo, tenga en cuenta que la resolución de DateTime es 1 tick = 100 nanosegundos = 10^-7 segundos.
  • Un valor mayor que 0 si d1 es cronológicamente después d2 (d1 > d2)
  • Un valor inferior a 0 si d1 es cronológicamente antes d2 (d1 < d2)
2

Uso TimeSpan para su control de tolerancia - TimeSpan es el Tipo devuelto desde DateTime restando:

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

Compare, CompareTo y Equals no tomará una tolerancia para la comparación, por lo no se puede usar de esta manera.

Otras opciones son crear nueva DateTime s de los ya existentes, descartando la precisión no deseado y la comparación de los nuevos:

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 general, si quieres un simple Comparar decirle qué fecha es menor, igual o mayor, use DateTime.Compare(). De lo contrario, puede usar DateTime.Equals(). Para añadir un valor de tolerancia, se resta uno del otro y comparar resultar ser menor que algún TimeSpan:

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

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

podría convertir ambos DateTime a cuerda y comparar las cadenas resultantes. Asegúrese de definir el formato de cadena para evitar problemas en máquinas con configuraciones regionales diferentes a las suyas.