Я пытаюсь выяснить, истекает ли срок действия учетной записи менее чем через 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
whileDays
все еще возвращается30
.должно быть
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
отметьте общее количество дней, иначе вы получите странное поведение
источник
TotalDays
- это концептуально правильное поле для использования. На практике они дают тот же результат, но только потому, чтоDays
это самый большой компонентTimeSpan
, если бы был компонент «Месяцы или годы», и это было бы совсем другое дело. Просто попробуйтеHours
,Seconds
иMilliseconds
посмотреть , как они работают.Что ж, я бы сделал это так:
TimeSpan diff = expiryDate - DateTime.Today; if (diff.Days > 30) matchFound = true;
Compare отвечает только целым числом, указывающим на погоду: первый - раньше, тот же или позже ...
источник
Попробуйте вместо этого
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { matchFound = true; }
источник
Compare возвращает 1, 0, -1 для значений больше, равно, меньше чем соответственно.
Вы хотите:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) { bool 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");
источник
Что вы хотите сделать, так это вычесть два DateTimes (expiryDate и DateTime.Now). Это вернет объект типа TimeSpan. TimeSpan имеет свойство «Дни». Сравните это число с 30 для своего ответа.
источник
Нет, это неправильно, попробуйте следующее:
DateTime expiryDate = DateTime.Now.AddDays(-31); if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1) { matchFound = true; }
источник
На самом деле ни один из этих ответов не помог мне. Я решил это следующим образом:
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; } }
источник
Можно попробовать сделать так:
var daysPassed = (DateTime.UtcNow - expiryDate).Days; if (daysPassed > 30) { // ... }
источник