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;
}
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ładnikiemTimeSpan
. Osoby czytające to mogą ekstrapolować to, sądząc, żeSeconds
nieruchomość działa w ten sam sposób.Days
sam też może się mylić.Days
iTotalDays
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ś takiego30.421
, jak whileDays
wciąż zwraca30
.Powinien być
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
zanotuj całkowitą liczbę dni, w przeciwnym razie uzyskasz gorsze zachowanie
źródło
TotalDays
jest koncepcyjnie poprawnym polem do użycia. W praktyce dają ten sam wynik, ale tylko dlatego, żeDays
jest to największy składnikTimeSpan
, gdyby istniał składnik Miesiące lub Lata, a to byłaby inna historia. Tylko spróbujHours
,Seconds
alboMilliseconds
zobaczyć, jak one działają.Zamiast tego zrobiłbym to w ten sposób:
TimeSpan diff = expiryDate - DateTime.Today; if (diff.Days > 30) matchFound = true;
Porównaj odpowiada tylko liczbą całkowitą wskazującą, że pierwsza pogoda jest wcześniejsza, taka sama lub później ...
źródło
Spróbuj tego zamiast tego
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { matchFound = true; }
źródło
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; }
źródło
To da ci dokładny wynik:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30) matchFound = true;
źródło
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.
źródło
Zakładając, że chcesz przypisać
false
(jeśli ma to zastosowanie) domatchtime
, prostszy sposób zapisu byłby ...matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
źródło
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.
źródło
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");
źródło
To, co chcesz zrobić, to odjąć dwa DateTimes (expiryDate i DateTime.Now). To zwróci obiekt typu TimeSpan. TimeSpan ma właściwość „Days”. Dla swojej odpowiedzi porównaj tę liczbę z 30.
źródło
Nie, to nie jest poprawne, spróbuj tego:
DateTime expiryDate = DateTime.Now.AddDays(-31); if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) { matchFound = true; }
źródło
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.
źródło
// 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; } }
źródło
Możesz spróbować zrobić tak:
var daysPassed = (DateTime.UtcNow - expiryDate).Days; if (daysPassed > 30) { // ... }
źródło