将两个日期的时间段按照一定天数进行周期切割

要求:
A)按从周一到周日计算为一周。周六日为单独一周
B)跨月的,每月的1号在周内,就按该月计算第一周,
例如2022年8月29日到2022年9月4日在一周里,此周算做2022年9月第一周。
含有1号的为第一周
C)跨年的,按不同年份拆分周数,例如2022年12月26日到2023年1月1日在一周里,则计算2022年12月26日到2022年12月31日为2022年12月第5周,2023年1月1日为2023年1月第一周。

public static void main(String[] args) throws ParseException {
        List<String> strings = doDateSplit("2023-01-01", "2023-12-31");
        System.out.println(strings);
    }
    // 将时间按照星期分割
    public static List<String> doDateSplit(String startDate, String endDate) throws ParseException {
        List<String> resultlist = new ArrayList<String>();
        List<String> listWeekOrMonth = new ArrayList<String>();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat olddateFormat = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat newdateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date sDate = dateFormat.parse(startDate);
        Calendar sCalendar = Calendar.getInstance();
        sCalendar.setFirstDayOfWeek(Calendar.MONDAY);// 设置一周的第一天从星期几开始
        sCalendar.setTime(sDate);
        Date eDate = dateFormat.parse(endDate);
        Calendar eCalendar = Calendar.getInstance();
        eCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        eCalendar.setTime(eDate);
        boolean bool = true; // 添加第一天
        while (sCalendar.getTime().getTime() < eCalendar.getTime().getTime()) {
            int week1 = sCalendar.get(Calendar.DAY_OF_WEEK) - 1;// 周几
            if (bool || week1 == 0 || week1 == 1) {
                if (week1 == 0) {// 周日
                    sCalendar.set(Calendar.HOUR_OF_DAY, 23);
                    sCalendar.set(Calendar.MINUTE, 59);
                    sCalendar.set(Calendar.SECOND, 59);
                    String time = newdateFormat.format(sCalendar.getTime());
                    listWeekOrMonth.add(time);
                } else {
                    sCalendar.set(Calendar.HOUR_OF_DAY, 0);
                    sCalendar.set(Calendar.MINUTE, 0);
                    sCalendar.set(Calendar.SECOND, 0);
                    String time = dateFormat.format(sCalendar.getTime());
                    listWeekOrMonth.add(time);
                }
                bool = false;
            }
            sCalendar.add(Calendar.DAY_OF_MONTH, 1);// 加一天
        }
        Calendar newCalendar = eCalendar;
        listWeekOrMonth.add(olddateFormat.format(newCalendar.getTime()));
        if (listWeekOrMonth.size() % 2 != 0) {
            // 1月1号是个周日
            Date pDate = dateFormat.parse(startDate);
            Calendar pCalendar = Calendar.getInstance();
            pCalendar.setFirstDayOfWeek(Calendar.MONDAY);
            pCalendar.setTime(pDate);
            int week1 = pCalendar.get(Calendar.DAY_OF_WEEK) - 1;
            if (week1 == 0) {// 一年的第一天是周日
                String format = dateFormat.format(pCalendar.getTime());
                listWeekOrMonth.add(0,format);
            } else {
                listWeekOrMonth.add(dateFormat.format(eCalendar.getTime()));
            }
        }
        for (int g = 0; g < listWeekOrMonth.size(); g += 2) {
            String startTime = listWeekOrMonth.get(g);
            String endTime = listWeekOrMonth.get(g + 1);
            String time = startTime + "@" + endTime;
            resultlist.add(time);
        }
        return resultlist;
    }

运行结果
== [2023-01-01@2023-01-01, 2023-01-02@2023-01-08, 2023-01-09@2023-01-15, 2023-01-16@2023-01-22, 2023-01-23@2023-01-29, 2023-01-30@2023-02-05, 2023-02-06@2023-02-12, 2023-02-13@2023-02-19, 2023-02-20@2023-02-26, 2023-02-27@2023-03-05, 2023-03-06@2023-03-12, 2023-03-13@2023-03-19, 2023-03-20@2023-03-26, 2023-03-27@2023-04-02, 2023-04-03@2023-04-09, 2023-04-10@2023-04-16, 2023-04-17@2023-04-23, 2023-04-24@2023-04-30, 2023-05-01@2023-05-07, 2023-05-08@2023-05-14, 2023-05-15@2023-05-21, 2023-05-22@2023-05-28, 2023-05-29@2023-06-04, 2023-06-05@2023-06-11, 2023-06-12@2023-06-18, 2023-06-19@2023-06-25, 2023-06-26@2023-07-02, 2023-07-03@2023-07-09, 2023-07-10@2023-07-16, 2023-07-17@2023-07-23, 2023-07-24@2023-07-30, 2023-07-31@2023-08-06, 2023-08-07@2023-08-13, 2023-08-14@2023-08-20, 2023-08-21@2023-08-27, 2023-08-28@2023-09-03, 2023-09-04@2023-09-10, 2023-09-11@2023-09-17, 2023-09-18@2023-09-24, 2023-09-25@2023-10-01, 2023-10-02@2023-10-08, 2023-10-09@2023-10-15, 2023-10-16@2023-10-22, 2023-10-23@2023-10-29, 2023-10-30@2023-11-05, 2023-11-06@2023-11-12, 2023-11-13@2023-11-19, 2023-11-20@2023-11-26, 2023-11-27@2023-12-03, 2023-12-04@2023-12-10, 2023-12-11@2023-12-17, 2023-12-18@2023-12-24, 2023-12-25@2023-12-31] ==
日期格式可随意改动

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值