Sto cercando di capire se un account scade tra meno di 30 giorni. Sto usando DateTime Compare correttamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Sto cercando di capire se un account scade tra meno di 30 giorni. Sto usando DateTime Compare correttamente?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Risposte:
Sto usando DateTime Compare correttamente?
No. Compareoffre solo informazioni sulla posizione relativa di due date: minore, uguale o maggiore. Quello che vuoi è qualcosa del genere:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Questo sottrae due DateTimes. Il risultato è un TimeSpanoggetto che ha una TotalDaysproprietà.
Inoltre, il condizionale può essere scritto direttamente come:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Non è ifnecessario.
TotalDaysposto dei giorni.
Daysè il componente più grande di TimeSpan. Le persone che leggono questo possono estrapolare che pensano che la Secondsproprietà funzioni allo stesso modo.
Daysse stesso può sbagliare. Dayse TotalDayssono gli stessi qui solo perché la condizione è < 30, ma ci sarebbe un'ovvia differenza se lo fosse <= 30, perché TotalDayspotrebbe restituire qualcosa di simile 30.421mentre Daysritorna ancora 30.
dovrebbe essere
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
annota il numero totale di giorni altrimenti otterrai un comportamento errato
TotalDaysè un campo concettualmente corretto da usare. In pratica danno lo stesso risultato ma solo perché Daysè la componente più grande di TimeSpan, se ci fosse stata una componente Mesi o Anni e questa sarebbe stata una storia diversa. Basta provare con Hours, Secondso Millisecondsper vedere come funzionano.
Prova questo invece
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Confronta restituisce 1, 0, -1 rispettivamente per maggiore, uguale a, minore di.
Tu vuoi:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Questo ti darà risultati accurati:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Il confronto non è necessario, i giorni / i giorni totali non sono necessari.
Tutto ciò che serve è
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
nota che questo funzionerà se decidi di utilizzare minuti o mesi o addirittura anni come criteri di scadenza.
Supponendo che tu voglia assegnare false(se applicabile) a matchtime, un modo più semplice di scrivere sarebbe ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
No, la funzione Confronta restituirà 1, 0 o -1. 0 quando i due valori sono uguali, -1 e 1 significano minore e maggiore di, credo in quest'ordine, ma spesso li confondo.
No, non lo stai usando correttamente.
Vedi qui per i dettagli.
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");
In realtà nessuna di queste risposte ha funzionato per me. L'ho risolto in questo modo:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Quando ho provato a farlo:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Oggi, 2011-11-14 e la mia data di scadenza era 2011-10-17 ho ottenuto quella corrispondenzaTrovato = -28. Invece di 28. Quindi ho invertito l'ultimo controllo.
// 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;
}
}