2012-10-26 97 views

回答

1

假设你有: 时间t和间隔[a-b] [c-d],如果他们进行排序,如:

  • 一个< d
  • 一个< b
  • Ç< d

然后你可以检查t是内部b和c,并且检查是否b> C,则整个事情是真的,否则 - 不。 作为一个快速的视线,我还没有想到更好的东西,然后全面检查他们是否没有排序。

1

你的问题可以改写这个样子。

检查两个日期c1和c2中的任何日期是否在两个日期d1和d2之间。

// assuming d1 is before d2 
BOOL intersects = 
    ([d1 compare:c1] == NSOrderedAscending && 
    [d2 compare:c1] == NSOrderedDescending) 
    || 
    ([d1 compare:c2] == NSOrderedAscending && 
    [d2 compare:c2] == NSOrderedDescending) 
    || [d1 compare:c1] == NSOrderedEqual 
    || [d1 compare:c2] == NSOrderedEqual 
    || [d2 compare:c1] == NSOrderedEqual 
    || [d2 compare:c2] == NSOrderedEqual; 

编辑:可替代地,

NSTimeInterval i = [d2 timeIntervalSinceDate:d1]; 
NSTimeInterval c1i = [c1 timeIntervalSinceDate:d1]; 
NSTimeInterval c2i = [c2 timeIntervalSinceDate:d1]; 
BOOL intersects = (c1i >= 0 && c1i <= i) || (c2i >= 0 && c2i <= i); 
1

两个间隔[a, b][c, d]具有如果

a <= d && c <= b 
因此

可以检查一个非空交集

[a compare:d] <= 0 && [c compare:b] <= 0 

,看看间隔有任何共同的价值。

(这里我假设间隔有序,即a <= bc <= d

1

什么是检查是否随时随地日期间的2 交叉等之间的任意2个日期没有一种有效的方法必须检查日期之间的每个 秒,并检查第二个是否在 其他两个日期之间?

你这样做的另一种方式。第一个间隔何时与第二个间隔不相交?

  • 当END1 < START2(第二开始之前所述第一时间间隔结束)
  • 当START1> END2(第二已结束之后的第一时间间隔开始)。

所以,你要

End1 < Start2 OR Start1 > End2 // Condition of non-intersection 

是假的:即你想

End1 >= Start2 AND Start1 <= End2 // Negation of above 

为true。