DateTime.Comment vérifier si une date a moins de 30 jours?

86

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;
}
David Basarab
la source

Réponses:

232

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.

Konrad Rudolph
la source
2
Devrait être autorisé à vous donner 2+;) un pour la réponse et un pour le court moyen de l'exprimer
CheGueVerra
4
Euh… J'ai juste allongé ma réponse, alors n'hésitez pas à soustraire un vote imaginaire. ;-)
Konrad Rudolph
1
Veuillez utiliser TotalDaysau lieu de jours.
João Portela
2
C'est conceptuellement plus précis. Cela ne fait aucune différence car 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.
João Portela
2
Pour ajouter au point soulevé par João Portela, même 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.
Racil Hilan
15

devrait être

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

notez le nombre total de jours sinon vous aurez un comportement werid

Luke
la source
cette réponse était plus d'un an après la dernière modification à la réponse acceptée!
Mitch Wheat
@Mitch - C'est la bonne réponse, notez qu'il utilise TotalDays plutôt que Days.
Marcelo Mason
La réponse acceptée est correcte. TotalDays renvoie également une partie fractionnaire, ce qui est redondant lors de la comparaison avec un entier.
Mitch Wheat
1
@MitchWheat 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.
João Portela
7

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 ...

haqwin
la source
6

Essayez plutôt ceci

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}
JaredPar
la source
1
Hmm, vous devez soit inverser l'ordre de vos dates, soit prendre la valeur absolue, sauf si la date d'expiration est déjà dépassée.
Konrad Rudolph
3

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;
    }
Blé Mitch
la source
1

Cela vous donnera un résultat précis:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;
Jayant
la source
en fait ce qui se passe hr est par exemple expryDte est 28/4/2011 si U rite (expiryDate-DateTime.now) cela prendra aussi le temps (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47: 00 AM) & ci-dessus, le code prend la valeur 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM qui ne donne pas une différence précise.
Jayant
1

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.

Rob
la source
1
Pas une bonne réponse car maintenant vous tenez également compte des heures, minutes et secondes. DateTime.Today serait plus correct pour la situation des OP.
JL.
1

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);
Mick magique
la source
L'opérateur ternaire est ici complètement redondant car ((expiryDate - DateTime.Now) .TotalDays <30) renvoie déjà un booléen.
Fabio
@Fabio Thanks buddy les a supprimés pour attribuer la valeur booléenne via le type de retour.
Magic Mick
0

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.

Timothy Carter
la source
0

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");
David Basarab
la source
0

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.

GWLlosa
la source
0

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;
}
Canavar
la source
0

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.

SBergstrom
la source
0
// 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;
            }
            }
Alex
la source
1
N'est-ce pas un peu compliqué?
Max
Où est la mention accountExpireDates dans la question? Vous copiez-collé une mauvaise solution. matchFound sonne presque comme si vous mixiez Pattern ou RegEx. Btw, vous devez interrompre quand une correspondance est trouvée ou qu'elle continue à boucler. Et si c'est -2? MSDN ne dit pas que les valeurs possibles sont -1, 0 et 1.
Mukus
0

Vous pouvez essayer de faire comme ceci:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}
Vlad
la source
6
Veuillez essayer d'être plus descriptif dans votre explication.
borchvm