判断多个时间段是否重叠,并取出重叠时间段

烙印寒冰 2015-05-17 12:14:28
问题是这样的,有多个时间段被查出来,要判断这几个时间段里面是不是有重叠,有的话要把重叠时间段返回。
比如:2010-01-01 到 2011-01-01
2010-05-01 到 2013-05-01
2010-01-01 到 2012-06-01
2008-07-01 到 2015-09-01
多个时间段是有重复时间的,应该返回重复时间为2010-05-01 到2011-01-01
...全文
2209 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
烙印寒冰 2015-05-17
  • 打赏
  • 举报
回复
万分感谢。。
  • 打赏
  • 举报
回复
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Main {

    public static void main(String[] args) throws ParseException {

        TimeBucket[] buckets = {
                new TimeBucket( "2010-01-01" , "2011-01-01" ),
                new TimeBucket( "2010-05-01" , "2013-05-01" ),
                new TimeBucket( "2010-01-01" , "2012-06-01" ),
                new TimeBucket( "2008-07-01" , "2015-09-01" )
            };

        TimeBucket union = TimeBucket.union( buckets );

        System.out.println( union );
    }

    public static final class TimeBucket {

        private static final ThreadLocal<DateFormat> FORMATS = new ThreadLocal<DateFormat>( ) {
            @Override
            protected DateFormat initialValue() {
                return new SimpleDateFormat( "yyyy-MM-dd" );
            }
        };

        private final Date start;

        private final Date end;

        public TimeBucket(Date start, Date end) {
            if ( start.after( end ) ) {
                throw new IllegalArgumentException( "time bucket is invalid" );
            }
            this.start = start;
            this.end = end;
        }

        public TimeBucket(String start, String end) throws ParseException {
            this( parse( start ) , parse( end ) );
        }

        public TimeBucket(long startTime, long endTime) {
            this( new Date( startTime ) , new Date( endTime ) );
        }

        public static TimeBucket union(TimeBucket... buckets) {
            if ( buckets == null || buckets.length == 0 ) {
                return null;
            }
            if ( buckets.length == 1 ) {
                return buckets[ 0 ];
            }
            long start = buckets[0].getStartTime( );
            long end = buckets[0].getEndTime( );
            for ( int i = 1 ; i < buckets.length ; i++ ) {
                if ( buckets[i].getStartTime( ) > start ) {
                    start = buckets[i].getStartTime( );
                }
                if ( buckets[i].getEndTime( ) < end ) {
                    end = buckets[i].getEndTime( );
                }
            }
            if ( start > end ) {
                return null;
            }
            return new TimeBucket( start , end );
        }

        public Date getStart() {
            return start;
        }

        public Date getEnd() {
            return end;
        }

        public long getStartTime() {
            return start.getTime( );
        }

        public long getEndTime() {
            return end.getTime( );
        }

        private static Date parse(String str) throws ParseException {
            return FORMATS.get( ).parse( str );
        }

        private static String format(Date str) {
            return FORMATS.get( ).format( str );
        }

        @Override
        public String toString() {
            return "startTime=" + format(start) + ", endTime=" + format(end);
        }
    }
}

startTime=2010-05-01, endTime=2011-01-01

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧