今天由NSDate排序NSArray

时间:2009-10-22 08:42:49

标签: iphone cocoa cocoa-touch core-data nsdate

我已从NSMutableArray中的核心数据加载项目。创建每个项目时,将给出用户选择的截止日期。

如何排序,只显示今天到期的项目?

这是我到目前为止所得到的:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"dueDate == %@", [NSDate date]];

[allObjectsArray filterUsingPredicate: predicate]; 

但是,此代码不起作用。

感谢您的任何建议

3 个答案:

答案 0 :(得分:12)

你今天在00:00然后明天在00:00计算,然后将谓词中的日期与那些(> =和<)进行比较。因此,所有日期对象必须在这两个日期内被归类为“今天”。这要求您最初只计算2个日期,无论您的数组中有多少个日期对象。

// Setup
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];

// Get todays year month and day, ignoring the time
NSDateComponents *comp = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:now];

// Components to add 1 day
NSDateComponents *oneDay = [[NSDateComponents alloc] init];
oneDay.day = 1;

// From date  & To date
NSDate *fromDate = [cal dateFromComponents:comp]; // Today at midnight
NSDate *toDate = [cal dateByAddingComponents:oneDay toDate:fromDate options:0]; // Tomorrow at midnight

// Cleanup
[oneDay release]

// Filter Mutable Array to Today
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"dueDate >= %@ && dueDate < %@", fromDate, toDate];
NSArray *filteredArray = [allObjectsArray filteredArrayUsingPredicate:predicate];

// Job Done!

答案 1 :(得分:1)

使用谓词的问题在于,如果他们使用标准日期比较,它将只返回与给定日期的日期时间完全相同的日期。如果你想要“今天”日期,你需要在某处添加一个-isToday方法(可能作为NSDate的扩展),如下所示:

-(BOOL)dateIsToday:(NSDate *)aDate {

    NSDate *now = [NSDate date];

    NSCalendar *cal = [NSCalendar currentCalendar];
    NSDateComponents *nowComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                                         fromDate:now];

    NSDateComponents *dateComponents = [cal components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                                          fromDate:aDate];

    return (([nowComponents day] == [dateComponents day]) &&
        ([nowComponents month] == [dateComponents month]) && 
        ([nowComponents year] == [dateComponents year]));

}

一旦你拥有了它,就很容易找到今天的那些:

NSMutableArray *itemsDueToday = [NSMutableArray array];

for (MyItem *item in items) {
    if ([self dateIsToday:[item date]) {
        [itemsDueToday addObject:item];
    }
}

// Done!

答案 2 :(得分:0)

方法-filterUsingPredicate:仅适用于可变数组(类型为NSMutableArray)。

请尝试使用-filteredArrayUsingPredicate:方法:

NSString *formattedPredicateString = [NSString stringWithFormat:@"dueDate == '%@'", [NSDate date]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:formattedPredicateString];
NSArray *filteredArray = [allObjectsArray filteredArrayUsingPredicate:predicate];