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, Compare
n'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 DateTime
s. Le résultat est un TimeSpan
objet qui a une TotalDays
propriété.
De plus, le conditionnel peut être écrit directement comme:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Pas if
besoin.
TotalDays
au lieu de jours.
Days
c'est le plus gros composant de TimeSpan
. Les personnes lisant ceci peuvent extrapoler cela pour penser que la Seconds
propriété fonctionne de la même manière.
Days
lui - même peut se tromper. Days
et TotalDays
sont 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 TotalDays
peut renvoyer quelque chose comme 30.421
tandis que Days
renvoie encore 30
.
devrait être
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
notez le nombre total de jours sinon vous aurez un comportement werid
TotalDays
est un champ conceptuellement correct à utiliser. Dans la pratique, ils donnent le même résultat, mais uniquement parce que Days
c'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
, Seconds
ou Milliseconds
pour 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;
}
}