Я намагаюся зрозуміти, якщо термін дії облікового запису закінчується менше ніж за 30 днів. Чи правильно я використовую DateTime Compare?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Я намагаюся зрозуміти, якщо термін дії облікового запису закінчується менше ніж за 30 днів. Чи правильно я використовую DateTime Compare?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
Відповіді:
Чи правильно я використовую DateTime Compare?
№ Compareпропонує лише інформацію про взаємне розташування двох дат: меншої, рівної чи більшої. Ви хочете приблизно такого:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
Це віднімає два DateTimes. Результатом є TimeSpanоб’єкт, який має TotalDaysвластивість.
Крім того, умовний можна записати безпосередньо як:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Не ifпотрібно.
TotalDaysзамість днів.
Daysце найбільший компонент TimeSpan. Люди, які читають це, можуть екстраполювати це, щоб думати, що Secondsвластивість працює однаково.
Daysсам може бути помилковим. Daysі TotalDaysтут однакові лише тому, що умова є < 30, але була б очевидна різниця, якби це було <= 30, тому що TotalDaysможе повертати щось на зразок 30.421while Daysвсе ще повертається 30.
має бути
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
зверніть увагу на загальну кількість днів, інакше ви отримаєте веселу поведінку
TotalDays- концептуально правильне поле для використання. На практиці вони дають однаковий результат, але лише тому, що Daysце найбільший компонент TimeSpan, якби був компонент Місяці чи Роки, і це була б інша історія. Просто спробуйте Hours, Secondsі Millisecondsподивитися , як вони працюють.
Спробуйте замість цього
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Порівняння повертає 1, 0, -1 при більших, рівних, менших ніж відповідно.
Ти хочеш:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
Це дасть вам точний результат:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Порівняти непотрібно, Days / TotalDays непотрібні.
Все, що тобі потрібно, це
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
зауважте, це спрацює, якщо ви вирішите використовувати хвилини, місяці чи навіть роки як критерій закінчення терміну дії.
Якщо припустити, що ви хочете призначити false(якщо це можливо) matchtime, це був би простіший спосіб написання.
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
Ні, функція Порівняння поверне або 1, 0, або -1. 0, коли два значення рівні, -1 і 1 означають менше і більше ніж, я вірю в такий порядок, але я часто їх змішую.
Ні, ви використовуєте його неправильно.
Детальніше див. Тут .
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");
Насправді жодна з цих відповідей не спрацювала для мене. Я вирішив це таким чином:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
Коли я спробував це зробити:
matchFound = (expiryDate - DateTime.Now).Days < 30;
Сьогодні, 2011-11-14, і мій термін дії закінчився 2011-10-17, я отримав, що matchFound = -28. Замість 28. Тож я перевернув останню перевірку.
// 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;
}
}