DateTime.Compare, как проверить, если дата меньше 30 дней?

Я пытаюсь решить, если срок действия учетной записи истекает менее чем за 30 дней. Я правильно использую DateTime Compare?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}

14 ответов

Решение

Я правильно использую DateTime Compare?

Нет. Compare только предлагает информацию об относительном положении двух дат: меньше, равно или больше. То, что вы хотите, это что-то вроде этого:

if ((expiryDate - DateTime.Now).TotalDays < 30)
    matchFound = true;

Это вычитает два DateTime s. Результатом является TimeSpan объект, который имеет TotalDays имущество.

Кроме того, условное можно записать непосредственно как:

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

нет if необходимо.

Должно быть

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

обратите внимание на общее количество дней, иначе вы получите странное поведение

Ну, я бы сделал это так:

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

Сравнение отвечает только целым числом, указывающим, какая погода раньше, та же или позже...

Попробуйте это вместо

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}

Сравнение возвращает 1, 0, -1 для больше, равно, меньше, соответственно.

Ты хочешь:

    if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
        bool matchFound = true;
    }

Предполагая, что вы хотите назначить false (если применимо) к matchtime, проще было бы написать это..

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30) ? true : false;

Сравнение не нужно, дни / полные дни не нужны.

Все, что тебе нужно

if (expireDate < DateTime.Now) {
    // has expired
} else {
    // not expired
}

обратите внимание, что это сработает, если вы решите использовать минуты, месяцы или даже годы в качестве критериев истечения срока действия.

Это даст вам точный результат:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;

Что вы хотите сделать, это вычесть два DateTimes (expiryDate и DateTime.Now). Это вернет объект типа TimeSpan. TimeSpan имеет свойство "Дни". Сравните это число с 30 для вашего ответа.

Нет, вы не используете это правильно.

Смотрите здесь для деталей.

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");

Можно попробовать сделать так:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

На самом деле ни один из этих ответов не работал для меня. Я решил это, сделав так:

  if ((expireDate.Date - DateTime.Now).Days > -30)
  {
    matchFound = true;
  }

Когда я попытался сделать это:

matchFound = (expiryDate - DateTime.Now).Days < 30;

Сегодня 2011-11-14 и моя дата истечения срока действия была 2011-10-17, я получил этот matchFound = -28. Вместо 28. Так что я перевернул последнюю проверку.

Нет, функция сравнения вернет 1, 0 или -1. 0, когда два значения равны, -1 и 1 означают меньше и больше чем, я верю в этом порядке, но я часто смешиваю их.

Нет, это не правильно, попробуйте это:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}
// 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;
            }
            }
Другие вопросы по тегам