传入收据提报年月,某个时间段内哪些时间没有提报收据,传入list存入的格式(2017.01-2019.05)

/**
 * 传入收据提报年月, 某个时间段内哪些时间没有提报收据 
 * @param list 收据提报时间段 格式为(2017.01-2019.05)
 */
public static void getDifferentTimePeriods(List<String> list) {
    // 存放2017年9月至本年度12月 台账应该存放信息
    List<String> tzYear = new ArrayList<String>();
    Set set = new LinkedHashSet();
    // 收据提报字符串拼接信息
    String sjInfo = "";

    try {
        // 格式化时间格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
        SimpleDateFormat dateYear = new SimpleDateFormat("yyyy-MM");
        // 创建住房台账开始年月
        Date sDate = dateFormat.parse("2017-09");
        Calendar sCalendar = Calendar.getInstance();
        sCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        sCalendar.setTime(sDate);
        // 创建住房台账 本年最后一个月
        Date eDate = dateFormat.parse(dateYear.format(new Date())+"-12");
        Calendar eCalendar = Calendar.getInstance();
        eCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        eCalendar.setTime(eDate);
        // 循环添加
        boolean bool = true;
        while(sCalendar.getTime().getTime() < eCalendar.getTime().getTime()){
            if(bool||sCalendar.get(Calendar.DAY_OF_MONTH) == 1||sCalendar.get(Calendar.DAY_OF_MONTH) == sCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)){
                tzYear.add(dateFormat.format(sCalendar.getTime()));
                bool = false;
            }
            sCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        // 添加到list
        tzYear.add(dateFormat.format(eCalendar.getTime()));
        if(tzYear.size() % 2 != 0){
            tzYear.add(dateFormat.format(eCalendar.getTime()));
        }
        // 去重
        set.addAll(tzYear);
        tzYear= new ArrayList<>();
        tzYear.addAll(set);
        // 获取到剩余月份
        List<String> isExit = getIsExit(tzYear, list);

        if(isExit.size() > 0){
            // 定义下标,每次循环加一
            int index = 0;
            String sYear = "";
            String sMouth = "";
            String eYear = "";
            String eMouth = "";
            for (String s : isExit) {
                // 每次循环加一
                index ++;
                // 分割字符串 获取年份和月份
                String[] split = s.split("-");
                // 判断是否有值,没有值就赋值
                if(sYear == "" && sMouth == ""){
                    // 初始化数据
                    sYear = split[0];
                    sMouth = split[1];
                    eYear = split[0];
                    eMouth = split[1];
                }else{
                    //  如果年份一致,并且 月份加一等一本次的收据提报月份
                    if(sYear.equals(split[0]) && (Integer.parseInt(eMouth)+1) == Integer.parseInt(split[1])){
                       // 设置收据提报结束时间
                        eYear = split[0];
                        eMouth = split[1];
                    }else if(sYear.equals(split[0]) && (Integer.parseInt(eMouth)+1 ) != Integer.parseInt(split[1])){
                       //同年不同月
                        if(sYear.equals(eYear) && sMouth.equals(eMouth)){
                            sjInfo+=sYear+"-"+sMouth+"未提交  ";

                        }else{
                            sjInfo+=sYear+"-"+sMouth+"至"+eYear+"-"+eMouth+"未提交  ";
                        }
                        // 重新给收据提报开始时间赋值
                        sYear = split[0];
                        sMouth = split[1];
                        eYear = split[0];
                        eMouth = split[1];
                    }else if(!sYear.equals(split[0]) && (Integer.parseInt(eMouth)+1) != Integer.parseInt(split[1])){
                        // 不同年不同月
                        if(sYear.equals(eYear) && sMouth.equals(eMouth)){
                            sjInfo+=sYear+"-"+sMouth+"未提交  ";

                        }else{
                            sjInfo+=sYear+"-"+sMouth+"至"+eYear+"-"+eMouth+"未提交  ";
                        }
                        // 重新给收据提报开始时间赋值
                        sYear = split[0];
                        sMouth = split[1];
                        eYear = split[0];
                        eMouth = split[1];
                    }
                    if(index == isExit.size()){
                        if((Integer.parseInt(eMouth)) == Integer.parseInt(split[1])){
                            if(sYear.equals(eYear) && sMouth.equals(eMouth)){
                                sjInfo+=sYear+"-"+sMouth+"未提交  ";

                            }else{
                                sjInfo+=sYear+"-"+sMouth+"至"+eYear+"-"+eMouth+"未提交  ";
                            }
                            System.out.println(sjInfo);
                        }
                    }
                }
            }
        }
        System.out.println(sjInfo);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

/**
 *  获取住房收据提报 年月
 * @param tzYear 应该存在的收据
 * @param list 本次提交的收据以及住房台账中所有以获取的收据
 * @return
 */
public static List<String> getIsExit(List<String>tzYear,List<String> list) throws ParseException{

    // 存放2017年9月至本年度12月
    List<String> MonthNum = new ArrayList<String>();
    Set set = new LinkedHashSet();
    // 格式化时间格式
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM");
    SimpleDateFormat dateM = new SimpleDateFormat("yyyy-MM");
    for (String s : list) {
        String[] split = s.split("-");
        // 创建住房台账开始年月
        Date sDate = dateFormat.parse(split[0]);
        Calendar sCalendar = Calendar.getInstance();
        sCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        sCalendar.setTime(sDate);
        // 创建住房台账 本年最后一个月
        Date eDate = dateFormat.parse(split[1]);
        Calendar eCalendar = Calendar.getInstance();
        eCalendar.setFirstDayOfWeek(Calendar.MONDAY);
        eCalendar.setTime(eDate);
        // 循环获取住房救助收据提报 时间
        boolean bool = true;
        while(sCalendar.getTime().getTime() < eCalendar.getTime().getTime()){
            if(bool||sCalendar.get(Calendar.DAY_OF_MONTH) == 1||sCalendar.get(Calendar.DAY_OF_MONTH) == sCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)){
                MonthNum.add(dateM.format(sCalendar.getTime()));
                bool = false;
            }
            sCalendar.add(Calendar.DAY_OF_MONTH, 1);
        }
        MonthNum.add(dateM.format(eCalendar.getTime()));
        if(MonthNum.size() % 2 != 0){
            MonthNum.add(dateM.format(eCalendar.getTime()));
        }
    }
    set.addAll(MonthNum);
    MonthNum= new ArrayList<>();
    MonthNum.addAll(set);

    // 遍历已存在的 提报收据
    for (String mu : MonthNum) {
        // 如果有相同的则删除(迭代遍历)
        Iterator<String> iterator = tzYear.iterator();
        while (iterator.hasNext()) {
            String s = iterator.next();
            if (mu.equals(s)) {
                iterator.remove();//使用迭代器的删除方法删除
            }
        }
    }

    return tzYear;
}

public static void main(String[] args) {
    ArrayList<String> s = new ArrayList<>();
    s.add("2017.01-2019.05");
    s.add("2020.01-2020.03");
    s.add("2020.05-2020.07");
    s.add("2021.01-2021.06");
    getDifferentTimePeriods(s);
}

最后的结果为

2019-06至2019-12未提交  2020-04未提交  2020-08至2020-12未提交  2021-07至2021-12未提交  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值