java8 日期范围内 日/周/月/季度/年 的日期结果集

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));
    }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值