Я пытаюсь выяснить, истекает ли срок действия учетной записи менее чем через 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;
Это вычитает два DateTime
s. Результатом является TimeSpan
объект, у которого есть TotalDays
свойство.
Кроме того, условное выражение можно записать прямо как:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
Нет if
необходимости.
TotalDays
вместо дней.
Days
это самый большой компонент TimeSpan
. Люди, читающие это, могут экстраполировать это на мысль, что Seconds
свойство работает таким же образом.
Days
сам тоже может ошибаться. Days
и TotalDays
здесь то же самое только потому, что условие есть < 30
, но если бы это было так <= 30
, была бы очевидная разница , потому что TotalDays
may возвращает что-то вроде 30.421
while 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;
}
}