3

晚上好,

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

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 天,range_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 与第二个日期范围进行比较,然后是第三个。

但这如何翻译成objective-c?(我能够比较两个日期并获得它们之间的天数。)

4

2 回答 2

8

首先,您必须将日期字符串转换为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如果应该计算重叠范围的开始日和结束日,则必须添加。

于 2013-02-03T11:00:38.837 回答
1

根据 Martin 的回答确定开始/结束日期后,您可以使用以下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)

于 2019-08-04T17:27:05.380 回答