java8 日期范围内 日/周/月/季度/年 的日期结果集
/**
* 根据时间范围列出所有日/周/月/季/年
*
* @Author Moqi
* @Date 2020/4/30
* @Version V1.0
**/
public class DateHorizonUtil {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat monthFormat = new SimpleDateFormat("yyyy-MM");
/**
* 根据时间范围获得月份集
*
* @param beginDate:
* @param endDate:
* @return java.util.List<java.lang.String>
* @author Moqi
* @date 2020/4/30
*/
public static List<String> findMenth(Date beginDate, Date endDate) {
/* Date1.after(Date2),当Date1大于Date2时,返回TRUE,当小于等于时,返回false;
Date1.before(Date2),当Date1小于Date2时,返回TRUE,当大于等于时,返回false;
如果业务数据存在相等的时候,而且相等时也需要做相应的业务判断或处理时,你需要使用:!Date1.after(Date2);*/
List<String> rangeSet = new ArrayList<>();
//定义日期实例
Calendar dd = Calendar.getInstance();
//设置日期起始时间
dd.setTime(beginDate);
//判断是否到结束日期
while (!dd.getTime().after(endDate)) {
rangeSet.add(monthFormat.format(dd.getTime()));
//进行当前日期加1
dd.add(Calendar.DATE, 1);
}
rangeSet = rangeSet.stream().distinct().collect(Collectors.toList());
return rangeSet;
}
/**
* 根据时间范围获得年集
*
* @param beginDate:
* @param endDate:
* @return java.util.List<java.lang.String>
* @author Moqi
* @date 2020/4/30
*/
public static List<String> findYear(Date beginDate, Date endDate) {
/* Date1.after(Date2),当Date1大于Date2时,返回TRUE,当小于等于时,返回false;
Date1.before(Date2),当Date1小于Date2时,返回TRUE,当大于等于时,返回false;
如果业务数据存在相等的时候,而且相等时也需要做相应的业务判断或处理时,你需要使用:!Date1.after(Date2);*/
List<String> rangeSet = new ArrayList<>();
//定义日期实例
Calendar dd = Calendar.getInstance();
//设置日期起始时间
dd.setTime(beginDate);
//判断是否到结束日期
while (!dd.getTime().after(endDate)) {
rangeSet.add(String.valueOf(dd.get(Calendar.YEAR)));
//进行当前日期加1
dd.add(Calendar.DATE, 1);
}
rangeSet = rangeSet.stream().distinct().collect(Collectors.toList());
return rangeSet;
}
/**
* 根据时间范围获得季度集
*
* @param beginDate:
* @param endDate:
* @return java.util.List<java.lang.String>
* @author Moqi
* @date 2020/4/30
*/
public static List<String> findQuarter(Date beginDate, Date endDate) {
/* Date1.after(Date2),当Date1大于Date2时,返回TRUE,当小于等于时,返回false;
Date1.before(Date2),当Date1小于Date2时,返回TRUE,当大于等于时,返回false;
如果业务数据存在相等的时候,而且相等时也需要做相应的业务判断或处理时,你需要使用:!Date1.after(Date2);*/
List<String> rangeSet = new ArrayList<>();
String[] numStr;
String Q;
//定义日期实例
Calendar dd = Calendar.getInstance();
//设置日期起始时间
dd.setTime(beginDate);
//判断是否到结束日期
while (!dd.getTime().after(endDate)) {
numStr = dateFormat.format(dd.getTime()).split("-", 0);
Q = getQuarter(Integer.valueOf(numStr[1])) + "";
rangeSet.add(dd.get(Calendar.YEAR) + "-" + Q);
//进行当前日期加1
dd.add(Calendar.DATE, 1);
}
rangeSet = rangeSet.stream().distinct().collect(Collectors.toList());
return rangeSet;
}
/**
* 根据月获得季度
*
* @param month:
* @return int
* @author Moqi
* @date 2020/4/30
*/
private static int getQuarter(int month) {
if (month == 1 || month == 2 || month == 3) {
return 1;
} else if (month == 4 || month == 5 || month == 6) {
return 2;
} else if (month == 7 || month == 8 || month == 9) {
return 3;
} else {
return 4;
}
}
/**
* 根据时间范围获得日集
*
* @param dBegin:
* @param dEnd:
* @return java.util.List<java.lang.String>
* @author Moqi
* @date 2020/4/27
*/
public static List<String> findDates(Date dBegin, Date dEnd) {
List<String> lDate = new ArrayList<String>();
lDate.add(dateFormat.format(dBegin));
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(dBegin);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(dEnd);
// 测试此日期是否在指定日期之后
while (dEnd.after(calBegin.getTime())) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DATE, 1);
lDate.add(dateFormat.format(calBegin.getTime()));
}
return lDate;
}
/**
* 根据时间范围获得周集
*
* @param dBegin:
* @param dEnd:
* @return java.util.List<java.lang.String>
* @author Moqi
* @date 2020/4/30
*/
public static List<String> findWeek(Date dBegin, Date dEnd) {
List<String> lDate = new ArrayList<>();
Calendar calBegin = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calBegin.setTime(dBegin);
// 跨月情况大于等于四天归为一周
calBegin.setMinimalDaysInFirstWeek(4);
Calendar calEnd = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
calEnd.setTime(dEnd);
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calEnd.add(Calendar.DATE, 1);
// 测试此日期是否在指定日期之后
while (calEnd.getTime().after(calBegin.getTime())) {
int weekNo = calBegin.get(Calendar.WEEK_OF_YEAR);
// 判断跨年情况
if(calBegin.get(Calendar.MONTH)==11&&weekNo==1){
Calendar newCal = Calendar.getInstance();
newCal.setTime(calBegin.getTime());
newCal.add(Calendar.YEAR,1);
lDate.add(newCal.get(Calendar.YEAR) + "-" + weekNo);
}else {
lDate.add(calBegin.get(Calendar.YEAR) + "-" + weekNo);
}
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
calBegin.add(Calendar.DATE, 1);
}
lDate = lDate.stream().distinct().collect(Collectors.toList());
return lDate;
}
public static void main(String[] args) throws ParseException {
String start_time = "2019-05-01";
String end_time = "2020-12-31";
List<String> menthList = findMenth(dateFormat.parse(start_time), dateFormat.parse(end_time));
List<String> quarterList = findQuarter(dateFormat.parse(start_time), dateFormat.parse(end_time));
List<String> weekList = findWeek(dateFormat.parse(start_time), dateFormat.parse(end_time));
List<String> yearList = findYear(dateFormat.parse(start_time), dateFormat.parse(end_time));
}