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;
}
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 deTimeSpan
. Les personnes lisant ceci peuvent extrapoler cela pour penser que laSeconds
propriété fonctionne de la même manière.Days
lui - même peut se tromper.Days
etTotalDays
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
, carTotalDays
peut renvoyer quelque chose comme30.421
tandis queDays
renvoie encore30
.devrait être
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
notez le nombre total de jours sinon vous aurez un comportement werid
la source
TotalDays
est un champ conceptuellement correct à utiliser. Dans la pratique, ils donnent le même résultat, mais uniquement parce queDays
c'est la plus grande composante deTimeSpan
, s'il y avait eu une composante Mois ou Années et cela aurait été une autre histoire. Juste essayer avecHours
,Seconds
ouMilliseconds
pour voir comment ils fonctionnent.Eh bien, je le ferais comme ça à la place:
TimeSpan diff = expiryDate - DateTime.Today; if (diff.Days > 30) matchFound = true;
Compare ne répond que par un entier indiquant que la météo est antérieure, identique ou ultérieure ...
la source
Essayez plutôt ceci
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { matchFound = true; }
la source
Compare renvoie 1, 0, -1 pour supérieur à, égal à, inférieur à, respectivement.
Tu veux:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) { bool matchFound = true; }
la source
Cela vous donnera un résultat précis:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30) matchFound = true;
la source
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.
la source
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);
la source
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.
la source
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");
la source
Ce que vous voulez faire est de soustraire les deux DateTimes (expiryDate et DateTime.Now). Cela renverra un objet de type TimeSpan. Le TimeSpan a une propriété "Days". Comparez ce nombre à 30 pour votre réponse.
la source
Non, ce n'est pas correct, essayez ceci:
DateTime expiryDate = DateTime.Now.AddDays(-31); if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) { matchFound = true; }
la source
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.
la source
// 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; } }
la source
Vous pouvez essayer de faire comme ceci:
var daysPassed = (DateTime.UtcNow - expiryDate).Days; if (daysPassed > 30) { // ... }
la source