Я пытаюсь выяснить, истекает ли срок действия учетной записи менее чем через 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
.
- person João Portela; 20.02.2013
Days
является самым большим компонентом TimeSpan
. Люди, читающие это, могут предположить, что свойство Seconds
работает точно так же.
- person João Portela; 20.02.2013
Days
тоже может ошибаться. Days
и TotalDays
здесь одинаковы только потому, что условие < 30
, но была бы очевидная разница, если бы это было <= 30
, потому что TotalDays
может вернуть что-то вроде 30.421
, а Days
по-прежнему возвращает 30
.
- person Racil Hilan; 16.04.2014
должно быть
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
обратите внимание на общее количество дней, иначе вы получите странное поведение
TotalDays
является концептуально правильным полем для использования. На практике они дают тот же результат, но только потому, что Days
является самым большим компонентом TimeSpan
, если бы был компонент Месяцы или Годы, и это была бы другая история. Просто попробуйте с Hours
, Seconds
или Milliseconds
, чтобы увидеть, как они работают.
- person João Portela; 20.02.2013
Ну, я бы сделал это так:
TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30)
matchFound = true;
Сравнить отвечает только целым числом, указывающим, какая погода раньше, такая же или позже...
Попробуйте это вместо
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;
Сравнить не нужно, Days / TotalDays не нужны.
Все что тебе нужно это
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;
Сегодня, 14.11.2011, и моя дата истечения срока действия была 17.10.2011, я получил, что matchFound = -28. Вместо 28. Поэтому я перевернул последний чек.
Вы можете попробовать сделать так:
var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{
// ...
}