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 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 doTimeSpan
. As pessoas que estão lendo isso podem extrapolar pensando que aSeconds
propriedade funciona da mesma maneira.Days
ele próprio pode estar errado.Days
eTotalDays
são iguais aqui apenas porque a condição é< 30
, mas haveria uma diferença óbvia se fosse<= 30
, porqueTotalDays
pode retornar algo como30.421
whileDays
ainda retorna30
.deveria estar
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
anote o total de dias, caso contrário, você obterá um comportamento werid
fonte
TotalDays
é o campo conceitualmente correto a ser usado. Na prática, eles dão o mesmo resultado, mas apenas porqueDays
é o maior componente deTimeSpan
, se houvesse um componente Meses ou Anos e isso teria sido uma história diferente. Apenas tente comHours
,Seconds
ouMilliseconds
para ver como eles funcionam.Bem, eu faria assim em vez disso:
TimeSpan diff = expiryDate - DateTime.Today; if (diff.Days > 30) matchFound = true;
Compare apenas responde com um número inteiro indicando se o primeiro é anterior, igual ou posterior ...
fonte
Em vez disso, tente isso
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { matchFound = true; }
fonte
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; }
fonte
Isso lhe dará um resultado preciso:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30) matchFound = true;
fonte
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.
fonte
Supondo que você queira atribuir
false
(se aplicável) amatchtime
, uma maneira mais simples de escrever seria ..matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
fonte
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.
fonte
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");
fonte
O que você quer fazer é subtrair os dois DateTimes (expiryDate e DateTime.Now). Isso retornará um objeto do tipo TimeSpan. O TimeSpan possui uma propriedade "Dias". Compare esse número com 30 para sua resposta.
fonte
Não, não está correto, tente isto:
DateTime expiryDate = DateTime.Now.AddDays(-31); if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) { matchFound = true; }
fonte
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.
fonte
// 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; } }
fonte
Você pode tentar fazer assim:
var daysPassed = (DateTime.UtcNow - expiryDate).Days; if (daysPassed > 30) { // ... }
fonte