如何判断日期交叉

kkun_3yue3 2008-08-01 02:44:21
如何判断日期交叉

已知,两个日期段,如2008-1-1至2008-1-10这是一个日期段,
另一个日期段为2008-1-5至2008-1-15
如何得出重复日期为2008-1-5至2008-1-10
多出来的部分为2008-1-10至2008-1-15
被删除的部分为2008-1-1至2008-1-5

如何设计这样的函数?
...全文
475 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
heliangtai 2008-08-01
  • 打赏
  • 举报
回复
经测试这是正确的两组数对比。兄弟你想多了
heliangtai 2008-08-01
  • 打赏
  • 举报
回复
修正了一下代码,刚才的代码有点bug:修正如下
public class TestNumber {

//判断两组数的关系
public String decodeNumber(int start1,int end1,int start2,int end2){
if(start1>end2||start2>end1){
return "相离";
}else if(start1<=start2&&end1>=end2){
return "包含,相交的部分为:"+bh(start1, end1, start2, end2);
}else{
return "两个数相交,相交的部分为:"+sj(start1, end1, start2, end2);
}
}

//相交
public static String sj(int start1,int end1,int start2,int end2){
String str=null;
if(start1<=start2){
str=start2+"到"+end1;
}else{
str=start1+"到"+end2;
}
return str;
}

//包含
public static String bh(int start1,int end1,int start2,int end2){
String str=null;
if(start1<=start2){
str=start2+"到"+end2;
}else{
str=start1+"到"+end1;
}
return str;
}

public static void main(String [] agrs){
TestNumber tn=new TestNumber();
//相交
String s=tn.decodeNumber(3, 10,1, 6);
//相离
String s2=tn.decodeNumber(1, 5, 15, 110);
//包含
String s3=tn.decodeNumber(1, 15, 10, 13);
System.out.println(s);
System.out.println(s2);
System.out.println(s3);

}
}
heliangtai 2008-08-01
  • 打赏
  • 举报
回复
你想复杂了,不管怎么样只有三种情况的;
kkun_3yue3 2008-08-01
  • 打赏
  • 举报
回复
1,现结束日期左移

原开始日期------------------------------原结束日期------------------------------
现开始日期----------现结束日期--------------------------------------------------

2,现结束日期右移

原开始日期------------------------------原结束日期------------------------------
现开始日期------------------------------------------------------------现结束日期

3,现开始日期,现结束日期右平移

原开始日期------------------------------原结束日期------------------------------
--------------------现开始日期----------------------------------------现结束日期

4,现开始日期,现结束日期继续右平移

原开始日期----------原结束日期--------------------------------------------------
----------------------------------------现开始日期--------------------现结束日期

5,现开始日期右移

--------------------原开始日期----------------------------------------原结束日期
----------------------------------------现开始日期--------------------现结束日期

6,现开始日期左移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期

7,现开始日期,现结束日期左平移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------现结束日期------------------------------

8,现开始日期,现结束日期继续左平移

----------------------------------------原开始日期--------------------原结束日期
现开始日期----------现结束日期--------------------------------------------------

9,现开始日期,现结束日期靠扰

原开始日期------------------------------------------------------------原结束日期
--------------------现开始日期--------------------现结束日期--------------------

10,现开始日期,现结束日期扩张

--------------------原开始日期--------------------原结束日期--------------------
现开始日期------------------------------------------------------------现结束日期

11,原开始日期,原结束日期与现开始日期,现结束日期相等

原开始日期------------------------------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期
heliangtai 2008-08-01
  • 打赏
  • 举报
回复
public class TestNumber {

public String decodeNumber(int start1,int end1,int start2,int end2){
//相离
if(start1>end2||start2>end1){
return "相离";
}else if(start1<=start2&&end1>=end2){
return "包含,相交的部分为:"+bh(start1, end1, start2, end2);
}else{
return "两个数相交,相交的部分为:"+sj(start1, end1, start2, end2);
}
}

//相交
public static String sj(int start1,int end1,int start2,int end2){
String str=null;
if(end1>start2){
str=start2+"到"+end1;
}else{
str=start1+"到"+end2;
}
return str;
}

//包含
public static String bh(int start1,int end1,int start2,int end2){
String str=null;
if(start1<=start2){
str=start1+"到"+end1;
}else{
str=start2+"到"+end2;
}
return str;
}

public static void main(String [] agrs){
TestNumber tn=new TestNumber();
String s=tn.decodeNumber(1, 6, 4, 10);
System.out.println(s);
}
}

这是两个数的判断,如果是两个日期还是先把日期转成数字吧。好像日期是可以比较大小的,只是我暂时忘了,不好意思。留给其它人的解决吧。
kkun_3yue3 2008-08-01
  • 打赏
  • 举报
回复
错了,一共11种情况


1,现结束日期左移

原开始日期------------------------------原结束日期------------------------------
现开始日期----------现结束日期--------------------------------------------------

2,现结束日期右移

原开始日期------------------------------原结束日期------------------------------
现开始日期------------------------------------------------------------现结束日期

3,现开始日期,现结束日期右平移

原开始日期------------------------------原结束日期------------------------------
--------------------现开始日期----------------------------------------现结束日期

4,现开始日期,现结束日期继续右平移

原开始日期----------原结束日期--------------------------------------------------
----------------------------------------现开始日期--------------------现结束日期

5,现开始日期右移

--------------------原开始日期----------------------------------------原结束日期
----------------------------------------现开始日期--------------------现结束日期

6,现开始日期左移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期

7,现开始日期,现结束日期左平移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------现结束日期------------------------------

8,现开始日期,现结束日期继续左平移

----------------------------------------原开始日期--------------------原结束日期
现开始日期----------现结束日期--------------------------------------------------

9,现开始日期,现结束日期靠扰

原开始日期------------------------------------------------------------原结束日期
--------------------现开始日期--------------------现结束日期--------------------

10,现开始日期,现结束日期扩张

--------------------原开始日期--------------------原结束日期--------------------
现开始日期------------------------------------------------------------现结束日期

11,原开始日期,原结束日期与现开始日期,现结束日期相等

原开始日期------------------------------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期
JerryBeckF 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 JerryBeckF 的回复:]
先判断有没有交叉,有,都取出来,排序一下就行了...明白吗
[/Quote]
判断不交叉条件只有2个:原开始日期大于现结束日期或者原结束日期小于现开始日期
取出来,按大小排序,从小到大,1-2被删除,2-3重叠,3-4新增...
kkun_3yue3 2008-08-01
  • 打赏
  • 举报
回复
就是给出两个日期段,返回三个日期段,分别为新增日期段,被删除日期段,重叠日期段,
kkun_3yue3 2008-08-01
  • 打赏
  • 举报
回复
有很多种情况呢,不知楼上大侠考虑没如


如是否能适应下述几种情况
1,现结束日期左移

原开始日期------------------------------原结束日期------------------------------
现开始日期----------现结束日期--------------------------------------------------

2,现结束日期右移

原开始日期------------------------------原结束日期------------------------------
现开始日期------------------------------------------------------------现结束日期

3,现开始日期,现结束日期右平移

原开始日期------------------------------原结束日期------------------------------
--------------------现开始日期----------------------------------------现结束日期

4,现开始日期右移

--------------------原开始日期----------------------------------------原结束日期
----------------------------------------现开始日期--------------------现结束日期

5,现开始日期左移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期

6,现开始日期,现结束日期左移

--------------------原开始日期----------------------------------------原结束日期
现开始日期------------------------------现结束日期------------------------------

7,现开始日期,现结束日期靠扰

原开始日期------------------------------------------------------------原结束日期
--------------------现开始日期--------------------现结束日期--------------------

8,现开始日期,现结束日期扩张

--------------------原开始日期--------------------原结束日期--------------------
现开始日期------------------------------------------------------------现结束日期

9,原开始日期,原结束日期与现开始日期,现结束日期相等

原开始日期------------------------------------------------------------原结束日期
现开始日期------------------------------------------------------------现结束日期
JerryBeckF 2008-08-01
  • 打赏
  • 举报
回复
这样吧,先判断有没有交叉,没有,都取出来,排序一下就行了
joynet007 2008-08-01
  • 打赏
  • 举报
回复
全部都取 其 毫秒为单位,在进行比较就可以了!!
heliangtai 2008-08-01
  • 打赏
  • 举报
回复
时间段A:start:2008-1-1 end :2008-1-10
时间段B: start:2008-1-5 and :2008-1-15
分析:A与B只可能出现三种情况:1、相交;2、相离;3、包含;
写一方法判断出A与B的关系。
如果是相交则相交的时间为:小时间的end->大时间的start
如果是包含则为:小时间的start->小时间的end
如果是相离则没有时间交叉。

问题分析至此可以得知问题的关键在于如何判断这两个时间段的关系。一会我试试看能否做出来,如果做出来把代码贴进进来。

我也是新手,呵呵
JerryBeckF 2008-08-01
  • 打赏
  • 举报
回复
这个没有技术含量,要把所有情况考虑进去,请自己多想想
JerryBeckF 2008-08-01
  • 打赏
  • 举报
回复
begindate1 begindate2
enddate1 enddate2

明白吧?

HashMap decodes(String b1,String e1,String b2,String e2)
{
if(b1>e2||b2>e1) //没有交集
{
if(b1>e2)
{
//你准备怎么办?
}
else
{
//你准备怎么办?
}
}
else
{
if(b1<=e2)
{
if(b1>=b2)
{
if(e1<=e2)
{
//交集是b1-e1
}
else
{
//交集是b1-e2
}
}
else
{
if(e1<=e2)
{
//交集是b2-e1
}
else
{
//交集是b2-e2
}
}
}
if(b2<=e1)
{
if(b2>=b1)
{
if(e1<=e2)
{
//交集是b2-e1
}
else
{
//交集是b2-e2
}
}
else
{
if(e1<=e2)
{
//交集是b1-e1
}
else
{
//交集是b1-e2
}
}
}
}


}
Fanny 2008-08-01
  • 打赏
  • 举报
回复
Date [] time_1 = new Date[2];
Date [] time_2 = new Date[2];

time_1[0] = new Date(java.sql.Timestamp.valueOf("2008-01-01 00:00:00").getTime());
time_1[1] = new Date(java.sql.Timestamp.valueOf("2008-01-10 00:00:00").getTime());

time_2[0] = new Date(java.sql.Timestamp.valueOf("2008-01-05 00:00:00").getTime());
time_2[1] = new Date(java.sql.Timestamp.valueOf("2008-01-15 00:00:00").getTime());

int overstep = time_2[1].getDate()-time_1[1].getDate();
int discarded = time_2[0].getDate()-time_1[0].getDate();
int iterant = time_1[1].getDate()-time_2[0].getDate();
Rinoajun 2008-08-01
  • 打赏
  • 举报
回复
比较两个开始日期,取大值
比较两个结束日期,取小值
hai2feng3 2008-08-01
  • 打赏
  • 举报
回复
我原来也遇见过
还没解决
学习
kkun_3yue3 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nKannan 的回复:]
你的日期如果保存的?
基本思想就是拆成年月日,一个一个域比过去了。
[/Quote]

两个字段保存,BeginDate,EndDate
希望能看到代码,,,,新手上路
nKannan 2008-08-01
  • 打赏
  • 举报
回复
你的日期如果保存的?
基本思想就是拆成年月日,一个一个域比过去了。

62,612

社区成员

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

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