推荐
关注
功能
  • 分享到微博
  • 分享到微信
  • 分享到豆瓣
  • 分享到 QQ
  • 分享到 QZone
  • 收藏到博客园
  • 联系博主
TOP
Message

计算精确月份差 GetTotalMonthDiff

< 返回CSharp 扩展方法库

说明

在 CSharp 中,通过将两个 DateTime 相减获得 TimeSpan,并由此获得相隔的天数、时、分、秒都十分方便,但唯独缺少获得相隔月份的方法。直接对 TimeSpan 进行计算,利用相隔天数计算月份差(每月份的天数均不同,且有闰年存在)会存在一些误差。本扩展可解决这个问题。

已知两个时间(DateTime)dt1 和 dt2,计算两者之间的精确月份差。

如果想获得整型的月份差,请使用 int GetMonthDiff(this DateTime dt1, DateTime dt2) 方法。

扩展方法代码

/// <summary>
/// Compute dateTime difference precisely
/// Alex-LEWIS, 2015-08-11
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <returns></returns>
public static double GetTotalMonthDiff(this DateTime dt1, DateTime dt2)
{
  var l = dt1 < dt2 ? dt1 : dt2;
  var r = dt1 >= dt2 ? dt1 : dt2;
  var lDfM = DateTime.DaysInMonth(l.Year, l.Month);
  var rDfM = DateTime.DaysInMonth(r.Year, r.Month);

  var dayFixOne = l.Day == r.Day
    ? 0d
    : l.Day > r.Day
      ? r.Day * 1d / rDfM - l.Day * 1d / lDfM
      : (r.Day - l.Day) * 1d / rDfM;

  return dayFixOne
    + (l.Month == r.Month ? 0 : r.Month - l.Month)
    + (l.Year == r.Year ? 0 : (r.Year - l.Year) * 12);
}

使用示范

DateTime dt1 = new DateTime(2015, 08, 11);
DateTime dt2 = new DateTime(1992, 10, 10);
var monthTotalDiff = dt1.GetMonthDiff(dt2);

< 返回CSharp 扩展方法库

posted @ 2015-08-11 16:48  某个人。  阅读(279)  评论(0)    收藏  举报