1

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

4

4 回答 4

1

Your problem can be rephrased like this.

Check if any of two dates c1 and c2 are in between the two dates d1 and 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;

EDIT: alternatively,

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); 
于 2012-10-26T10:12:32.780 回答
1

两个区间[a, b]并且[c, d]有一个非空交点如果

a <= d && c <= b

因此你可以检查

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

看看这些区间是否有任何共同的价值。

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

于 2012-10-26T10:52:21.610 回答
1

假设您有: timet和 interval [a-b] [c-d],如果它们的排序如下:

  • 一<d
  • a < b
  • c < d

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

于 2012-10-26T10:08:36.947 回答
1

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

你用另一种方式来做。第一个区间何时不与第二个区间相交?

  • 当 End1 < Start2 时(第一个间隔在第二个开始之前结束)
  • 当 Start1 > End2 时(第一个间隔在第二个结束后开始)。

所以你要

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

是假的:即你想要

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

是真实的。

于 2012-10-26T11:01:27.497 回答