计算两个日期之间的月份数

       网上搜计算两个日期之间的月份数,可能会有一大堆,像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;
}

posted on 2018-04-28 17:58  JeremyLin(Hu)-  阅读(4143)  评论(0编辑  收藏  举报