Próbuję dowiedzieć się, czy konto wygaśnie za mniej niż 30 dni. Czy prawidłowo używam porównania dat i godzin?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Próbuję dowiedzieć się, czy konto wygaśnie za mniej niż 30 dni. Czy prawidłowo używam porównania dat i godzin?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Odpowiedzi:
Czy prawidłowo używam porównania dat i godzin?
Nie. Compare
Oferuje tylko informacje o względnym położeniu dwóch dat: mniej, równo lub więcej. To, czego chcesz, to coś takiego:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
To odejmuje dwa DateTime
s. Wynikiem jest TimeSpan
obiekt, który ma TotalDays
właściwość.
Dodatkowo warunek można zapisać bezpośrednio jako:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Nie if
potrzeba.
TotalDays
zamiast dni.
Days
jest największym składnikiem TimeSpan
. Osoby czytające to mogą ekstrapolować to, sądząc, że Seconds
nieruchomość działa w ten sam sposób.
Days
sam też może się mylić. Days
i TotalDays
są takie same tylko dlatego, że warunek jest < 30
, ale byłaby oczywista różnica, gdyby tak było <= 30
, ponieważ TotalDays
może zwrócić coś takiego 30.421
, jak while Days
wciąż zwraca 30
.
Powinien być
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
zanotuj całkowitą liczbę dni, w przeciwnym razie uzyskasz gorsze zachowanie
TotalDays
jest koncepcyjnie poprawnym polem do użycia. W praktyce dają ten sam wynik, ale tylko dlatego, że Days
jest to największy składnik TimeSpan
, gdyby istniał składnik Miesiące lub Lata, a to byłaby inna historia. Tylko spróbuj Hours
, Seconds
albo Milliseconds
zobaczyć, jak one działają.
Spróbuj tego zamiast tego
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Porównaj zwraca 1, 0, -1 dla odpowiednio większego niż, równego, mniejszego niż.
Chcesz:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
To da ci dokładny wynik:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Porównanie jest niepotrzebne, dni / suma dni są niepotrzebne.
Wszystko czego potrzebujesz to
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
pamiętaj, że zadziała, jeśli zdecydujesz się użyć minut, miesięcy lub nawet lat jako kryteriów wygaśnięcia.
Zakładając, że chcesz przypisać false
(jeśli ma to zastosowanie) do matchtime
, prostszy sposób zapisu byłby ...
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Nie, funkcja Porównaj zwróci wartość 1, 0 lub -1. 0 gdy te dwie wartości są równe, -1 i 1 oznaczają mniej niż i więcej niż, wierzę w tej kolejności, ale często mylę je.
Nie, nie używasz go poprawnie.
Zobacz tutaj po szczegóły.
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");
Właściwie żadna z tych odpowiedzi nie zadziałała dla mnie. Rozwiązałem to w ten sposób:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Kiedy próbowałem to zrobić:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Dzisiaj, 2011-11-14, a moja data ważności to 2011-10-17, otrzymałem to matchFound = -28. Zamiast 28. Więc odwróciłem ostatni czek.
// 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;
}
}