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)); }