RT
例如:
第一段时间:2010-01-01到2011-01-01
第二段时间:2010-06-01到2011-06-01
求此两段时间的重合天数!!

解决方案 »

  1.   


    public class Test { public static void main(String[] args) throws ParseException { DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date d1Start = df.parse("2010-01-01");
    Date d1End = df.parse("2011-01-01");
    Date d2Start = df.parse("2010-06-01");
    Date d2End = df.parse("2011-06-01");

    System.out.println(calcOverlapDays(d1Start, d1End, d2Start, d2End));
    } public static int calcOverlapDays(Date range1Start, Date range1End,
    Date range2Start, Date range2End) { long range1StartTime = range1Start.getTime();
    long range1EndTime = range1End.getTime(); long range2StartTime = range2Start.getTime();
    long range2EndTime = range2End.getTime(); assert range1StartTime > range1EndTime;
    assert range2StartTime > range2EndTime; long overlapTime = Math.min(range1EndTime, range2EndTime)
    - Math.max(range1StartTime, range2StartTime); return (overlapTime < 0) ? 0
    : (int) (overlapTime / 24 / 60 / 60 / 1000 + 1);
    }
    }没有仔细仔细的测试
      

  2.   

     不知道能不能满足你的要求!
    //String time1_star = "2011-01-01";
    String time1_end = "2011-05-01";

    String time2_star = "2011-04-01";
    //String time2_end="2011-06-01";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    try {
    Date time1 =sdf.parse(time1_end);
    Date time2 =sdf.parse(time2_star);
    long diffDay= (time1.getTime()-time2.getTime())/(3600*1000*24);
    if(diffDay > 0){
    System.out.println("重合天数为:"+diffDay);
    }else{
    System.out.println("没有重合天数");
    }
    System.out.println(diffDay);
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
      

  3.   

    这里共有2个时间段(b1-----e1)【b2-----e2】,4个时间点;
    相当于两条线段(b代表起点,e代表端点,b<=e),4个端点。
    可分3种情况:
    1.不相交。(b1-----e1)【b2-----e2】(b1-----e1)。if(e1<b2||b1>e2)此时,重合天数为零。
    2.相交。
    情况一:(b1---【b2---e1)----e2】                 if(b1<b2&&e1<e2&&e1>b2)情况二:【b2---(b1---e2】----e1)    if(b1>b2&&b1<e2&&e2<e1)
    3.包含:计算较短的时间段日期长度。
    (b1---【b2-----e2】--e1)    if(b1<b2&&e1>e2)
    【b2---(b1-----e1)--e2】    if(b1>b2&&e1<e2)import java.util.Date;import com.friendone.base.utils.date.DateHelper;public class myDateUtil {
    /**
     * 计算两个日期的相差天数(d1-d2)
     * @param d1
     * @param d2
     * @return
     */
    public static String getDayDifference(Date d1,Date d2){
    StringBuffer ds = new StringBuffer();
    try{
    long num = (d1.getTime()-d2.getTime())/1000;
    long days  = num/(3600*24);
    if(days>0)ds.append(days);
    // long h = num/3600;
    // if(h > 0){
    // ds.append(h).append("小时");
    // num = num%3600;
    // }
    // long m = num/60;
    // if(m > 0){
    // ds.append(m).append("分钟");
    // num = num%60;
    // }
    // if(num > 0)
    // ds.append(num).append("秒");
    }catch(Exception e){
    ds=new StringBuffer("");
    e.printStackTrace();
    }
    return ds.toString();
    }


    /**
     *这里共有2个时间段(b1-----e1)【b2-----e2】,4个时间点;
     *相当于两条线段(b代表起点,e代表端点,b<=e),4个端点。
     *可分3种情况:
     *1.不相交。(b1-----e1)【b2-----e2】(b1-----e1)。if(e1<b2||b1>e2)此时,重合天数为零。
     *2.相交。
     *情况一:(b1---【b2---e1)----e2】          if(b1<b2&&e1<e2&&e1>b2)
     *情况二:【b2---(b1---e2】----e1)    if(b1>b2&&b1<e2&&e2<e1)
     *3.包含:计算较短的时间段日期长度。
     *(b1---【b2-----e2】--e1)    if(b1<b2&&e1>e2)
     *【b2---(b1-----e1)--e2】    if(b1>b2&&e1<e2)
     * @param begindate1 开始日期
     * @param enddate1      结束日期
     * @param begindate2开始日期
     * @param enddate2     结束日期
     * @return
     */
    public static String getDayCoincidence(Date begindate1,Date enddate1,Date begindate2,Date enddate2){
    long b1=begindate1.getTime();
    long e1=enddate1.getTime();
    long b2=begindate2.getTime();
    long e2=enddate2.getTime();
    assert(b1<e1&&b2<e2);
    String coincidenceday;
    if(b1<=b2&&e1>=e2){//(b1---【b2-----e2】--e1)
    System.out.println("1包含2");
    coincidenceday=getDayDifference(enddate2,begindate2);
    }else if(b1>=b2&&e1<=e2){//【b2---(b1-----e1)--e2】
    System.out.println("2包含1");
    coincidenceday=getDayDifference(enddate1,begindate1);
    }else if(b1>=b2&&b1<=e2&&e2<=e1){//【b2---(b1---e2】----e1)
    System.out.println("相交");
    coincidenceday=getDayDifference(enddate2,begindate1);
    }else if(b1<=b2&&e1<=e2&&e1>=b2){//(b1---【b2---e1)----e2】
    System.out.println("相交");
    coincidenceday=getDayDifference(enddate1,begindate2);
    }else if(e1<=b2||b1>=e2){
    coincidenceday="0";
    }else{
    coincidenceday="";
    System.out.println("意料外的日期组合,无法计算重合天数!");
    }
    System.out.println("重合天数为["+coincidenceday+"]天。");
    return coincidenceday;
    }

    }