DateTime.Confronta come verificare se una data ha meno di 30 giorni?


86

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:


234

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.


2
Dovrebbe essere consentito di darti 2+;) uno per la risposta e uno per il modo breve per esprimerla
CheGueVerra

4
Uh ... ho appena allungato la mia risposta quindi sentiti libero di sottrarre un voto immaginario. ;-)
Konrad Rudolph

1
Si prega di utilizzare al TotalDaysposto dei giorni.
João Portela

2
È concettualmente più accurato. Non fa differenza perché Daysè il componente più grande di TimeSpan. Le persone che leggono questo possono estrapolare che pensano che la Secondsproprietà funzioni allo stesso modo.
João Portela

2
Aggiungendo al punto fatto da João Portela, anche 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.
Racil Hilan

15

dovrebbe essere

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

annota il numero totale di giorni altrimenti otterrai un comportamento errato


questa risposta è stata più di un anno dopo l'ultima modifica alla risposta accettata!
Mitch Wheat

@ Mitch - Questa è la risposta corretta, nota che sta usando TotalDays anziché Days.
Marcelo Mason

La risposta accettata è corretta. TotalDays restituisce anche una parte frazionaria, che è ridondante se confrontata con un numero intero.
Mitch Wheat

1
@MitchWheat 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.
João Portela

7

Ebbene lo farei in questo modo invece:

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

Confronta risponde solo con un numero intero che indica che il primo è precedente, uguale o successivo ...


6

Prova questo invece

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}

1
Hmm, devi invertire l'ordine delle date o prendere il valore assoluto, a meno che la data di scadenza non sia già stata superata.
Konrad Rudolph,

3

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;
    }

1

Questo ti darà risultati accurati:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;

in realtà ciò che accade ora è ad es. expryDte è 28/4/2011 se U rite (expiryDate-DateTime.now) ci vorrà del tempo (28/4/2011 12:00:00 AM - 26/4/2011 11 : 47: 00 AM) e il codice sopra ha valore come 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM, il che fornisce una differenza precisa.
Jayant

1

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.


1
Non è un'ottima risposta perché ora stai anche prendendo in considerazione ore, minuti e secondi. DateTime.Today sarebbe più corretto per la situazione dei PO.
JL.

1

Supponendo che tu voglia assegnare false(se applicabile) a matchtime, un modo più semplice di scrivere sarebbe ..

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

L'operatore ternario qui è completamente ridondante poiché ((expiryDate - DateTime.Now) .TotalDays <30) restituisce già un valore booleano.
Fabio

@Fabio Thanks buddy li ha rimossi per assegnare il valore booleano tramite il tipo restituito.
Magic Mick

0

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.


0

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");

0

Quello che vuoi fare è sottrarre i due DateTimes (expiryDate e DateTime.Now). Ciò restituirà un oggetto di tipo TimeSpan. Il TimeSpan ha una proprietà "Days". Confronta quel numero con 30 per la tua risposta.


0

No non è corretto, prova questo:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}

0

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.


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;
            }
            }

1
Non è un po 'complicato?
Max

Dov'è la menzione di accountExpireDates nella domanda? Hai copiato incollato una cattiva soluzione. matchFound suona quasi come se stessi mescolando Pattern o RegEx. A proposito, devi interrompere quando viene trovata una corrispondenza o continua a ripetersi. Inoltre cosa succede se è -2? MSDN non dice che i valori possibili sono -1, 0 e 1.
Mukus

0

Puoi provare a fare così:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

6
Per favore cerca di essere più descrittivo nella tua spiegazione.
borchvm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.