计算两个日期之间的月份数
网上搜计算两个日期之间的月份数,可能会有一大堆,像Date1 和 Date2 之间的年数相减得到一个差额然后乘以12 再加上 两日期相减得到的月数 ,就以为得到两日期之间的月数,事实证明有问题。
如2018.4.1到2018.5.1还好,但如果有些涉及到金额的,他们认为四月有效期是2018.4.1 -2018.4.30,这时你计算的将变成0,不涉及到财务还好,要是真有一天你万一信了,也没验证,对账出问题,
然后最后发现原来是你代码写的有问题,这个问题就放大了,有点致命!
附上代码
/// <summary>
/// 计算实际月数
/// </summary>
/// <param name="dteStartTime">起始时间</param>
/// <param name="dteEndTime">结束时间</param>
/// <returns>返回续费月数</returns>
private static int CalInFactMonth(DateTime dteStartTime, DateTime dteEndTime)
{
int intMonths;
int intYear1 = dteEndTime.Year - dteStartTime.Year;
intMonths = dteEndTime.Month - dteStartTime.Month + intYear1 * 12;
//判断是 否是润年
bool blnIsLeap = IsLeapYear(dteEndTime.Year);
if (dteEndTime.Day != dteStartTime.Day)
{
int intResult = dteEndTime.Day - dteStartTime.Day + 1;
int intMon = dteEndTime.Month;
if (intMon == 1 || intMon == 3 || intMon == 5 || intMon == 7 || intMon == 8 || intMon == 10 || intMon == 12)
{
if (intResult == 31)
{
intMonths += 1;
}
}
else if (intMon == 4 || intMon == 6 || intMon == 9 || intMon == 11)
{
if (intResult == 30)
{
intMonths += 1;
}
}
else
{
if (blnIsLeap)
{
if ( intResult == 29)
{
intMonths += 1;
}
}
else
{
if (intResult == 28)
{
intMonths += 1;
}
}
}
}
return intMonths;
}
/// <summary>
/// 计算两个月份之间的实际月数
/// </summary>
/// <param name="year">年份</param>
/// <returns>true 润年 false </returns>
private static bool IsLeapYear(int year)
{
bool blnReturn = false;
if (year <= 0)
{
return false;
}
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
blnReturn = true;
}
return blnReturn;
}