Estou tentando descobrir se uma conta expira em menos de 30 dias. Estou usando a comparação DateTime corretamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Estou tentando descobrir se uma conta expira em menos de 30 dias. Estou usando a comparação DateTime corretamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Respostas:
Estou usando a comparação DateTime corretamente?
Não Compare
. Oferece apenas informações sobre a posição relativa de duas datas: menor, igual ou maior. O que você quer é algo assim:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Isso subtrai dois DateTime
s. O resultado é um TimeSpan
objeto que possui uma TotalDays
propriedade.
Além disso, a condicional pode ser escrita diretamente como:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Não é if
necessário.
TotalDays
vez de dias.
Days
é o maior componente do TimeSpan
. As pessoas que estão lendo isso podem extrapolar pensando que a Seconds
propriedade funciona da mesma maneira.
Days
ele próprio pode estar errado. Days
e TotalDays
são iguais aqui apenas porque a condição é < 30
, mas haveria uma diferença óbvia se fosse <= 30
, porque TotalDays
pode retornar algo como 30.421
while Days
ainda retorna 30
.
deveria estar
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
anote o total de dias, caso contrário, você obterá um comportamento werid
TotalDays
é o campo conceitualmente correto a ser usado. Na prática, eles dão o mesmo resultado, mas apenas porque Days
é o maior componente de TimeSpan
, se houvesse um componente Meses ou Anos e isso teria sido uma história diferente. Apenas tente com Hours
, Seconds
ou Milliseconds
para ver como eles funcionam.
Em vez disso, tente isso
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Compare retorna 1, 0, -1 para maior que, igual a, menor que, respectivamente.
Você quer:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Isso lhe dará um resultado preciso:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Comparar é desnecessário, Dias / TotalDays são desnecessários.
Tudo o que você precisa é
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
observe que isso funcionará se você decidir usar minutos ou meses ou mesmo anos como seu critério de expiração.
Supondo que você queira atribuir false
(se aplicável) a matchtime
, uma maneira mais simples de escrever seria ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Não, a função Comparar retornará 1, 0 ou -1. 0 quando os dois valores são iguais, -1 e 1 significam menor e maior, acredito nessa ordem, mas costumo confundi-los.
Não, você não está usando corretamente.
Veja aqui os detalhes.
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");
Na verdade, nenhuma dessas respostas funcionou para mim. Eu resolvi isso fazendo assim:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Quando tentei fazer isso:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Hoje, 2011-11-14 e minha expiryDate foi 2011-10-17, recebi esse matchFound = -28. Em vez de 28. Então, inverti a última verificação.
// 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;
}
}