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

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

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

{
     matchFound = true;
}

person Community    schedule 09.02.2009    source источник


Ответы (15)


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

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

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

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

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

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

if не нужно.

person Konrad Rudolph    schedule 09.02.2009
comment
Должно быть разрешено дать вам 2+;) один за ответ и один за короткий способ выразить это - person CheGueVerra; 09.02.2009
comment
Э-э… Я только что удлинил свой ответ, так что не стесняйтесь вычесть один воображаемый голос. ;-) - person Konrad Rudolph; 09.02.2009
comment
Вместо дней используйте TotalDays. - person João Portela; 20.02.2013
comment
@Жоао Почему? В данном случае это не имеет значения. - person Konrad Rudolph; 20.02.2013
comment
Это концептуально более точно. Это не имеет значения, потому что Days является самым большим компонентом TimeSpan. Люди, читающие это, могут предположить, что свойство Seconds работает точно так же. - person João Portela; 20.02.2013
comment
@Жоао Хм. Согласованный. Изменится. - person Konrad Rudolph; 20.02.2013
comment
Добавим к замечанию Жоао Портела: даже сам Days тоже может ошибаться. Days и TotalDays здесь одинаковы только потому, что условие < 30, но была бы очевидная разница, если бы это было <= 30, потому что TotalDays может вернуть что-то вроде 30.421, а Days по-прежнему возвращает 30. - person Racil Hilan; 16.04.2014
comment
Спасибо...мне очень помогло. - person Thiago Cunha; 31.01.2019

должно быть

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

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

person Luke    schedule 25.05.2010
comment
этот ответ был более чем через год после последнего редактирования принятого ответа! - person Mitch Wheat; 12.01.2013
comment
@Mitch - это правильный ответ, обратите внимание, что он использует TotalDays, а не Days. - person Marcelo Mason; 21.01.2013
comment
Принятый ответ правильный. TotalDays также возвращает дробную часть, которая является избыточной при сравнении с целым числом. - person Mitch Wheat; 21.01.2013
comment
@MitchWheat TotalDays является концептуально правильным полем для использования. На практике они дают тот же результат, но только потому, что Days является самым большим компонентом TimeSpan, если бы был компонент Месяцы или Годы, и это была бы другая история. Просто попробуйте с Hours, Seconds или Milliseconds, чтобы увидеть, как они работают. - person João Portela; 20.02.2013

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

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

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

person haqwin    schedule 09.02.2009

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

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}
person JaredPar    schedule 09.02.2009
comment
Хм, вам нужно либо инвертировать порядок ваших дат, либо взять абсолютное значение, если только срок годности еще не прошел. - person Konrad Rudolph; 09.02.2009

Функция Compare возвращает 1, 0, -1 для значений больше, равно и меньше соответственно.

Вы хотите:

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

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

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;
person Jayant    schedule 03.05.2011
comment
на самом деле то, что происходит hr, например.expryDte равно 28/4/2011, если U rite (expiryDate-DateTime.now) также займет время (28/4/2011 00:00:00 - 26/4/2011 11 :47:00) и приведенный выше код принимает значение как 28/4/2011 00:00:00 - 26/4/2011 00:00:00, что плохо дает точную разницу. - person Jayant; 03.05.2011

Сравнить не нужно, Days / TotalDays не нужны.

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

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

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

person rob    schedule 07.09.2011
comment
Не лучший ответ, потому что теперь вы также учитываете часы, минуты и секунды. DateTime.Today будет более правильным для ситуации с OP. - person JL.; 07.11.2011

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

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
person Magic Mick    schedule 18.02.2015
comment
Тернарный оператор здесь полностью лишний, поскольку ((expiryDate - DateTime.Now).TotalDays ‹ 30) уже возвращает логическое значение. - person Fabio; 30.08.2019
comment
@Fabio Спасибо, приятель, удалил их, чтобы присвоить логическое значение через тип возвращаемого значения. - person Magic Mick; 03.09.2019

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

person Timothy Carter    schedule 09.02.2009

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

Подробнее см. здесь.

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");
person David Basarab    schedule 09.02.2009

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

person GWLlosa    schedule 09.02.2009

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

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}
person Canavar    schedule 09.02.2009

На самом деле ни один из этих ответов не работал для меня. Я решил это, выполнив следующие действия:

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

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

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

Сегодня, 14.11.2011, и моя дата истечения срока действия была 17.10.2011, я получил, что matchFound = -28. Вместо 28. Поэтому я перевернул последний чек.

person SBergstrom    schedule 14.11.2011

Вы можете попробовать сделать так:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}
person vlad    schedule 30.09.2019
comment
Пожалуйста, постарайтесь быть более описательным в своем объяснении. - person borchvm; 30.09.2019

person    schedule
comment
Разве это не сложно? - person Max; 27.09.2012
comment
Где упоминание accountExpireDates в вопросе? Вы скопировали плохое решение. matchFound звучит почти так, как будто вы смешиваете Pattern или RegEx. Кстати, вам нужно прерваться, когда совпадение найдено, или оно продолжает зацикливаться. И что, если это -2? MSDN не говорит, что возможные значения -1, 0 и 1. - person Mukus; 11.02.2014