Ich versuche herauszufinden, ob ein Konto in weniger als 30 Tagen abläuft. Benutze ich DateTime Compare richtig?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Ich versuche herauszufinden, ob ein Konto in weniger als 30 Tagen abläuft. Benutze ich DateTime Compare richtig?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Antworten:
Benutze ich DateTime Compare richtig?
Nein Compare
bietet nur Informationen über die relative Position von zwei Daten: kleiner, gleich oder größer. Was Sie wollen, ist ungefähr so:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Dies subtrahiert zwei DateTime
s. Das Ergebnis ist ein TimeSpan
Objekt mit einer TotalDays
Eigenschaft.
Zusätzlich kann die Bedingung direkt geschrieben werden als:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Nicht if
benötigt.
TotalDays
anstelle von Tagen.
Days
es die größte Komponente von ist TimeSpan
. Leute, die dies lesen, können das extrapolieren, um zu glauben, dass die Seconds
Eigenschaft genauso funktioniert.
Days
selbst falsch sein kann. Days
und TotalDays
sind hier nur deshalb gleich, weil die Bedingung ist < 30
, aber es würde einen offensichtlichen Unterschied geben, wenn es wäre <= 30
, weil TotalDays
möglicherweise so etwas zurückgibt, 30.421
während Days
noch zurückkehrt 30
.
sollte sein
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Beachten Sie die Gesamtzahl der Tage, sonst erhalten Sie werid Verhalten
TotalDays
ist ein konzeptionell korrektes Feld. In der Praxis liefern sie das gleiche Ergebnis, aber nur, weil dies Days
die größte Komponente von ist TimeSpan
, wenn es eine Monats- oder Jahreskomponente gegeben hätte und dies eine andere Geschichte gewesen wäre. Versuchen Sie einfach mit Hours
, Seconds
oder Milliseconds
um zu sehen , wie sie funktionieren.
Versuchen Sie dies stattdessen
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Compare gibt 1, 0, -1 für größer als, gleich bzw. kleiner als zurück.
Sie wollen:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Dadurch erhalten Sie ein genaues Ergebnis:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Vergleichen ist nicht erforderlich , Tage / Gesamttage sind nicht erforderlich .
Alles was Sie brauchen ist
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
Beachten Sie, dass dies funktioniert, wenn Sie Minuten, Monate oder sogar Jahre als Ablaufkriterien verwenden.
Angenommen, Sie möchten false
(falls zutreffend) zuweisen matchtime
, wäre eine einfachere Schreibweise ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Nein, die Vergleichsfunktion gibt entweder 1, 0 oder -1 zurück. 0 Wenn die beiden Werte gleich sind, bedeuten -1 und 1 kleiner als und größer als, ich glaube an diese Reihenfolge, aber ich vermische sie oft.
Nein, Sie verwenden es nicht richtig.
Siehe hier für Details.
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");
Eigentlich hat keine dieser Antworten bei mir funktioniert. Ich habe es so gelöst:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Als ich das versuchte:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Heute, 2011-11-14 und mein Ablaufdatum war 2011-10-17. Ich habe das matchFound = -28. Anstelle von 28. Also habe ich den letzten Scheck umgekehrt.
// 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;
}
}