Estoy tratando de averiguar si una cuenta vence en menos de 30 días. ¿Estoy usando DateTime Compare correctamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Estoy tratando de averiguar si una cuenta vence en menos de 30 días. ¿Estoy usando DateTime Compare correctamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Respuestas:
¿Estoy usando DateTime Compare correctamente?
No. Comparesolo ofrece información sobre la posición relativa de dos fechas: menor, igual o mayor. Lo que quieres es algo como esto:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Esto resta dos DateTimes. El resultado es un TimeSpanobjeto que tiene una TotalDayspropiedad.
Además, el condicional se puede escribir directamente como:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
No es ifnecesario.
TotalDayslugar de días.
Dayses el componente más importante de TimeSpan. Las personas que lean esto pueden extrapolarlo para pensar que la Secondspropiedad funciona de la misma manera.
Daysmismo también puede estar equivocado. Daysy TotalDaysson iguales aquí solo porque la condición es < 30, pero habría una diferencia obvia si lo fuera <= 30, porque TotalDaysmay devuelve algo como 30.421while Daysstill returns 30.
debiera ser
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
tenga en cuenta el total de días, de lo contrario obtendrá un comportamiento horrible
TotalDayses un campo conceptualmente correcto para usar. En la práctica, dan el mismo resultado, pero solo porque Dayses el componente más grande de TimeSpan, si hubiera habido un componente de meses o años y esto hubiera sido una historia diferente. Simplemente tratar con Hours, Secondso Millisecondspara ver cómo funcionan.
Prueba esto en su lugar
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Compare devuelve 1, 0, -1 para mayor que, igual a, menor que, respectivamente.
Usted quiere:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Esto le dará un resultado preciso:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
La comparación es innecesaria, los días / días totales son innecesarios.
Todo lo que necesitas es
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
tenga en cuenta que esto funcionará si decide utilizar minutos, meses o incluso años como criterio de caducidad.
Suponiendo que desee asignar false(si corresponde) a matchtime, una forma más sencilla de escribirlo sería ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
No, la función Comparar devolverá 1, 0 o -1. 0 cuando los dos valores son iguales, -1 y 1 significan menor que y mayor que, creo en ese orden, pero a menudo los mezclo.
No, no lo estás usando correctamente.
Consulte aquí para obtener 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");
En realidad, ninguna de estas respuestas funcionó para mí. Lo resolví haciendo así:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Cuando intenté hacer esto:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Hoy, 2011-11-14 y mi fecha de vencimiento fue 2011-10-17 obtuve ese matchFound = -28. En lugar de 28. Así que invertí el último cheque.
// 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;
}
}