日期范围与其他日期范围的重叠

时间:2013-02-03 09:23:52

标签: objective-c xcode4.5

晚安,

我试图通过比较日期范围来计算如何计算日期范围之间的天数。例如,我有三个给定的范围:

range_1 01/01/2001 to 01/01/2002
range_2 01/02/2002 to 01/01/2003
range_3 01/02/2003 to 01/01/2004

如果我将my_date_range 12/12/2001与01/05/2002与上述范围进行比较,结果应显示range_1和my_date_range之间有19天,range_2和my_date_range之间有5天,范围_3和my_date_range有0天。

在Excel中这很简单,我只想使用:

=SUMPRODUCT(ISNUMBER(MATCH(ROW(INDIRECT(A1&":"&B1)),ROW(INDIRECT($C$1&":"&$D$1)),0))*1)

其中A1和B1是用户输入的开始和结束日期,C1和D1是三个日期范围之一。然后我会使用相同的公式,并将A1和B1与第二个日期范围进行比较,然后是第三个日期范围。

但这又如何转化为客观-c? (我可以比较两个日期并获得它们之间的天数。)

2 个答案:

答案 0 :(得分:6)

首先,您必须将日期字符串转换为NSDate值:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM/dd/yyyy"];

NSDate *range1Start = [dateFormatter dateFromString:@"01/01/2001"];
NSDate *range1End   = [dateFormatter dateFromString:@"01/01/2002"];

NSDate *userStart   = [dateFormatter dateFromString:@"12/12/2001"];
NSDate *userEnd     = [dateFormatter dateFromString:@"01/05/2002"];

然后你可以计算重叠间隔:

NSDate *overlapFrom = [range1Start laterDate:userStart];
NSDate *overlapTo   = [range1End earlierDate:userEnd];

最后是重叠间隔的开始和结束日期之间的天数:

NSInteger days;
if ([overlapFrom compare:overlapTo] > 0) {
    // Date ranges do not overlap
    days = 0;
} else {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comp = [calendar components:NSDayCalendarUnit fromDate:overlapFrom toDate:overlapTo options:0];
    days = [comp day];
}
NSLog(@"%ld", (long)days);

在此示例中,输出为20,因为12/12/2001和01/01/2002之间的差异为20天。如果应计算重叠范围的开始日和结束日,则必须添加1

答案 1 :(得分:0)

一旦您有了马丁回答的开始/结束日期,就可以在intersection(with)上使用DateInterval函数:

let interval1 = DateInterval(start: start1, end: end1)
let interval2 =  DateInterval(start: start2, end: end2)
let intersection = interval1.insection(with: interval2)

如果您只想检查重叠部分,那么interval1.intersects(interval2)也很有帮助。