2009-04-20 92 views
0

要求:如何计算两个DateTime之间的月数?

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

假设:

  • 的dueDate将永远是这个月的最后一天。

我已经想通了悲观的计算(即:单一天逾期计为一整月。

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

做了搜索在互联网上翻了几个类似的例子来证实这一点

现在,我的直觉告诉我,乐观的计算也只是同负一一个月,但由于某种原因,它只是不适合我。我在正确的轨道上还是我失去了一些东西?

+1

不明白'乐观/悲观'的东西。两个日期之间的月数是否定义为“两个日期之间有一天或多天的月数,包括”?在这种情况下,不会有一个正确的答案。 – mackenir 2009-04-20 15:45:32

回答

1

你是对的;如果您正在查找两个日期之间的完整个月的数量,则减去1(假设receiveDate不在本月的最后一天,在这种情况下,您将在任何一种情况下剩余时间为0天)会给你你的答案。

0

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

0

您的公式计算receivedDate的第一个月到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为月份的差异,当一整个月还没有通过。在我的公式中,预计日期的总日数会产生负数的小数天数,并且在添加到“第一个到第一个”月份的差异时,它会根据需要采用。

0

我这样做额外的检查,以获得个月的确切数额:

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

0
int GetMonthsCount(DateTime dtStart, DateTime dtEnd) 
{ 
    return (int)Math.Round((dtEnd - dtStart).TotalMonths); 
} 
相关问题