日期差异(以月为单位)

时间:2019-09-19 09:52:52

标签: c#

此代码可让您计算两个日期Date2> Date1之间的月份差异

public int MonthDiff(DateTime Date1, DateTime Date2)
{
    return Math.Abs((Date2.Month - Date1.Month) + 12 * (Date2.Year - Date1.Year));
}

在我的示例中,如果我输入Date1 =“ 01/01/2019”&Date2 =“ 31/12/2019”,它将返回11,这是错误的,应该为12。
如果我将Date1 =“ 25/01/2019”和Date =“ 31/12/2019”,也应该是12。

所以我需要按天数或什么来计算问题?
我使用了这段代码

return Math.Abs(((Date2- Date1).Days / 30) + 12 * (Date2.Year - Date1.Year));

如果Date1 =“ 01/01/2019”&Date2 =“ 31/12/2020”,则显示36个月。

1 个答案:

答案 0 :(得分:3)

如果您想知道两个日期之间以月或年为单位的可变长度,则应使用内置的时间跨度功能,而不要自己滚动,接受一些折衷/近似。一年中的平均天数为365.2425。非leap年一个月的平均天数是30.42,or年则是30.50,或总计30.44。近似月份时,请选择这些值之一。选择在计算月/年时是舍入还是舍入以及舍入到小数位数

例如:

var a = DateTime.Now;
var b = DateTime.Now.AddDays(366);
var years = Math.Round((b-a).TotalDays/365.2425);

您可以采用其他替代方法,例如:

  • 有一个整数数组,这些整数描述每个月的天数(在四年期间,因此考虑了2月的leap日),逻辑为“我将获得两个日期之间的天数,然后我将考虑开始日期的月份,并在“ rray-of-month-lengths”中设置一个指向该月份的数组索引器变量,然后从总数中减去该月份的天数,然后移动转到数组中的下一个索引(如有必要,返回数组开始)并减去。.我将继续这样做,直到剩余总天数低于我正在查看的月份中的天数..和我循环播放的次数应为一天之间的月份数的结果。
  • 编写一个循环,在开始日期之前增加一天,直到违反结束日期为止,并计算当前月份数字与该循环上次迭代中月份数字不同的次数

这些是实施非常具体的近似值的决定

在您准确解释要使用的数学规则时,我认为您的问题不会有基于事实的答案,因此可以对所有异常进行编码。说“ x-y是11个月,这是错误的”,这不是规则;您需要说出为什么错了