Как сравнить заданную дату с сегодняшним днем

Я хочу сравнить данную дату с сегодняшним днем, и вот условие: если указанная дата больше или равна 6 месяцам ранее с сегодняшнего дня, верните true, иначе верните false

Код:

string strDate = tbDate.Text; //2015-03-29
if (DateTime.Now.AddMonths(-6) == DateTime.Parse(strDate)) //if given date is equal to exactly 6 months past from today (change == to > if date has to be less 6 months)
{
    lblResult.Text = "true"; //this doesn't work with the entered date above.
}
else //otherwise give me the date which will be 6 months from a given date.
{
    DateTime dt2 = Convert.ToDateTime(strDate);
    lblResult.Text = "6 Months from given date is: " + dt2.AddMonths(6); //this works fine
}
  • Если 6 месяцев или более 6 месяцев - это то, что я хотел бы для одного условия
  • Если менее 6 месяцев - другое условие.

person Si8    schedule 29.09.2015    source источник
comment
Насколько точно? Учитывается ли время суток?   -  person Wai Ha Lee    schedule 29.09.2015
comment
если время не считается, меняй сейчас на сегодня   -  person CDrosos    schedule 29.09.2015
comment
@WaiHaLee Всего несколько месяцев. Спасибо.   -  person Si8    schedule 29.09.2015
comment
А 30 февраля?   -  person Alexei Levenkov    schedule 29.09.2015
comment
функция addmonths не будет делать период с 30 января по 30 февраля -> msdn.microsoft.com/en-us/library/ что не так с вашим текущим кодом? измените сейчас на сегодня и с текущей даты strDate сохраните только дату или установите время на 00:00:00 (как это делает .Today)   -  person CDrosos    schedule 29.09.2015
comment
@CDrosos конечно ... но это слишком расплывчато: через месяц это нормально в устном тексте, но может означать разные вещи в коде - если можно когда-нибудь изменить день (31 января - › 28 февраля), почему бы и нет допустимо ли постоянно вносить это изменение (31 марта - › 28 апреля)? (В любом случае ОП явно нужен всего месяц, и мой комментарий не был полезен).   -  person Alexei Levenkov    schedule 29.09.2015


Ответы (2)


Ваша первая проблема заключается в том, что вы используете DateTime.Now вместо DateTime.Today, поэтому вычитание 6 месяцев даст вам еще DateTime с определенным временем суток, что вряд ли будет точной датой/временем, которое вы разобрал. В оставшейся части этого поста я предполагаю, что значение, которое вы анализируете, на самом деле является датой, поэтому вы получите DateTime со временем дня в полночь. (Конечно, по моему очень предвзятому мнению, было бы лучше использовать библиотеку, которая поддерживает "дату" как первоклассную концепцию...)

Следующая проблема заключается в том, что вы предполагаете, что вычитание 6 месяцев из сегодняшнего дня и сравнение его с фиксированной датой эквивалентно добавлению 6 месяцев к фиксированной дате и сравнению ее с сегодняшним днем. Это не одна и та же операция — календарная арифметика просто так не работает. Вы должны решить, каким образом вы хотите, чтобы это работало, и быть последовательным. Например:

DateTime start = DateTime.Parse(tbDate.Text);
DateTime end = start.AddMonths(6);
DateTime today = DateTime.Today;
if (end >= today)
{
    // Today is 6 months or more from the start date
}
else
{
    // ...
}

Или альтернативно - и нет эквивалентно:

DateTime target = DateTime.Parse(tbDate.Text);
DateTime today = DateTime.Today;
DateTime sixMonthsAgo = today.AddMonths(-6);
if (sixMonthsAgo >= target)
{
    // Six months ago today was the target date or later
}
else
{
    // ...
}

Обратите внимание, что вы должны оценивать DateTime.Today (или DateTime.Now и т. д.) только один раз для каждого набора вычислений, иначе вы можете обнаружить, что оно меняется между оценками.

person Jon Skeet    schedule 29.09.2015
comment
Извините, вот условие: если указанная дата больше или равна 6 месяцам от сегодняшнего дня, вернуть true, иначе вернуть false. - person Si8; 29.09.2015
comment
@SiKni8: на 6 месяцев позже, чем сегодня, или на 6 месяцев раньше, чем сегодня? И вы понимаете, что разница в 6 месяцев от указанной даты сегодня или позже? - person Jon Skeet; 29.09.2015
comment
6 месяцев назад с сегодняшнего дня. простите - person Si8; 29.09.2015
comment
@ SiKni8: Хорошо, я отредактировал свой ответ, чтобы объяснить это, но вам действительно следует отредактировать свой вопрос, чтобы он был намного яснее - с примерами. Пожалуйста, имейте в виду разницу между сегодняшним днем ​​- 6 месяцев и контрольной датой + 6 месяцев. - person Jon Skeet; 29.09.2015

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

DateTime s = Convert.ToDateTime(tbDate.Text);
s = s.Date;

if (DateTime.Today.AddMonths(-6) == s) //if given date is equal to exactly 6 months past from today (change == to > if date has to be less 6 months)
{
lblResult.Text = "true"; //this doesn't work with the entered date above.
}

замените == на >= или ‹= в соответствии с вашими потребностями

person CDrosos    schedule 29.09.2015
comment
Какой смысл в s = s.Date + ts? s = s.Date даст тот же результат. - person juharr; 29.09.2015
comment
нет, он берет дату только из s и дает время 00:00:00 - person CDrosos; 29.09.2015
comment
ts равно 0. Таким образом, его добавление ничего не изменит. - person juharr; 29.09.2015
comment
я думаю, вы правы, поэтому нам нужно только сохранить дату - person CDrosos; 29.09.2015