按照自然日期切割时间段

1 按日切割时间段
private List<DateRangeEntity> splitDateByDay(String startDateStr,String endDateStr,int frequency) throws ParseException {
        Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
        Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);
        Calendar caleEnd = Calendar.getInstance();
        caleEnd.setTime(endDate);
        // 中间变量
        Calendar caleMid = Calendar.getInstance();
        caleMid.setTime(startDate);
        List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();
        int sequ = 1;
        while (caleMid.before(caleEnd) || caleMid.equals(caleEnd)) {
            DateRangeEntity dre = new DateRangeEntity();
            Date midStartDate = caleMid.getTime();
            caleMid.add(Calendar.DATE,frequency - 1);
            dre.setStartDate(midStartDate);
            dre.setEndDate(endDate.compareTo(caleMid.getTime()) <= 0 ? endDate : caleMid.getTime());
            dre.setSequence(sequ);
            dreList.add(dre);
            sequ ++;
            caleMid.add(Calendar.DATE,1);
        }
        return dreList;
    }
2 按自然周切割时间段
private List<DateRangeEntity> splitDateByWeek(String startDateStr,String endDateStr,int frequency) throws ParseException {
        Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
        Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);

        List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();

        Calendar caleEnd = Calendar.getInstance();
        caleEnd.setTime(endDate);
        // 中间变量
        Calendar caleMidMin = Calendar.getInstance();
        caleMidMin.setTime(startDate);
        Calendar caleMidMax = Calendar.getInstance();
        int sequ = 1;
        while (caleMidMin.before(caleEnd) || caleMidMin.equals(caleEnd)) {
            int week = caleMidMin.get(Calendar.DAY_OF_WEEK) != 1 ? caleMidMin.get(Calendar.DAY_OF_WEEK) - 1 : 7;
            caleMidMax.setTime(caleMidMin.getTime());
            caleMidMax.add(Calendar.DATE,(7-week) + (frequency - 1)*7);
            DateRangeEntity dre = new DateRangeEntity();
            dre.setStartDate(caleMidMin.getTime());
            dre.setEndDate(caleMidMax.getTime().compareTo(endDate) >= 0 ? endDate : caleMidMax.getTime());
            dre.setSequence(sequ);
            dreList.add(dre);
            sequ ++;
            caleMidMax.add(Calendar.DATE,1);
            caleMidMin.setTime(caleMidMax.getTime());
        }
        return dreList;
    }
3 按自然月切割时间段
private List<DateRangeEntity> splitDateByMonth(String startDateStr,String endDateStr,int frequency) throws ParseException {
        Date startDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,startDateStr);
        Date endDate = DateUtil.string2Date(DateUtil.DATE_PATTENT,endDateStr);

        Calendar caleEnd = Calendar.getInstance();
        caleEnd.setTime(endDate);
        // 中间变量
        Calendar caleMidMin = Calendar.getInstance();
        caleMidMin.setTime(startDate);
        Calendar caleMidMax = Calendar.getInstance();
        int sequ = 1;
        List<DateRangeEntity> dreList = new ArrayList<DateRangeEntity>();
        while (caleMidMin.before(caleEnd) || caleMidMin.equals(caleEnd)) {
            DateRangeEntity dre = new DateRangeEntity();
            caleMidMax.setTime(caleMidMin.getTime());
            caleMidMax.add(Calendar.MONTH,frequency - 1);
            Date midMaxDate = convertStr2Date(caleMidMax.get(Calendar.YEAR),caleMidMax.get(Calendar.MONTH) + 1,caleMidMax.getActualMaximum(Calendar.DAY_OF_MONTH));
            dre.setStartDate(caleMidMin.getTime());
            dre.setEndDate(midMaxDate.compareTo(endDate) >= 0 ? endDate : midMaxDate);
            dre.setSequence(sequ);
            dreList.add(dre);
            sequ ++;
            caleMidMin.set(Calendar.DAY_OF_MONTH,1);
            caleMidMin.add(Calendar.MONTH,frequency);
        }
        return dreList;
    }
4 代码需要的内部类
class DateRangeEntity {

        private Date startDate;

        private Date endDate;

        private int sequence;

        public int getSequence() {
            return sequence;
        }

        public void setSequence(int sequence) {
            this.sequence = sequence;
        }

        public Date getStartDate() {
            return startDate;
        }

        public void setStartDate(Date startDate) {
            this.startDate = startDate;
        }

        public Date getEndDate() {
            return endDate;
        }

        public void setEndDate(Date endDate) {
            this.endDate = endDate;
        }
    }
5 DateUtil工具类的简单实现
public class DateUtil {

    private static final Logger logger = LoggerFactory.getLogger(com.fh.iasp.platform.util.DateUtil.class);

    public static final String TIME_PATTERN = "HH:mm:ss";
    public static final String DATE_PATTENT = "yyyy-MM-dd";
    public static final String DATETIME_PATTENT = "yyyy-MM-dd HH:mm:ss";
    public static final String YEAR_PATTENT = "yyyy";
    public static final String YEAR_MONTH_PATTENT = "yyyy-MM";
    public static final String YYYYMMDD_PATTERN = "yyyyMMdd";

    private static final long MAX_DATE = 4102329600000L;
    /**
     * 最小日期 1900-01-01
     */
    private static final long MIN_DATE = -2209017600000L;

    public static Date string2Date(String pattern, String source) throws ParseException {
        return stringToDate(pattern, source);
    }

    public static Date stringToDate(String aMask, String strDate) throws ParseException {
        if (StringUtil.isEmpty(strDate)) {
            return null;
        }
        SimpleDateFormat df;
        Date date;
        df = new SimpleDateFormat(aMask);
        try {
            date = df.parse(strDate);
            if (date != null && (date.getTime() < MIN_DATE || date.getTime() > MAX_DATE)) {
                throw new ParseException("日期格式超出有效范围", 0);
            }
        } catch (ParseException pe) {
            throw new ParseException(pe.getMessage(), pe.getErrorOffset());
        }
        return date;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值