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 usando DateTime Compare correctamente?
No. Compare
solo 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 DateTime
s. El resultado es un TimeSpan
objeto que tiene una TotalDays
propiedad.
Además, el condicional se puede escribir directamente como:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
No es if
necesario.
TotalDays
lugar de días.Days
es el componente más importante deTimeSpan
. Las personas que lean esto pueden extrapolarlo para pensar que laSeconds
propiedad funciona de la misma manera.Days
mismo también puede estar equivocado.Days
yTotalDays
son iguales aquí solo porque la condición es< 30
, pero habría una diferencia obvia si lo fuera<= 30
, porqueTotalDays
may devuelve algo como30.421
whileDays
still returns30
.debiera ser
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
tenga en cuenta el total de días, de lo contrario obtendrá un comportamiento horrible
fuente
TotalDays
es un campo conceptualmente correcto para usar. En la práctica, dan el mismo resultado, pero solo porqueDays
es el componente más grande deTimeSpan
, si hubiera habido un componente de meses o años y esto hubiera sido una historia diferente. Simplemente tratar conHours
,Seconds
oMilliseconds
para ver cómo funcionan.Bueno, lo haría así en su lugar:
TimeSpan diff = expiryDate - DateTime.Today; if (diff.Days > 30) matchFound = true;
Compare solo responde con un número entero que indica el tiempo, el primero es anterior, igual o posterior ...
fuente
Prueba esto en su lugar
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { matchFound = true; }
fuente
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; }
fuente
Esto le dará un resultado preciso:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30) matchFound = true;
fuente
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.
fuente
Suponiendo que desee asignar
false
(si corresponde) amatchtime
, una forma más sencilla de escribirlo sería ..matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
fuente
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.
fuente
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");
fuente
Lo que quiere hacer es restar los dos DateTimes (expiryDate y DateTime.Now). Esto devolverá un objeto de tipo TimeSpan. El TimeSpan tiene una propiedad "Días". Compare ese número con 30 para su respuesta.
fuente
No, no es correcto, intente esto:
DateTime expiryDate = DateTime.Now.AddDays(-31); if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) { matchFound = true; }
fuente
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.
fuente
// 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; } }
fuente
Puedes intentar hacer esto:
var daysPassed = (DateTime.UtcNow - expiryDate).Days; if (daysPassed > 30) { // ... }
fuente