Java实现房租统计时指定月份的租赁天数

在做房租统计时,必然牵涉到一个问题:租期开始时间为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;
}

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值