合并时间段的算法

3 篇文章 0 订阅
package com.july.admin.vo;

import com.july.admin.util.DateUtil;
import org.apache.commons.lang.time.DateUtils;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author: july
 * @date: 2020/2/12 13:30
 * @description:
 */
public class ComputeDuration {

    List<Node> container = new LinkedList<>();

    private static long ONE_DAY=1000*3600*24;

    public boolean contains(Date start ,Date end){

        if(start.compareTo(end)>0){
            throw new RuntimeException("开始时间不能大于结束时间");
        }

        start = DateUtil.formatDate(start);
        end = DateUtil.formatDate(end);

        Node node = new Node(start,end);
        for (Node exist :container){
            if(node.start.compareTo(exist.start)>=0 && node.end.compareTo(exist.end)<0){
                return true;
            }
        }
        return false;
    }

    private void add (Date start ,Date end ){

        if(start.compareTo(end)>0){
            throw new RuntimeException("开始时间不能大于结束时间");
        }

        start = DateUtil.formatDate(start);
        end = DateUtil.formatDate(end);

        Node node = new Node(start,end);

        container= merge(node,container);
    }

    private List<Node> merge(Node node, List<Node> list) {
        for (Node exist: list){
            List<Node> others = list.stream().filter(x->!x.equals(exist)).collect(Collectors.toList());
            if(node.start.compareTo(exist.start)>=0 && node.end.compareTo(exist.end)<=0){
                return list;
            }
            if(node.start.compareTo(exist.start)<0 && node.end.compareTo(exist.start)>=0 && node.end.compareTo(exist.end)<=0){
                exist.start = node.start;
                return merge(exist,others);
            }
            if(node.start.compareTo(exist.start)>0 && node.start.compareTo(exist.end)<=0 && node.end.compareTo(exist.end)>=0){
                exist.end=node.end;
                return merge(exist,others);
            }
            if(node.start.compareTo(exist.start)<0 && node.end.compareTo(exist.end)>=0){
                exist.start = node.start;
                exist.end = node.end;
                return merge(exist,others);
            }
            if(node.start.getTime()-exist.end.getTime()>=0 && node.start.getTime()-exist.end.getTime()<=ONE_DAY){
                exist.end= node.end;
                return merge(exist,others);
            }


            if(exist.start.getTime()-node.end.getTime()>=0 && exist.start.getTime()-node.end.getTime()<=ONE_DAY){
                exist.start= node.start;
                return merge(exist,others);
            }
        }
        list.add(node);
        return list;
    }

    public static class Node{

        private Date start;
        private Date end;

        public Node(Date start, Date end) {
            this.start = start;
            this.end = end;
        }
    }


    public static void main(String[] args) {
        Date data1 =DateUtil.stringToDate("2020-01-01 12:01:00",DateUtil.DATE_TIME_PATTERN);
        Date data2 =DateUtil.stringToDate("2020-01-02 12:02:00",DateUtil.DATE_TIME_PATTERN);
        Date data3 =DateUtil.stringToDate("2020-01-03 12:03:00",DateUtil.DATE_TIME_PATTERN);
        Date data4 =DateUtil.stringToDate("2020-01-04 12:04:00",DateUtil.DATE_TIME_PATTERN);
        Date data5 =DateUtil.stringToDate("2020-01-05 12:05:00",DateUtil.DATE_TIME_PATTERN);
        Date data6 =DateUtil.stringToDate("2020-01-06 12:06:00",DateUtil.DATE_TIME_PATTERN);
        Date data7 =DateUtil.stringToDate("2020-01-07 12:07:00",DateUtil.DATE_TIME_PATTERN);
        Date data8 =DateUtil.stringToDate("2020-01-08 12:08:00",DateUtil.DATE_TIME_PATTERN);

        ComputeDuration duration = new ComputeDuration();
        duration.add(data1,data2);
        duration.add(data4,data6);
        duration.add(data5,data7);
        duration.add(data1,data2);

        System.out.println(duration.contains(data1,data7));
        System.out.println();
    }
}

 

package com.july.admin.util;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang.StringUtils;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author: july
 * @date: 2020/1/16 20:49
 * @description:
 */
public class DateUtil {

        /** 时间格式(yyyy-MM-dd) */
        public final static String DATE_PATTERN = "yyyy-MM-dd";
        /** 时间格式(yyyy-MM-dd HH:mm:ss) */
        public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
        public final static String FILE_RENAME_PATTERN = "yyyyMMddHHmmss";


        /**
         * 日期格式化 日期格式为:yyyy-MM-dd
         * @param date  日期
         * @return  返回yyyy-MM-dd格式日期
         */
        public static String format(Date date) {
            return format(date, DATE_PATTERN);
        }

        /**
         * 日期格式化 日期格式为:yyyy-MM-dd
         * @param date  日期
         * @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN
         * @return  返回yyyy-MM-dd格式日期
         */
        public static String format(Date date, String pattern) {
            if(date != null){
                SimpleDateFormat df = new SimpleDateFormat(pattern);
                return df.format(date);
            }
            return null;
        }

        /**
         * 字符串转换成日期
         * @param strDate 日期字符串
         * @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
         */
        public static Date stringToDate(String strDate, String pattern) {
            if (StringUtils.isBlank(strDate)){
                return null;
            }

            DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
            return fmt.parseLocalDateTime(strDate).toDate();
        }

        /**
         * 根据周数,获取开始日期、结束日期
         * @param week  周期  0本周,-1上周,-2上上周,1下周,2下下周
         * @return  返回date[0]开始日期、date[1]结束日期
         */
        public static Date[] getWeekStartAndEnd(int week) {
            DateTime dateTime = new DateTime();
            LocalDate date = new LocalDate(dateTime.plusWeeks(week));

            date = date.dayOfWeek().withMinimumValue();
            Date beginDate = date.toDate();
            Date endDate = date.plusDays(6).toDate();
            return new Date[]{beginDate, endDate};
        }

        /**
         * 对日期的【秒】进行加/减
         *
         * @param date 日期
         * @param seconds 秒数,负数为减
         * @return 加/减几秒后的日期
         */
        public static Date addDateSeconds(Date date, int seconds) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusSeconds(seconds).toDate();
        }

        /**
         * 对日期的【分钟】进行加/减
         *
         * @param date 日期
         * @param minutes 分钟数,负数为减
         * @return 加/减几分钟后的日期
         */
        public static Date addDateMinutes(Date date, int minutes) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusMinutes(minutes).toDate();
        }

        /**
         * 对日期的【小时】进行加/减
         *
         * @param date 日期
         * @param hours 小时数,负数为减
         * @return 加/减几小时后的日期
         */
        public static Date addDateHours(Date date, int hours) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusHours(hours).toDate();
        }

        /**
         * 对日期的【天】进行加/减
         *
         * @param date 日期
         * @param days 天数,负数为减
         * @return 加/减几天后的日期
         */
        public static Date addDateDays(Date date, int days) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusDays(days).toDate();
        }

        /**
         * 对日期的【周】进行加/减
         *
         * @param date 日期
         * @param weeks 周数,负数为减
         * @return 加/减几周后的日期
         */
        public static Date addDateWeeks(Date date, int weeks) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusWeeks(weeks).toDate();
        }

        /**
         * 对日期的【月】进行加/减
         *
         * @param date 日期
         * @param months 月数,负数为减
         * @return 加/减几月后的日期
         */
        public static Date addDateMonths(Date date, int months) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusMonths(months).toDate();
        }

        /**
         * 对日期的【年】进行加/减
         *
         * @param date 日期
         * @param years 年数,负数为减
         * @return 加/减几年后的日期
         */
        public static Date addDateYears(Date date, int years) {
            DateTime dateTime = new DateTime(date);
            return dateTime.plusYears(years).toDate();
        }

    public static Date formatDate(Date date) {
        Calendar calendar =Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        calendar.set(Calendar.MILLISECOND,0);
        return calendar.getTime();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值