Я пытаюсь выяснить, истекает ли срок действия учетной записи менее чем через 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, была бы очевидная разница , потому что TotalDaysmay возвращает что-то вроде 30.421while Daysвсе еще возвращается 30.
должно быть
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
отметьте общее количество дней, иначе вы получите странное поведение
TotalDays- это концептуально правильное поле для использования. На практике они дают тот же результат, но только потому, что Daysэто самый большой компонент TimeSpan, если бы был компонент «Месяцы или годы», и это было бы совсем другое дело. Просто попробуйте Hours, Secondsи Millisecondsпосмотреть , как они работают.
Попробуйте вместо этого
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
Это даст вам точный результат:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
Сравнивать не нужно, дни / общие дни не нужны.
Все, что тебе нужно
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, и мой expiryDate был 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;
}
}