2009-02-09 20 views

Respuesta

179

¿Estoy utilizando DateTime Comparar correctamente?

No. Compare solo ofrece información sobre la posición relativa de dos fechas: menos, igual o superior. Lo que queremos es algo como esto:

if ((expiryDate - DateTime.Now).TotalDays < 30) 
    matchFound = true; 

Esto resta dos DateTime s. El resultado es un objeto TimeSpan que tiene una propiedad TotalDays.

Además, el condicional se puede escribir directamente como:

matchFound = (expiryDate - DateTime.Now).TotalDays < 30; 

No se necesita if.

+2

se debe permitir que se dará 2+;) uno para la respuesta y uno para la manera breve de expresarlo – CheGueVerra

+4

Uh ... Acabo de hacer mi respuesta más larga así que siéntase libre de restar un voto imaginario. ;-) –

+1

Utilice ['TotalDays'] (http://msdn.microsoft.com/en-us/library/system.timespan.totaldays.aspx) en lugar de días. –

0

No, la función Compare devolverá 1, 0 o -1. 0 cuando los dos valores son iguales, -1 y 1 significan menos que y más que, creo en ese orden, pero a menudo los mezclo.

0

No, no lo está utilizando correctamente.

Ver here para más detalles.

DateTime t1 = new DateTime(100); 
DateTime t2 = new DateTime(20); 

if (DateTime.Compare(t1, t2) > 0) Console.WriteLine("t1 > t2"); 
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2"); 
if (DateTime.Compare(t1, t2) < 0) Console.WriteLine("t1 < t2"); 
5

probar este lugar

if ((expiryDate - DateTime.Now).TotalDays < 30) { 
    matchFound = true; 
} 
+1

Hmm, necesita invertir el orden de sus fechas o tomar el valor absoluto, a menos que la fecha de vencimiento ya haya pasado. –

+0

@Konrad, sí, leí la pregunta equivocada. Corregido – JaredPar

0

Lo que se quiere hacer es restar los dos DateTime (expiryDate y DateTime.Now). Esto devolverá un objeto de tipo TimeSpan. TimeSpan tiene una propiedad "Días". Compara ese número con 30 por tu respuesta.

0

No, no es correcto, intente esto:

DateTime expiryDate = DateTime.Now.AddDays(-31); 
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) 
{ 
    matchFound = true; 
} 
3

comparación de rentabilidad entre 1, 0, -1 para mayor que, igual a, menor que, respectivamente.

que desee:

if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
     bool matchFound = true; 
    } 
6

Bueno, yo lo haría esta forma:

TimeSpan diff = expiryDate - DateTime.Today; 
if (diff.Days > 30) 
    matchFound = true; 

comparar sólo responde con un tiempo que indica el primer número entero es anterior, igual o más tarde ...

12

debería ser

matchFound = (expiryDate - DateTime.Now).TotalDays < 30; 

nota el total de días lo contrario obtendrá un comportamiento werid

+0

¡esta respuesta fue más de un año después de la última edición de la respuesta aceptada! –

+0

@Mitch: esta es la respuesta correcta, observe que está usando TotalDays en lugar de Days. –

+0

La respuesta aceptada es correcta. TotalDays también devuelve una parte fraccional, que es redundante cuando se compara con un número entero. –

1

Esto le dará resultado preciso:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30) 
    matchFound = true; 
+0

En realidad, lo que sucede hr es, por ejemplo ,.expryDte es el 28/4/2011 si U rite (expiryDate-DateTime.ahora) tomará el tiempo también (28/4/2011 12:00:00 AM - 26/4/2011 11:47:00 AM) y el código anterior toma valor como 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 a.m. que dará la diferencia exacta. – Jayant

1

Compare es innecesaria, Días/TotalDays son innecesarios.

Todo lo que necesita es

if (expireDate < DateTime.Now) { 
    // has expired 
} else { 
    // not expired 
} 

nota que esto funcionará si decide utilizar minutos o meses o incluso años como sus criterios de caducidad.

+0

No es una gran respuesta porque ahora también estás factorizando en horas, minutos y segundos. DateTime.Today sería más correcto para la situación OPs. –

0

En realidad, ninguna de estas respuestas funcionó para mí. Lo resuelto haciendo de esta manera:

if ((expireDate.Date - DateTime.Now).Days > -30) 
    { 
    matchFound = true; 
    } 

cuando traté de hacer esto:

matchFound = (expiryDate - DateTime.Now).Days < 30; 

Hoy, 2011-11-14 y 2011-10-17 fue mi expiryDate tengo que matchFound = - 28. En lugar de 28. Invertí el último cheque.

0
// this isn't set up for good processing. 
//I don't know what data set has the expiration 
//dates of your accounts. I assume a list. 
// matchfound is a single variablethat returns true if any 1 record is expired. 

bool matchFound = false; 
      DateTime dateOfExpiration = DateTime.Today.AddDays(-30); 
      List<DateTime> accountExpireDates = new List<DateTime>(); 
      foreach (DateTime date in accountExpireDates) 
      { 
       if (DateTime.Compare(dateOfExpiration, date) != -1) 
       { 
        matchFound = true; 
      } 
      } 
+1

¿No es eso un poco complicado? – Max

+0

¿Dónde está la mención de accountExpireDates en la pregunta? Copias pegado una mala solución. MatchFound casi suena como si estuvieras mezclando Pattern o RegEx. Por cierto, necesitas romper cuando se encuentra una coincidencia o continúa en bucle. ¿Qué pasa si es -2? MSDN no dice que los valores posibles son -1, 0 y 1. – Mukus

0

Suponiendo que desea asignar false (si es aplicable) a matchtime, una manera más simple de la escritura sería ..

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30) ? true : false; 
Cuestiones relacionadas