DateTime.Порівняйте, як перевірити, чи немає дати менше 30 днів?


86

Я намагаюся зрозуміти, якщо термін дії облікового запису закінчується менше ніж за 30 днів. Чи правильно я використовую DateTime Compare?

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

{
     matchFound = true;
}

Відповіді:


232

Чи правильно я використовую DateTime Compare?

Compareпропонує лише інформацію про взаємне розташування двох дат: меншої, рівної чи більшої. Ви хочете приблизно такого:

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

Це віднімає два DateTimes. Результатом є TimeSpanоб’єкт, який має TotalDaysвластивість.

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

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

Не ifпотрібно.


2
Має бути дозволено дати вам 2+;) один для відповіді та один за короткий спосіб висловити його
CheGueVerra

4
Е-е ... я щойно зробив свою відповідь довше, тому сміливо віднімайте один уявний голос. ;-)
Конрад Рудольф

1
Будь ласка, використовуйте TotalDaysзамість днів.
Жоао Портела,

2
Це концептуально точніше. Це не має значення, оскільки Daysце найбільший компонент TimeSpan. Люди, які читають це, можуть екстраполювати це, щоб думати, що Secondsвластивість працює однаково.
João Portela,

2
Додаючи до пункту Джоа Портела, навіть Daysсам може бути помилковим. Daysі TotalDaysтут однакові лише тому, що умова є < 30, але була б очевидна різниця, якби це було <= 30, тому що TotalDaysможе повертати щось на зразок 30.421while Daysвсе ще повертається 30.
Расіл Хілан,

15

має бути

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

зверніть увагу на загальну кількість днів, інакше ви отримаєте веселу поведінку


ця відповідь була понад рік після останнього редагування прийнятої відповіді!
Mitch Wheat

@Mitch - Це правильна відповідь, зауважте, що він використовує TotalDays, а не Days.
Марсело Мейсон

Прийнята відповідь є правильною. TotalDays також повертає дробову частину, яка є зайвою при порівнянні з цілим числом.
Mitch Wheat

1
@MitchWheat TotalDays- концептуально правильне поле для використання. На практиці вони дають однаковий результат, але лише тому, що Daysце найбільший компонент TimeSpan, якби був компонент Місяці чи Роки, і це була б інша історія. Просто спробуйте Hours, Secondsі Millisecondsподивитися , як вони працюють.
Жоао Портела,

7

Ну, я б зробив це замість цього:

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

Порівняти відповідає лише цілим числом, що вказує на те, що перша раніше, однакова чи пізніша ...


6

Спробуйте замість цього

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

1
Хм, вам потрібно або змінити порядок ваших дат, або взяти абсолютне значення, якщо дата закінчення терміну дії вже не минула.
Конрад Рудольф

3

Порівняння повертає 1, 0, -1 при більших, рівних, менших ніж відповідно.

Ти хочеш:

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

1

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

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

насправді те, що відбувається hr, це напр. expryDte 28/4/2011, якщо U обряд (expiryDate-DateTime.now) також займе час (28/4/2011 00:00:00 - 26/4/2011 11 : 47: 00 AM) і вище, код приймає значення 28.04.2011 00:00:00 -26.04.2011 00:00:00, що не дає точної різниці.
Джаянт,

1

Порівняти непотрібно, Days / TotalDays непотрібні.

Все, що тобі потрібно, це

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

зауважте, це спрацює, якщо ви вирішите використовувати хвилини, місяці чи навіть роки як критерій закінчення терміну дії.


1
Не найкраща відповідь, тому що тепер ви також враховуєте години, хвилини та секунди. DateTime.Today було б більш правильним для ситуації з операційними програмами.
JL.

1

Якщо припустити, що ви хочете призначити false(якщо це можливо) matchtime, це був би простіший спосіб написання.

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

Трійковий оператор тут повністю зайвий, оскільки ((expiryDate - DateTime.Now) .TotalDays <30) вже повертає логічне значення.
Фабіо

@Fabio Thanks приятель видалив їх, щоб присвоїти логічне значення за допомогою типу return.
Magic Mick

0

Ні, функція Порівняння поверне або 1, 0, або -1. 0, коли два значення рівні, -1 і 1 означають менше і більше ніж, я вірю в такий порядок, але я часто їх змішую.


0

Ні, ви використовуєте його неправильно.

Детальніше див. Тут .

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

0

Що ви хочете зробити, це відняти два DateTimes (expiryDate і DateTime.Now). Це поверне об’єкт типу TimeSpan. TimeSpan має властивість "Дні". Порівняйте це число з 30 для вашої відповіді.


0

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

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

0

Насправді жодна з цих відповідей не спрацювала для мене. Я вирішив це таким чином:

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

Коли я спробував це зробити:

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

Сьогодні, 2011-11-14, і мій термін дії закінчився 2011-10-17, я отримав, що matchFound = -28. Замість 28. Тож я перевернув останню перевірку.


0
// 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;
            }
            }

1
Чи не трохи це складно?
Макс.

Де в запитанні згадується accountExpireDates? Ви скопіювали вклеєне погане рішення. matchFound майже звучить так, ніби ви змішуєте Pattern або RegEx. До речі, вам потрібно зламати, коли збіг знайдено або він продовжує цикл. Також що, якщо це -2? MSDN не говорить про можливі значення -1, 0 та 1.
Мукус,

0

Ви можете спробувати зробити так:

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

6
Будь ласка, спробуйте бути більш описовими у своїх поясненнях.
borchvm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.