线上的服务大部分都有包月计费的,对于包月计费来说,一般公司都有一个特别的规则来定义一个月的起止时间,比如从购买时间开始,满一个自然月后的第一个0:00作为服务的结束时间,在这个规则下,最少一个月有28天,大部分的月份都是30天,或31天,极端情况下,由于规则,会导致一个月有接近32天(你应该知道什么时间购买线上服务的时间是最合算的了吧?)。
对于服务器端,如何计算这个服务的起止时间,得出月份总数呢?
月份相减,计算天数,都会有误差,误差都是来自多个月份累积计算后的偏差。
所以,最好的办法,应该是从开始时间逐一累加月份,直到超过结尾时间。
上代码:
public static int getMonth(Date start, Date end)
{
if (start.after(end))
{
Date t = start;
start = end;
end = t;
}
Calendar startCalendar = Calendar.getInstance();
long endDataLong = end.getTime();
int count = 0;
while (true)
{
startCalendar.setTime(start);
startCalendar.add(Calendar.MONTH, count+1);
Date tmpData = startCalendar.getTime();
long tmpDataLong = tmpData.getTime();
if (tmpDataLong <= endDataLong)
{
count += 1;
}else{
break;
}
}
return count;
}