java求两个时间段的重合天数,急!

st380109693 2011-05-06 11:07:33
RT
例如:
第一段时间:2010-01-01到2011-01-01
第二段时间:2010-06-01到2011-06-01
求此两段时间的重合天数!!
...全文
375 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shy_snow 2011-11-14
  • 打赏
  • 举报
回复
这里共有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;
}

}
  • 打赏
  • 举报
回复
先判断是否重合,然后取较大的开始日期,较小的结束日期
ypb137154098 2011-05-06
  • 打赏
  • 举报
回复
不知道能不能满足你的要求!


//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();
}
ypb137154098 2011-05-06
  • 打赏
  • 举报
回复
给个思路,将第一段时间的末时间与第二段时间的开始时间取差,通过差值计算重合天数!
leisore 2011-05-06
  • 打赏
  • 举报
回复

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);
}
}

没有仔细仔细的测试
st380109693 2011-05-06
  • 打赏
  • 举报
回复
wwscjtcaaaa 2011-05-06
  • 打赏
  • 举报
回复
?迷糊迷糊。。。。2010.6.1 和 2011.1.1 两天算不算 迷糊。。。
st380109693 2011-05-06
  • 打赏
  • 举报
回复
曰,这编辑器自动换行了
比如:
时间段1: ___________________________
时间段2: 。。。____________________________
。。。。。。。。| 求此段时间天数 |

表达的够清楚了吧!!!
st380109693 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 inhibitory 的回复:]

什么叫做重合的天数?
[/Quote]

比如:
时间段1: ___________________________
时间段2: ____________________________
| 求此段时间天数 |

表达的够清楚了吧!!!
Inhibitory 2011-05-06
  • 打赏
  • 举报
回复
什么叫做重合的天数?
zr167173 2011-05-06
  • 打赏
  • 举报
回复
没有试过、我想思路是这样的:
首先比较年是不是重合的,如果是那么比较月,在比较天数。
计算出每个月的天数加起来就可以了。这方法比较笨。
不知道对LZ有木有用.

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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