2

我有一个数组event objects。该对象有几个属性。其中一个属性是NSDate eve_date.

现在我想检查该对象数组是否包含某个NSDate d

我正在做以下事情

if([[matches valueForKey:@"eve_date"] containsObject:d]){
        NSLog(@"contains object");
   }else{
    NSLog(@"does not contains object");
   }

但这不起作用。谁能帮我 ?

亲切的问候

编辑

好吧,让我更清楚一点。我正在制作一个日历应用程序。我获取了特定月份内的所有事件。我现在需要做的是在我的日历上标记正确的日期。因此我在一个函数中有这个。

NSLog(@"Delegate Range: %@ %@ %d",start,end,[start daysBetweenDate:end]);

    self.dataArray = [NSMutableArray array];
    self.dataDictionary = [NSMutableDictionary dictionary];

    NSDate *d = start;
    while(YES){
        for (Event *event in matches) {
            if([event.eve_date isEqualToDate:d]){
                //  (self.dataDictionary)[d] = save event title in here
                [self.dataArray addObject:@YES]; //place marker on date 'd'


            }else{
                [self.dataArray addObject:@NO]; // don't place marker
            }
        }


        NSDateComponents *info = [d dateComponentsWithTimeZone:calendar.timeZone];
        info.day++;
        d = [NSDate dateWithDateComponents:info];
        if([d compare:end]==NSOrderedDescending) break;
    }

但是现在我在我的一系列事件中循环了 31 次(一个月的休息天数)。(这可能不是最佳实践解决方案???)

我也认为问题在于日期的时间不一样。例如:

eve_date --> 2013-08-13 12:00
d --> 2013-08-13 15:00

所以我可能应该使用 NSDateformatter 只获取没有时间的日期本身?

我对么 ?

4

2 回答 2

5

我对KVC不是很精通,但是如果解决方案不需要使用KVC,你可以迭代:

NSDate *dateToCompare = ...;
BOOL containsObject = NO;
for (MyEvent *e in matches)
{
    if ([e.eve_date isEqualToDate:dateToCompare]) 
    { 
        containsObject = YES;
        break;
    }
}

if (containsObject) NSLog(@"Contains Object");
else NSLog(@"Doesn't contain object");

我玩过 KVC 并尝试了一个解决方案。你只是失踪valueForKeyPath而不是valueForKey

if ([[matches valueForKeyPath:@"eve_date"] containsObject:d])
{
    NSLog(@"Contains object");
}
else
{
    NSLog(@"Does not contain object");
}
于 2013-08-20T10:36:39.520 回答
0

NSDate是一个绝对时间点。要检查日期是否在给定日期,您必须将其与“一天的开始”和“第二天的开始”进行比较。

以下(伪)代码应演示该想法:

NSDate *start, *end; // your given range

NSDate *currentDay = "beginning of" start;
// while currentDay < end:
while ([currentDay compare:end] == NSOrderedAscending) {
    NSDate *nextDay = currentDay "plus one day";
    for (Event *event in matches) {
        // if currentDay <= event.eve_date < nextDay:
        if ([event.eve_date compare:currentDay] != NSOrderedAscending
            && [event.eve_date compare:nextDay] == NSOrderedAscending) {
            // ...
        }
    }
    currentDay = nextDay;
}

“一天的开始”可以计算如下:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *aDate = ...;
NSDate *beginningOfDay;
[cal rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfDay interval:NULL forDate:aDate];
于 2013-08-20T12:09:34.070 回答