如何计算两个DateTimes之间的月数?

时间:2009-04-20 15:41:25

标签: c# datetime

要求:

  • 计算月数 两个日期之间:receiveDate和 的dueDate。
  • 既乐观又悲观 需要进行计算

假设:

  • dueDate将始终是该月的最后一天。

我已经发现了悲观的计算(意味着一天的过期计算整整一个月:

if(receiveDate > dueDate)
    receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12;

在互联网上进行搜索,发现了几个类似的例子来证实这一点。

现在我的直觉告诉我,乐观的计算只会减去一个月,但由于某种原因它只是感觉不对。我是在正确的轨道还是我错过了什么?

5 个答案:

答案 0 :(得分:1)

你是对的;如果您要查找两个日期之间的完整个月的数量,减去1(假设receiveDate不是在该月的最后一天,在这种情况下,您将剩下0天的任何一种方式)会得到你的答案。

答案 1 :(得分:0)

如果你不需要在你的微积分中保留几个月的日子,我认为这是要走的路。

答案 2 :(得分:0)

您的公式计算收到的月份的第一个月与dueDate月份的第一个月之间的月数。由于TimeSpan中的大多数时间元素都表示为TotalXXX,因此他们遗漏了TotalMonths和TotalYears似乎很奇怪。

我认为这是因为每个月都没有固定的天数,因此很难知道在如何表达小数余数方面最有意义。

我的公式是......


int nMonthDiff_FirstToFirst = DateTime.Now.Month - testDate.Month + ((DateTime.Now.Year - testDate.Year)* 12);

double dMonthDiff = (double)nMonthDiff_FirstToFirst + (DateTime.Now - testDate.AddMonths(nMonthDiff_FirstToFirst)).TotalDays / (double)DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);

所以我正在做的事情基本上是像你这样的月份差异(本月的第一个月到本月的第一个月),然后按月差异将我的testDate投射到未来。然后使用TimeSpan,我获得TotalDays并将其除以该月的天数。因此,我代表了月份剩余天数的小数部分。

所以如果你要去2012年5月5日 - > 2012年6月3日,当整整一个月尚未过去时,您的公式将在月份差异中返回1。在我的公式中,预计日期的TotalDays将产生负的小数天数,并且当添加到“从第一个到第一个”的月份差异时,它将根据需要进行。

答案 3 :(得分:0)

我正在进行额外的检查,以获得准确的月数:

numberOfMonths = receiveDate.Month - dueDate.Month +(receiveDate.Year - dueDate.Year)* 12; if(receiveDate.Day> dueDate.Day)numberOfMonths - ;

答案 4 :(得分:0)

int GetMonthsCount(DateTime dtStart, DateTime dtEnd)
{
    return (int)Math.Round((dtEnd - dtStart).TotalMonths);
}