java算法,根据时间(时分)段,判断是否在时间段内(时长)。

实体类 TtbWorkResultTable只需要设置俩个字段 descr,workDate.

 /**
     * @param workResultTables workDateStr以及他前一天的日期的班表
     * @param workDateStr      申请的日期
     * @param beginTime
     * @param endTime
     * @return
     */
    public static List<Map<String, String>> theDaysKuaTian(List<TtbWorkResultTable> workResultTables, String workDateStr, String beginTime, String endTime) {

        try {
            List<Map<String, String>> valueResult = new ArrayList<>();
            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
            List<String> kuatianduan = new ArrayList<>();
            List<String> buKuatianduan = new ArrayList<>();
            TtbWorkResultTable nowWorkTable = null;
            TtbWorkResultTable yestDateTable = null;
            for (TtbWorkResultTable workResultTable : workResultTables) {
                if (DateUtils.getYesterday(workDateStr).equals(workResultTable.getWorkDate())) {
                    yestDateTable = workResultTable;
                    /*判断当前日期的前一天日期的跨天工作时间是否和当前的开始结束时间有重叠*/
                    if (StringUtils.isNotEmpty(workResultTable.getDescr())) {
                        String[] timeStrS = workResultTable.getDescr().split(" ");
                        for (String timeStr : timeStrS) {
                            String[] time = timeStr.split("-");
                            kuatianduan.add(time[0]);
                            kuatianduan.add(time[1]);
                        }
                    }
                }
                if (workDateStr.equals(workResultTable.getWorkDate())) {
                    if (StringUtils.isNotEmpty(workResultTable.getDescr())) {
                        nowWorkTable = workResultTable;
                        String[] timeStrS = workResultTable.getDescr().split(" ");
                        for (String timeStr : timeStrS) {
                            String[] time = timeStr.split("-");
                            buKuatianduan.add(time[0]);
                            buKuatianduan.add(time[1]);
                        }
                    }
                }
            }
            String timeKuaYeDuan = whetherAcrossDay(kuatianduan, yestDateTable);
            /*判断前一天是否是跨天*/
            if (timeKuaYeDuan != null) {/*表示有跨天数据*/
                /*先求跨天下半夜和时长的交集数据*/
                Long timeValue = 0L;
                String[] timeStrS = timeKuaYeDuan.split(" ");/*取出上班时间段*/
                timeValue = getaLong(beginTime, endTime, sdf, timeValue, timeStrS);
                if (timeValue != 0L) {
                    Map<String, String> value = new HashMap<>();
                    value.put("workDate", yestDateTable.getWorkDate());
                    value.put("timeLong", timeValue.toString());
                    value.put("timeDescr", timeKuaYeDuan);
                    valueResult.add(value);
                }
            }

            /*判断当天数据是否有交集数据*/
            if (nowWorkTable != null) {
                /*获取不跨天的班表*/
                String timeJinTianDuan = whetherAcrossDayBu(buKuatianduan, nowWorkTable);
                if (StringUtils.isNotEmpty(timeJinTianDuan)) {
                    Long timeValue = 0L;
                    String[] timeStrS = timeJinTianDuan.split(" ");/*取出上班时间段*/
                    timeValue = getaLong(beginTime, endTime, sdf, timeValue, timeStrS);
                    if (timeValue != 0L) {
                        Map<String, String> value = new HashMap<>();
                        value.put("workDate", nowWorkTable.getWorkDate());
                        value.put("timeLong", timeValue.toString());
                        value.put("timeDescr", timeJinTianDuan);
                        valueResult.add(value);
                    }
                }
            }
            return valueResult;
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    private static String whetherAcrossDayBu(List<String> descrs, TtbWorkResultTable nowWorkTable) {
        String time = null;
        for (int i = 0; i < descrs.size() - 1; i++) {
            String time1 = descrs.get(i);
            String time2 = descrs.get(i + 1);
            if (time1.compareTo(time2) > 0) {
                time = time1;
            }
        }
        if (time != null && nowWorkTable != null) {
            StringBuilder times = new StringBuilder();
            /*表示这段班表有跨天,取出没有跨天的数据*/
            Integer m = null;
            String timeKuaTian = null;
            String descr = nowWorkTable.getDescr();
            String[] timeStrS = descr.split(" ");
            for (int i = 0; i < timeStrS.length; i++) {
                String timeStr = timeStrS[i];
                if (timeStr.contains(time)) {
                    m = i;
                    timeKuaTian = timeStr;
                }
            }
            if (m != null) {
                for (int i = 0; i < m; i++) {
                    if (!timeStrS[m].equals(timeKuaTian)) {
                        times.append(timeStrS[m]).append(" ");
                    }
                }

                /*对于跨天时段的分析*/
                String[] timeDian = timeKuaTian.split("-");
                if (timeDian[0].equals(time)) { /*根跟23:59切割*/
                    times.append(time).append("-23:59");
                } else {/*表示跨天时间段和00:00点没有关系*/
                    times.append(timeKuaTian);
                }
                return times.toString();
            } else {
                return nowWorkTable.getDescr();
            }
        }
        return nowWorkTable.getDescr();
    }

    private static Long getaLong(String beginTime, String endTime, SimpleDateFormat sdf, Long timeValue, String[] timeStrS) throws ParseException {
        for (String timeStr : timeStrS) {
            String[] time = timeStr.split("-");
            if (beginTime.compareTo(time[0]) >= 0 && endTime.compareTo(time[1]) <= 0) {/*开始时间大于时间段的开始时间 且 结束时间小于当前时段的结尾时间   表示开始时间在此时刻内*/
                return DateUtils.getDatesHour(sdf.parse(endTime), sdf.parse(beginTime));
            }
            if (beginTime.compareTo(time[0]) >= 0 && endTime.compareTo(time[1]) >= 0 && beginTime.compareTo(time[1]) < 0) {
                Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(time[1]), sdf.parse(beginTime));
                timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
            }
            if (beginTime.compareTo(time[0]) <= 0 && endTime.compareTo(time[1]) <= 0 && endTime.compareTo(time[0]) > 0) {
                Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(endTime), sdf.parse(time[0]));
                timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
            }
            if (beginTime.compareTo(time[0]) < 0 && endTime.compareTo(time[1]) > 0) {
                Long timeValueBuFen = DateUtils.getDatesHour(sdf.parse(time[1]), sdf.parse(time[0]));
                timeValue = DateUtils.longAdd(timeValue, timeValueBuFen);
            }
        }
        return timeValue;
    }

    private static String whetherAcrossDay(List<String> kautianduan, TtbWorkResultTable yestDateTable) {
        String time = null;
        for (int i = 0; i < kautianduan.size() - 1; i++) {
            String time1 = kautianduan.get(i);
            String time2 = kautianduan.get(i + 1);
            if (time1.compareTo(time2) > 0) {
                time = time2;
            }
        }
        if (time != null && yestDateTable != null) {
            StringBuilder times = new StringBuilder();
            /*表示这段班表有跨天*/
            Integer m = null;
            String timeKuaTian = null;
            String descr = yestDateTable.getDescr();
            String[] timeStrS = descr.split(" ");
            for (int i = 0; i < timeStrS.length; i++) {
                String timeStr = timeStrS[i];
                if (timeStr.contains(time)) {
                    m = i;
                    timeKuaTian = timeStr;
                }
            }
            if (m != null) {
                /*对于跨天时段的分析*/
                String[] timeDian = timeKuaTian.split("-");
                if (timeDian[0].equals(time)) {/*表示跨天时间段和00:00点没有关系*/
                    times.append(timeKuaTian).append(" ");
                } else {/*根跟00:00切割*/
                    times.append("00:00-").append(time).append(" ");
                }

                for (int i = m; i < timeStrS.length; i++) {
                    if (!timeStrS[m].equals(timeKuaTian)) {
                        times.append(timeStrS[m]).append(" ");
                    }
                }
                return times.deleteCharAt(times.length() - 1).toString();
            }
        }
        return null;

    }

出参为一个list
这个方法的意思就是。如果传入俩天的排班时间,那么当我在申请调休(其他日程也可)。那么如果我的排班是跨天。那么需要将申请当前的工作时间,以及前一天跨天的工作时间取出。并且将申请的时间和班表的重合时间算出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值