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 Comparebietet 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 DateTimes. Das Ergebnis ist ein TimeSpanObjekt mit einer TotalDaysEigenschaft.
Zusätzlich kann die Bedingung direkt geschrieben werden als:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Nicht ifbenötigt.
TotalDaysanstelle von Tagen.
Dayses die größte Komponente von ist TimeSpan. Leute, die dies lesen, können das extrapolieren, um zu glauben, dass die SecondsEigenschaft genauso funktioniert.
Daysselbst falsch sein kann. Daysund TotalDayssind hier nur deshalb gleich, weil die Bedingung ist < 30, aber es würde einen offensichtlichen Unterschied geben, wenn es wäre <= 30, weil TotalDaysmöglicherweise so etwas zurückgibt, 30.421während Daysnoch zurückkehrt 30.
sollte sein
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Beachten Sie die Gesamtzahl der Tage, sonst erhalten Sie werid Verhalten
TotalDaysist ein konzeptionell korrektes Feld. In der Praxis liefern sie das gleiche Ergebnis, aber nur, weil dies Daysdie 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, Secondsoder Millisecondsum 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;
}
}