要求:
假设:
我已经发现了悲观的计算(意味着一天的过期计算整整一个月:
if(receiveDate > dueDate)
receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12;
在互联网上进行搜索,发现了几个类似的例子来证实这一点。
现在我的直觉告诉我,乐观的计算只会减去一个月,但由于某种原因它只是感觉不对。我是在正确的轨道还是我错过了什么?
答案 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);
}