網上搜計算兩個日期之間的月份數,可能會有一大堆,像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;
}