如何比较给定日期和今天的日期

11

我希望将给定日期与今天进行比较,并根据以下条件进行判断:如果提供的日期早于或等于今天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个月,则满足另一个条件。

有多准确?时间的具体时刻有影响吗? - Wai Ha Lee
如果时间不计算,请将“now”更改为“Today”。 - CDrosos
@WaiHaLee 几个月。谢谢。 - Si8
二月三十日怎么办? - Alexei Levenkov
函数addmonths不会将1月30日变为2月30日 -> https://msdn.microsoft.com/zh-cn/library/system.datetime.addmonths(v=vs.110).aspx 您的当前代码有什么问题?现在更改为今天并从当前日期strDate仅保留日期或将时间设置为00:00:00(就像.Today一样) - CDrosos
@CDrosos 当然可以……但这有点含糊不清:“一个月后”在口语中没问题,但在代码中可能意味着不同的事情——如果可以改变日期(例如1月31日->2月28日),为什么不能一直进行这种操作(比如3月31日->4月28日)? (无论如何,OP显然只需要月份,我的评论没有任何帮助)。 - Alexei Levenkov
2个回答

14
你的第一个问题是使用了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等)一次 - 否则您可能会发现在评估之间它会发生更改。

抱歉,这里有一个条件:如果提供的日期大于或等于今天的6个月,则返回true,否则返回false。 - Si8
@SiKni8:比今天晚6个月,还是比今天早6个月?你明白这和“距离给定日期6个月是今天或之后”的意思不同吗? - Jon Skeet
今天的六个月前。抱歉。 - Si8
2
@SiKni8:好的,我已经编辑了我的答案来解释这个问题,但你真的应该编辑你的问题,让它更加清晰明了——最好附上一些例子。请记住“今天-6个月”和“目标日期+6个月”的区别。 - Jon Skeet

1
尝试使用这个。
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.
}

根据您的需要,用>=或<=替换==。


s = s.Date + ts 的意义是什么? s = s.Date 会得到相同的结果。 - juharr
它只从s中获取日期并返回时间00:00:00。 - CDrosos
ts 的值为0,因此添加它不会改变任何内容。 - juharr
我认为你是正确的,所以我们只需要保留日期。 - CDrosos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接