Calculate the number of Calendar Months between two dates
本问题已经有最佳答案,请猛点这里访问。
我正在开发C中的利息计算器。我需要知道两天之间的天数。
所以,我计算如下:
1 2 3 4 | DateTime dt1 = DateTime.ParseExact(DateTime.Now.Date.ToString("dd-MM-yy"),"dd-MM-yy", CultureInfo.InvariantCulture).Date; DateTime dt2 = DateTime.ParseExact(Duration,"dd-MM-yy", CultureInfo.InvariantCulture).Date; Double no_days = (dt1 - dt2).TotalDays; |
但是,根据月份的不同,天数也会有所不同。因此,2月15日至3月15日构成一个月,即使天数少于30天。
任何一个IDE我如何确定经过的月数?利息计算在月末完成。
谢谢
我想不出比这更干净的方法了:
1 | ((dt1.Year - dt2.Year) * 12) + (dt1.Month - dt2.Month) - (dt1.Day < dt2.Day?1:0); |
即便如此,我也不确定我是否错过了一些边缘案例。
在这个问题上没有太多明确的答案,因为你总是在假设事情。
此解决方案计算两个日期之间的月数,假设要保存月的某一天进行比较(即计算中考虑月的某一天)。
例如,如果您的日期是2012年1月30日,那么2012年2月29日不是一个月,而是2013年3月1日。
它经过了相当彻底的测试,可能会在以后使用时清理干净,但这里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | private static int TotalMonthDifference(DateTime dtThis, DateTime dtOther) { int intReturn = 0; bool sameMonth = false; if (dtOther.Date < dtThis.Date) //used for an error catch in program, returns -1 intReturn--; int dayOfMonth = dtThis.Day; //captures the month of day for when it adds a month and doesn't have that many days int daysinMonth = 0; //used to caputre how many days are in the month while (dtOther.Date > dtThis.Date) //while Other date is still under the other { dtThis = dtThis.AddMonths(1); //as we loop, we just keep adding a month for testing daysinMonth = DateTime.DaysInMonth(dtThis.Year, dtThis.Month); //grabs the days in the current tested month if (dtThis.Day != dayOfMonth) //Example 30 Jan 2013 will go to 28 Feb when a month is added, so when it goes to march it will be 28th and not 30th { if (daysinMonth < dayOfMonth) // uses day in month max if can't set back to day of month dtThis.AddDays(daysinMonth - dtThis.Day); else dtThis.AddDays(dayOfMonth - dtThis.Day); } if (((dtOther.Year == dtThis.Year) && (dtOther.Month == dtThis.Month))) //If the loop puts it in the same month and year { if (dtOther.Day >= dayOfMonth) //check to see if it is the same day or later to add one to month intReturn++; sameMonth = true; //sets this to cancel out of the normal counting of month } if ((!sameMonth)&&(dtOther.Date > dtThis.Date))//so as long as it didn't reach the same month (or if i started in the same month, one month ahead, add a month) intReturn++; } return intReturn; //return month } |
1 2 3 | int MonthsElapsed = ((DateB.AddDays(1).Year - DateA.AddDays(1).Year) * 12) + (DateB.AddDays(1).Month - DateA.AddDays(1).Month) - (DateB.AddDays(1).Day < DateA.AddDays(1).Day ? 1 : 0); |
这个公式做了一些假设:
.adddays(1)用于说明日期b不包含触发器日期的月末方案。我想不出一种更优雅、更能说明问题的方法。
最后我写了自己的程序。我希望它能帮助别人。如果有更简单的方法来计算两个日期之间的月份,请告诉我。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | DateTime dt1 = DateTime.ParseExact(DateTime.Now.Date.ToString("dd-MM-yy"),"dd-MM-yy", CultureInfo.InvariantCulture).Date; DateTime dt2 = DateTime.ParseExact(Duration,"dd-MM-yy", CultureInfo.InvariantCulture).Date; DateTime temp = dt2; int no_months = 0; while ((dt1 - temp).TotalDays > 0) { temp = temp.AddMonths(1); no_months++; } if (no_months > 0) { no_months = no_months - 1; } |
谢谢