我有一个具有NSDate
属性的核心数据模型。我想按天过滤数据库。我假设解决方案将涉及NSPredicate
,但我不确定如何将它们组合在一起。
我知道如何使用NSDateComponents
和NSCalendar
比较两个NSDate
的日期,但是如何使用NSPredicate
过滤它呢?
也许我需要在我的NSManagedObject
子类上创建一个类别,它可以返回仅包含年、月和日的纯日期。然后我可以在NSPredicate
中进行比较。这是你的建议,还是有更简单的建议?
发布于 2011-07-16 21:10:58
关于如何将startDate和endDate设置为上述给定答案的示例:
...
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”日期条目。
发布于 2016-10-09 21:27:58
日期的Swift 3.0扩展:
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:
let fetchReq = NSFetchRequest(entityName: "MyObject")
fetchReq.predicate = myDate.makeDayPredicate()
发布于 2015-05-27 21:36:42
在Swift中,我得到了类似的东西:
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)"
不能用于比较日期。
https://stackoverflow.com/questions/1965331
复制相似问题