在做房租统计时,必然牵涉到一个问题:租期开始时间为2016-5-25到2017-6-25号,计算2016年5/6月份或者其他月份的租赁天数,这时,租赁天数可以能是那个月份的所有天数,也可以只能那个月份的一部分,如月中租的或者月中结束的。这几天就碰到了,就写了个简单的实现了最基本的计算,往后碰到问题时再修正。
代码如下(其中有些方法可以参考“Java中的日期常用格式化(二)”的对应方法):
/**
* 该方法用来计算某个月的实际租赁天数
* @param dateStr:当前年份和月份
* @param startTime:开始时间
* @param endTime:结束时间
* 分四种情况:
1、开始日期和结束日期在同一个月份(同年同月),那么用结束日期减去开始日期
2、开始日期为当前月份,但是结束日期不是的,就用指定日期-开始日期;
3、结束日期为当前月份,但是开始日期不是的,那么就去当前月份的所用数据。
4、要是开始日期和结束日期都不是当前的,那么就直接取当前月份的天数。
* **/
private Integer getRenDay(String strDate,String startTime,String endTime){
Integer day=0;
String firstDayStr = com.tzj.tsp.util.Time.getFirstDayEndForMonth(strDate);
//1、判断给定的日期是否处于给定的时间段之间
boolean isBetween = isBetweenSpace(firstDayStr,startTime,endTime);
if(isBetween){//必须在两个日期之间才能进行判断
//2、判断制定日期是开始日期和结束日期是否为同年同于,如:2016-6-15在2016-6-2和2016-6-30之间
boolean same1 = isTheSamYearAndMonth(strDate,startTime);
boolean same2 = isTheSamYearAndMonth(strDate,endTime);
if(same1 && same2){//指定日期与开始日期为同年同月,且与结束日期为同年同月,那么租期则为结束日期-开始日期
day = com.tzj.tsp.util.Time.dateDiff(startTime,endTime);
}else if(same1 && same2==false){//指定日期与开始日期为同年同月,但与结束日期不是同年同月,那么租期则为指定日期的最后一天-开始日期
String lastDayStr = com.tzj.tsp.util.Time.getLastDayEndForMonth(strDate);//指定月份最后一天的日期
day = com.tzj.tsp.util.Time.dateDiff(startTime,lastDayStr);
}else if(same2 && same1==false){//开始日期与指定日期不是同年同月,但结束日期与指定日期是同年同月,那么租期则为:结束日期当天所在天
//day = com.tzj.tsp.util.Time.dateDiff(firstDayStr,endTime);
day = com.tzj.tsp.util.Time.day(endTime);
}else{//三个日期都不在同年同月,那么租期应该是这个月的总天数
day = com.tzj.tsp.util.Time.getActualMaximum(strDate);
}
}
return day;
}
/**
* 该方法用来判断两个日期是否为同年同月
* @param date1:日期1
* @param date2:日期2
* @return isTheSame:true-相同 false-不相同
* **/
public boolean isTheSamYearAndMonth(String date1,String date2){
boolean isTheSame=false;//不相同
int year1 = com.tzj.tsp.util.Time.year(date1);
int year2 = com.tzj.tsp.util.Time.year(date2);
int month1 = com.tzj.tsp.util.Time.month(date1);
int month2 = com.tzj.tsp.util.Time.month(date2);
if(year1==year2 && month1== month2){isTheSame=true;}
return isTheSame;
}
/**
* 该方法用来判断给定的时间是否在给定的时间段之间
* @param dateStr:给定的时间,一般为某个月的第一天
* @param startTime:开始时间
* @param endTime:结束时间
* @return isBetween:是否在两个日期之间 true-在两者之间 false-不在两者之间
* **/
private boolean isBetweenSpace(String strDate,String startTime,String endTime){
boolean isBetween = false;
//1、开始日期或者结束日期与指定年月同年同月,那么日期符合条件,否则
boolean same1 = isTheSamYearAndMonth(strDate,startTime);
boolean same2 = isTheSamYearAndMonth(strDate,endTime);
if(same1 || same2){//任何一个为true,都可以符合条件
isBetween=true;
}else{
//2、指定日期必须大于等于开始日期
int diff1 = com.tzj.tsp.util.Time.dateDiff(startTime,strDate);
//3、指定日期小于等于结束日期
int diff2 = com.tzj.tsp.util.Time.dateDiff(strDate,endTime);
if(diff1>=0 && diff2>=0){
isBetween = true;
}
}
return isBetween;
}