NSPredicate 与 NSDate 按 day/month 过滤但不是年份
NSPredicate with NSDate filtering by day/month but not year
我需要创建一个谓词,它需要使用 NSDate 对象 属性 creationDate
过滤对象列表。我想获取具有相同日期和月份但不同年份的对象列表。实际上,我想要过去发生在今天(如 day/month)的对象。我怎样才能创建这个谓词?例如:今天是 2016 年 7 月 27 日,我想要创建日期为 7 月 27 日的所有对象。
首先,从日期中提取日和月...
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
接下来,(一种方式)构建谓词...
[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary * bindings) {
// object must be cast to the type of object in the list
MyObject *myObject = (MyObject *)object;
NSDate *creationDate = myObject.creationDate;
// do whatever you want here, but this block must return a BOOL
}];
将这些想法放在一起...
- (NSPredicate *)predicateMatchingYearAndMonthInDate:(NSDate *)date {
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
return [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary * bindings) {
MyObject *myObject = (MyObject *)object;
NSDate *creationDate = myObject.creationDate;
NSDateComponents *creationComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:creationDate];
NSInteger creationDay = [creationComponents day];
NSInteger creationMonth = [creationComponents month];
return day == creationDay && month == creationMonth;
}];
}
就是这样。使用数组中要匹配的 NSDate
谁的日期和月份构建谓词,然后 运行 数组中的谓词 (filteredArrayUsingPredicate:
).
NSDate *today = [NSDate date];
NSPredicate *predicate = [self predicateMatchingYearAndMonthInDate:today];
NSArray *objectsCreatedToday = [myArray filteredArrayUsingPredicate:predicate];
这里是 Swift 版本:
import Photos
func predicateMatchingYearAndMonth(in date: Date?) -> NSPredicate? {
var components: DateComponents? = nil
if let date = date {
components = Calendar.current.dateComponents([.day, .month, .year], from: date)
}
let day = components?.day
let month = components?.month
return NSPredicate { (date:Any?, [String : Any]?) -> Bool in
var creationDate:Date?
var creationComponents: DateComponents? = nil
if let date = date as? PHAsset {
creationDate = date.creationDate
}
if let creationDate = creationDate {
creationComponents = Calendar.current.dateComponents([.day, .month, .year], from: creationDate)
}
let creationDay: Int? = creationComponents?.day
let creationMonth: Int? = creationComponents?.month
return day == creationDay && month == creationMonth
}
}
我需要创建一个谓词,它需要使用 NSDate 对象 属性 creationDate
过滤对象列表。我想获取具有相同日期和月份但不同年份的对象列表。实际上,我想要过去发生在今天(如 day/month)的对象。我怎样才能创建这个谓词?例如:今天是 2016 年 7 月 27 日,我想要创建日期为 7 月 27 日的所有对象。
首先,从日期中提取日和月...
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
接下来,(一种方式)构建谓词...
[NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary * bindings) {
// object must be cast to the type of object in the list
MyObject *myObject = (MyObject *)object;
NSDate *creationDate = myObject.creationDate;
// do whatever you want here, but this block must return a BOOL
}];
将这些想法放在一起...
- (NSPredicate *)predicateMatchingYearAndMonthInDate:(NSDate *)date {
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:date];
NSInteger day = [components day];
NSInteger month = [components month];
return [NSPredicate predicateWithBlock:^BOOL(id object, NSDictionary * bindings) {
MyObject *myObject = (MyObject *)object;
NSDate *creationDate = myObject.creationDate;
NSDateComponents *creationComponents = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:creationDate];
NSInteger creationDay = [creationComponents day];
NSInteger creationMonth = [creationComponents month];
return day == creationDay && month == creationMonth;
}];
}
就是这样。使用数组中要匹配的 NSDate
谁的日期和月份构建谓词,然后 运行 数组中的谓词 (filteredArrayUsingPredicate:
).
NSDate *today = [NSDate date];
NSPredicate *predicate = [self predicateMatchingYearAndMonthInDate:today];
NSArray *objectsCreatedToday = [myArray filteredArrayUsingPredicate:predicate];
这里是 Swift 版本:
import Photos
func predicateMatchingYearAndMonth(in date: Date?) -> NSPredicate? {
var components: DateComponents? = nil
if let date = date {
components = Calendar.current.dateComponents([.day, .month, .year], from: date)
}
let day = components?.day
let month = components?.month
return NSPredicate { (date:Any?, [String : Any]?) -> Bool in
var creationDate:Date?
var creationComponents: DateComponents? = nil
if let date = date as? PHAsset {
creationDate = date.creationDate
}
if let creationDate = creationDate {
creationComponents = Calendar.current.dateComponents([.day, .month, .year], from: creationDate)
}
let creationDay: Int? = creationComponents?.day
let creationMonth: Int? = creationComponents?.month
return day == creationDay && month == creationMonth
}
}