J'essaie de déterminer si un compte expire dans moins de 30 jours. Est-ce que j'utilise correctement DateTime Compare?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
J'essaie de déterminer si un compte expire dans moins de 30 jours. Est-ce que j'utilise correctement DateTime Compare?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Réponses:
Est-ce que j'utilise correctement DateTime Compare?
Non, Comparen'offre que des informations sur la position relative de deux dates: inférieure, égale ou supérieure. Ce que vous voulez, c'est quelque chose comme ceci:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Cela soustrait deux DateTimes. Le résultat est un TimeSpanobjet qui a une TotalDayspropriété.
De plus, le conditionnel peut être écrit directement comme:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Pas ifbesoin.
TotalDaysau lieu de jours.
Daysc'est le plus gros composant de TimeSpan. Les personnes lisant ceci peuvent extrapoler cela pour penser que la Secondspropriété fonctionne de la même manière.
Dayslui - même peut se tromper. Dayset TotalDayssont les mêmes ici uniquement parce que la condition est < 30, mais il y aurait une différence évidente si c'était le cas <= 30, car TotalDayspeut renvoyer quelque chose comme 30.421tandis que Daysrenvoie encore 30.
devrait être
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
notez le nombre total de jours sinon vous aurez un comportement werid
TotalDaysest un champ conceptuellement correct à utiliser. Dans la pratique, ils donnent le même résultat, mais uniquement parce que Daysc'est la plus grande composante de TimeSpan, s'il y avait eu une composante Mois ou Années et cela aurait été une autre histoire. Juste essayer avec Hours, Secondsou Millisecondspour voir comment ils fonctionnent.
Essayez plutôt ceci
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Cela vous donnera un résultat précis:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Comparer n'est pas nécessaire, Days / TotalDays sont inutiles.
Tout ce dont tu as besoin c'est
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
notez que cela fonctionnera si vous décidez d'utiliser des minutes, des mois ou même des années comme critères d'expiration.
En supposant que vous vouliez attribuer false(le cas échéant) à matchtime, une façon plus simple d'écrire ce serait ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Non, la fonction Compare renverra 1, 0 ou -1. 0 lorsque les deux valeurs sont égales, -1 et 1 signifient inférieur et supérieur à, je crois dans cet ordre, mais je les mélange souvent.
Non, vous ne l'utilisez pas correctement.
Voir ici pour plus de détails.
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 fait, aucune de ces réponses n'a fonctionné pour moi. Je l'ai résolu en faisant comme ceci:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Quand j'ai essayé de faire ça:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Aujourd'hui, 2011-11-14 et mon expiryDate était le 17/10/2011, j'ai obtenu que matchFound = -28. Au lieu de 28. J'ai donc inversé la dernière vérification.
// 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;
}
}