公司最近有个业务,根据开始时间和结束时间,获取中间的月份和天数。
实现起来并不复杂,在此做个记录:
封装的返回参数
class DayAndRemain{
private String sdate;
private String edate;
private int remain;
public DayAndRemain() {
}
public DayAndRemain(String sdate, String edate, int remain) {
this.sdate = sdate;
this.edate = edate;
this.remain = remain;
}
public String getSdate() {
return sdate;
}
public void setSdate(String sdate) {
this.sdate = sdate;
}
public String getEdate() {
return edate;
}
public void setEdate(String edate) {
this.edate = edate;
}
public int getRemain() {
return remain;
}
public void setRemain(int remain) {
this.remain = remain;
}
@Override
public String toString() {
return "DayAndRemain{" +
"sdate='" + sdate + '\'' +
", edate='" + edate + '\'' +
", remain=" + remain +
'}';
}
}
递归获取时间间隔的方法
public static void getDaysOfMonth(String sdate,Date eDate,Date now ,SimpleDateFormat sdf, List<DayAndRemain> dayAndRemains) throws Exception{
Date sDate = sdf.parse(sdate);
if(now!=null){
if(eDate.after(now))eDate = now;//如果now传值且结束时间大于当前时间则取结束时间为当前时间
if(sDate.after(now))return;//如果开始时间大于结束时间或者大于当前时间,方法结束
}
if(eDate.before(sDate)) return ;
Calendar calendar = Calendar.getInstance();
calendar.setTime(sDate);
int daysRemain = calendar.getActualMaximum(Calendar.DAY_OF_MONTH) - calendar.get(Calendar.DAY_OF_MONTH) + 1;//剩余天数
calendar.add(calendar.DATE,daysRemain-1);
Date eDateTemp = calendar.getTime();
String edate = sdf.format(eDateTemp);
if(eDateTemp.after(eDate)){ //计算的结束时间已经超过了实际的结束时间,则获取实际结束时间的剩余天数相减
Calendar eCalendar = Calendar.getInstance();
eCalendar.setTime(eDate);
int eDaysRemain = eCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) - eCalendar.get(Calendar.DAY_OF_MONTH);//剩余天数
daysRemain = daysRemain - eDaysRemain;
edate = sdf.format(eDate);
}
if(daysRemain == 1 && dayAndRemains.size() > 0 ) return;
dayAndRemains.add(new DayAndRemain(sdate,edate,daysRemain));
calendar.add(calendar.DATE,1);
getDaysOfMonth(sdf.format(calendar.getTime()), eDate,now,sdf,dayAndRemains);
}
调用方法:
/**
*
* @param sdate 开始时间
* @param edata 结束时间
* @param formatter 转换格式
* @param startNow 是否使用当前时间做限制
* @return
* @throws Exception
*/
private static List<DayAndRemain> calculationDayAndRemain(String sdate,String edata,String formatter,boolean startNow) throws Exception{
List<DayAndRemain> dayAndRemains = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat(formatter);
getDaysOfMonth(sdate, sdf.parse(edata),startNow?new Date():null,sdf,dayAndRemains);
for (DayAndRemain dayAndRemain : dayAndRemains) {
System.out.println(dayAndRemain);
}
return dayAndRemains;
}
主程序:
public static void main(String[] args) throws Exception {
String sdate ="20190630";
String edata ="20190831";
String formatter ="yyyyMMdd";
calculationDayAndRemain(sdate,edata,formatter,true);
}
输出:
以上为精简例子,希望可以帮到你