晚安,
我试图通过比较日期范围来计算如何计算日期范围之间的天数。例如,我有三个给定的范围:
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? (我可以比较两个日期并获得它们之间的天数。)
答案 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)
也很有帮助。