检查2个日期之间的时间是否与其他2个日期之间的时间相交

时间:2012-10-26 09:56:43

标签: objective-c nsdate

检查2个日期之间的任何地方是否在两个其他日期之间的任何地方相交,而不必检查日期之间的每一秒并检查第二个日期是否介于其他两个日期之间是什么有效的方法?

4 个答案:

答案 0 :(得分:1)

说你有: 时间t和时间间隔[a-b] [c-d],如果它们的排序方式如下:

  • a< d
  • a< B'/ LI>
  • c< d

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

答案 1 :(得分: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); 

答案 2 :(得分:1)

如果

,则两个时间间隔[a, b][c, d]具有非空交集
a <= d && c <= b

因此你可以检查

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

查看间隔是否有任何共同的值。

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

答案 3 :(得分:1)

  

检查2个日期之间是否有任何有效方法   在两个其他日期之间的任何地方相交,无需检查每个日期   在日期之间的第二个,并检查第二个是否介于两者之间   其他两个日期?

你这样做了。什么时候第一个间隔不与第二个间隔相交?

  • 当End1&lt; Start2(第一个间隔在第二个间隔开始之前结束)
  • 当Start1&gt; End2(第一个间隔在第二个间隔结束后开始)。

所以你想要

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

是假的:即你想要

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

是真的。

相关问题