首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >NSPredicate:按NSDate属性的日期过滤对象

NSPredicate:按NSDate属性的日期过滤对象
EN

Stack Overflow用户
提问于 2009-12-27 14:07:57
回答 8查看 83.6K关注 0票数 125

我有一个具有NSDate属性的核心数据模型。我想按天过滤数据库。我假设解决方案将涉及NSPredicate,但我不确定如何将它们组合在一起。

我知道如何使用NSDateComponentsNSCalendar比较两个NSDate的日期,但是如何使用NSPredicate过滤它呢?

也许我需要在我的NSManagedObject子类上创建一个类别,它可以返回仅包含年、月和日的纯日期。然后我可以在NSPredicate中进行比较。这是你的建议,还是有更简单的建议?

EN

回答 8

Stack Overflow用户

发布于 2011-07-16 21:10:58

关于如何将startDate和endDate设置为上述给定答案的示例:

代码语言:javascript
复制
...

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth ) fromDate:[NSDate date]];
//create a date with these components
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:1];
[components setDay:0]; //reset the other components
[components setYear:0]; //reset the other components
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
predicate = [NSPredicate predicateWithFormat:@"((date >= %@) AND (date < %@)) || (date = nil)",startDate,endDate];

...

我在这里搜索了一个月内的所有条目。值得一提的是,这个例子还展示了如何搜索“nil”日期条目。

票数 64
EN

Stack Overflow用户

发布于 2016-10-09 21:27:58

日期的Swift 3.0扩展:

代码语言:javascript
复制
extension Date{

func makeDayPredicate() -> NSPredicate {
    let calendar = Calendar.current
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar.date(from: components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar.date(from: components)
    return NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
}
}

然后使用like:

代码语言:javascript
复制
 let fetchReq = NSFetchRequest(entityName: "MyObject")
 fetchReq.predicate = myDate.makeDayPredicate()
票数 11
EN

Stack Overflow用户

发布于 2015-05-27 21:36:42

在Swift中,我得到了类似的东西:

代码语言:javascript
复制
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"
        let date = dateFormatter.dateFromString(predicate)
        let calendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
        let components = calendar!.components(
            NSCalendarUnit.CalendarUnitYear |
                NSCalendarUnit.CalendarUnitMonth |
                NSCalendarUnit.CalendarUnitDay |
                NSCalendarUnit.CalendarUnitHour |
                NSCalendarUnit.CalendarUnitMinute |
                NSCalendarUnit.CalendarUnitSecond, fromDate: date!)
        components.hour = 00
        components.minute = 00
        components.second = 00
        let startDate = calendar!.dateFromComponents(components)
        components.hour = 23
        components.minute = 59
        components.second = 59
        let endDate = calendar!.dateFromComponents(components)
        predicate = NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])

我花了一段时间才发现在NSPredicate中字符串插值"\(this notation)"不能用于比较日期。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1965331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档