Java实现免费时段计算

public static long getSpanHour(String string_time_in, String string_time_out, String string_free_start,
            String string_free_end) {
        try {
            // 包含的完整的免费时段次数
            int span_times = 0;
            // 跨天停车标识符
            boolean dayFlag = false;

            String date = string_time_in.substring(0, 10);
            string_free_start = date + " " + string_free_start;
            string_free_end = date + " " + string_free_end;

            // 驶入时间
            Timestamp time_in = Timestamp.valueOf(string_time_in);
            // 驶出时间
            Timestamp time_out = Timestamp.valueOf(string_time_out);

            long span_hour = (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000);

            // 超时停车标识符
            boolean overFlag = false;
            if ((time_out.getTime() - time_in.getTime()) % (60 * 60 * 1000) / (60 * 1000) > 5) {
                overFlag = true;
            }
            // 免费停车标识符
            boolean free = false;

            // 免费时段开始
            Timestamp free_start = Timestamp.valueOf(string_free_start);
            // 免费时段结束
            Timestamp free_end = Timestamp.valueOf(string_free_end);
            // 免费时段时长(小时)
            long span_free_hour = (free_end.getTime() - free_start.getTime()) / (60 * 60 * 1000) + 24;

            // 停车时间超过24小时,跨天停车标识符为true,减去一个免费时段时长
            long boundary = span_hour;
            while (boundary >= 24) {
                boundary -= 24;
                span_times++;
                dayFlag = true;
            }
            span_hour = span_hour - span_times * span_free_hour;

            // 时间转化为同一天进行计算剩余时长
            time_in.setYear(time_out.getYear());
            time_in.setMonth(time_out.getMonth());
            time_in.setDate(time_out.getDate());
            free_start.setYear(time_out.getYear());
            free_start.setMonth(time_out.getMonth());
            free_start.setDate(time_out.getDate());
            free_end.setYear(time_out.getYear());
            free_end.setMonth(time_out.getMonth());
            free_end.setDate(time_out.getDate());

            if (time_in.before(free_end) || time_in.after(free_start)) {// 免费时段驶入
                if (time_out.before(free_end) || time_out.after(free_start)) {// 免费时段驶出
                    overFlag = false;
                    if (dayFlag) {// 跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour -= (time_out.getTime() - time_in.getTime()) / (60 * 60 * 1000);
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            span_hour -= 24 - Math.ceil((time_in.getTime() - time_out.getTime()) / (60.0 * 60 * 1000));
                        } else {
                            // do nothing
                        }
                    } else {// 非跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour = 0;
                            free = true;
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            span_hour -= span_free_hour;
                        } else {
                            // do nothing
                        }
                    }
                } else {// 非免费时段驶出
                    if((time_out.getTime() - free_end.getTime()) % (60 * 60 * 1000) / (60 * 1000) <= 5) {
                        overFlag = false;
                    }
                    if (dayFlag) {// 跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000);
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000);
                        }
                    } else {// 非跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour -= (free_end.getTime() - time_in.getTime()) / (60 * 60 * 1000);
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            span_hour -= 24 - (time_in.getTime() - free_end.getTime()) / (60 * 60 * 1000);
                        }
                    }
                }
            } else {// 非免费时段驶入
                if (time_out.before(free_end) || time_out.after(free_start)) {// 免费时段驶出
                    if (dayFlag) {// 跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000);
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            // do nothing
                        }
                    } else {// 非跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            span_hour -= (time_out.getTime() - free_start.getTime()) / (60 * 60 * 1000);
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            // do nothing
                        }
                    }
                } else {// 非免费时段驶出
                    if (dayFlag) {// 跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            // do nothing
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            span_hour -= 24 - ((time_in.getTime() - time_out.getTime()) / (60 * 60 * 1000));
                            span_hour += (free_start.getTime() - time_in.getTime()) / (60 * 60 * 1000);
                            span_hour += (time_out.getTime() - free_end.getTime()) / (60 * 60 * 1000);
                        }
                    } else {// 非跨天停车
                        if (time_in.before(time_out)) {// 转化为一天后,驶入时间在驶出时间之前
                            // do nothing
                        } else if (time_in.after(time_out)) {// 转化为一天后,驶入时间在驶出时间之后
                            // do nothing
                        }
                    }
                }
            }

            // 超过5分钟按一小时
            if (overFlag) {
                span_hour++;
            }
            if (free || span_hour < 0) {
                span_hour = 0;
            }
            return span_hour;
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return 0;
    }

 

posted @ 2019-05-07 12:01  丶Fvck  阅读(360)  评论(0编辑  收藏  举报