/** * 传入收据提报年月, 某个时间段内哪些时间没有提报收据 * @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未提交