注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

比较两个日期间隔是否有碰撞的工具类,判断两个时间区间是否有交集(单位天) Java  

2013-04-16 17:08:56|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
比较两个日期间隔是否有碰撞的工具类,判断两个时间区间是否有交集(单位天)


/**
 * 
 */
package com.shijing.date;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 比较两个日期间隔是否有碰撞的工具类
 * @author wanggang
 *
 */
public class Test {
    // 比较两个日期相差的天数 相对日期来查
    public static long getDistDatesExt(Date startDate, Date endDate) {
        long totalDate = 0;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStartString = format.format(startDate);
        String dateEndString = format.format(endDate);
        StringBuffer sb1 = new StringBuffer();
        StringBuffer sb2 = new StringBuffer();
        sb1.append(dateStartString).append(" 00:00:00");
        sb2.append(dateEndString).append(" 00:00:00");
        try {
            startDate = sdf.parse(sb1.toString());
            endDate = sdf.parse(sb2.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        long timestart = startDate.getTime();
        long timeend = endDate.getTime();
        totalDate = Math.abs((timeend - timestart)) / (1000 * 60 * 60 * 24);
        return totalDate;
    }
    /**
     * 比较两个日期是不是在同一个自然天内
     *
     * @param date1 第一个日期
     * @param date2 第二个日期
     * @return true 在 false 不在
     */
    public static boolean checkThisDay(Date date1, Date date2) {
        if (date1 == null || date2 == null) return false;
        SimpleDateFormat formatTime = new SimpleDateFormat("yyyyMMdd");
        return formatTime.format(date1).equals(formatTime.format(date2));
    }
public static class DateInterval{
private Date startDate;
private Date endDate;
private List<Date> intervalDate = new ArrayList<Date>();
private DateInterval(Date startDate, Date endDate) {
super();
this.startDate = startDate;
this.endDate = endDate;
this.init();
}
private void init(){
if(startDate == null || endDate == null){
throw new IllegalArgumentException("param error");
}
if(startDate.after(endDate)){
throw new IllegalArgumentException("param error");
}
intervalDate.add(startDate);
long distDatesExt = getDistDatesExt(startDate,endDate);
Calendar c = Calendar.getInstance();
for(int i=1;i < distDatesExt; i++){
c.setTime(startDate);
c.add(Calendar.DAY_OF_MONTH, i);
intervalDate.add(c.getTime());
}
intervalDate.add(endDate);
}

public Date getStartDate() {
return startDate;
}

public Date getEndDate() {
return endDate;
}

public List<Date> getIntervalDate() {
return intervalDate;
}
public boolean contain(DateInterval dateInterval){
List<Date> thisIntervalDate = this.getIntervalDate();
List<Date> otherIntervalDate = dateInterval.getIntervalDate();
for(Date thisD:thisIntervalDate){
for(Date otherD:otherIntervalDate){
if(checkThisDay(thisD,otherD)){
return true;
}
}
}
return false;
}
public boolean edgeSame(DateInterval dateInterval){
if(checkThisDay(this.getStartDate(),dateInterval.getStartDate())
&& checkThisDay(this.getEndDate(),dateInterval.getEndDate())){
return true;
}
return false;
}
/**
 * 判断两个DateInterval单元的首尾端点是否相隔指定时间
 * 
 * @param dateInterval
 * @param intervalDay 两个日期相隔几天
 * @return
 */
public boolean edgeInvCheck(DateInterval dateInterval,int intervalDay){
if(getDistDatesExt(this.getEndDate(),dateInterval.getStartDate()) <intervalDay){
return false;
}
if(getDistDatesExt(this.getStartDate(),dateInterval.getEndDate()) <intervalDay){
return false;
}
return true;
}
}
public static List<DateInterval> getTestDate(){
List<DateInterval> list = new ArrayList<DateInterval>();
DateInterval di = new DateInterval(new Date(2013-1900,4-1,15),new Date(2013-1900,4-1,17));

list.add(di);
DateInterval di2 = new DateInterval(new Date(2013-1900,4-1,13),new Date(2013-1900,4-1,14));

list.add(di2);
di2 = new DateInterval(new Date(2013-1900,4-1,13),new Date(2013-1900,4-1,14));

list.add(di2);
di2 = new DateInterval(new Date(2013-1900,4-1,11),new Date(2013-1900,4-1,12));

list.add(di2);
di2 = new DateInterval(new Date(2013-1900,4-1,11),new Date(2013-1900,4-1,12));

list.add(di2);
di2 = new DateInterval(new Date(2013-1900,4-1,11),new Date(2013-1900,4-1,12));

list.add(di2);
return list;
}
public static void print(List<DateInterval> list){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
for(DateInterval di:list){
System.out.println("***********************************************");
for(Date d :di.getIntervalDate()){
System.out.println("di:"+df.format(d));
}
}
System.out.println("========================================");
}
/***
 * 如果时间开始结束时间相同返回true,
 * 如果时间间隔1天返回true
 * 如果时间有重叠返回false;
 * @param listTocheck
 * @param diToCheck
 * @return
 */
public static boolean check(List<DateInterval> listTocheck,DateInterval diToCheck){
boolean edgeSame = false;
boolean otherCheck = true;
for(DateInterval di:listTocheck){
System.out.println("edgeSame:"+diToCheck.edgeSame(di));
System.out.println("contain:"+diToCheck.contain(di));
System.out.println("edgeInvCheck:"+diToCheck.edgeInvCheck(di, 1));
System.out.println("unit check ret:"+(diToCheck.edgeSame(di) || (!diToCheck.contain(di) && diToCheck.edgeInvCheck(di, 1))));
if(diToCheck.edgeSame(di)){
edgeSame =  true;
}
boolean check = !diToCheck.contain(di) && diToCheck.edgeInvCheck(di, 1);
if(!check){
otherCheck = false;
}
}
return edgeSame || otherCheck;
}
/**
 * @param args
 */
public static void main(String[] args) {
List<DateInterval> listTocheck =  getTestDate();
print(listTocheck);
DateInterval di = new DateInterval(new Date(2013-1900,4-1,17),new Date(2013-1900,4-1,18));
System.out.println("************final ret:"+check(listTocheck,di));
di = new DateInterval(new Date(2013-1900,4-1,11),new Date(2013-1900,4-1,12));
System.out.println("************final ret:"+check(listTocheck,di));
di = new DateInterval(new Date(2013-1900,4-1,13),new Date(2013-1900,4-1,14));
System.out.println("************final ret:"+check(listTocheck,di));
}
}


运行结果:
***********************************************
di:2013-04-15
di:2013-04-16
di:2013-04-17
***********************************************
di:2013-04-13
di:2013-04-14
***********************************************
di:2013-04-13
di:2013-04-14
***********************************************
di:2013-04-11
di:2013-04-12
***********************************************
di:2013-04-11
di:2013-04-12
***********************************************
di:2013-04-11
di:2013-04-12
========================================
edgeSame:false
contain:true
edgeInvCheck:false
unit check ret:false
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
************final ret:false
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:true
contain:true
edgeInvCheck:true
unit check ret:true
edgeSame:true
contain:true
edgeInvCheck:true
unit check ret:true
edgeSame:true
contain:true
edgeInvCheck:true
unit check ret:true
************final ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:true
contain:true
edgeInvCheck:true
unit check ret:true
edgeSame:true
contain:true
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
edgeSame:false
contain:false
edgeInvCheck:true
unit check ret:true
************final ret:true
  评论这张
 
阅读(2552)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016