2017-02-22 96 views
0

我有一个应用程序,其中包含多个时间条目,并将日期另存为NSDate。使用NSPredicate过滤fetchRequest年/月

我想使用一个获取请求来筛选我从别的地方获得的某个年份和月份。我如何使用NSPredicate过滤一年和一个月?

let predicate = NSPredicate(format: "%K == %D && %K == %D", ???, selectedMonth, ???, selectedYear) 

更新

使用帮助Raki酒指出,我想出了下面的代码:

var dateComp = DateComponents() 
dateComp.year = Int(selectedYear) 
dateComp.month = Int(selectedMonth) 
dateComp.day = 1 

let calendar = Calendar.current 
let firstDayOfTheMonth = calendar.date(from: dateComp) 

var oneMonth = DateComponents() 
oneMonth.month = 1 
let beginningOfNextMonth = calendar.date(byAdding: oneMonth, to: firstDayOfTheMonth!) 

和谓词:

let predicate = NSPredicate(format: "date >= %@ AND date < %@", firstDayOfTheMonth as! CVarArg, beginningOfNextMonth as! CVarArg) 

我得到一个SIGABRT与以下消息:

Could not cast value of type 'Foundation.Date' (0x1073a0ae0) to 'Swift.CVarArg' (0x1196851c8). 

Xcode建议我加“as! CVarArg”

更新2

下断言现在的工作:

let predicate = NSPredicate(format: "%K >= %@ && %K < %@", "date", firstDayOfTheMonth! as NSDate, "date", beginningOfNextMonth! as NSDate) 
+0

什么是您保存日期的格式? – raki

+0

我正在使用NSDate。在CoreData中键入'Date'。 – sidetrax

+0

它可能有所帮助:http://stackoverflow.com/questions/13262567/how-to-build-a-nspredicate-filtering-all-days-in-a-month-using-nsdate – raki

回答

0

你不能断言这个样子,但你可以创建你的月和一年两Dates其开始月份的一天,

现在你需要简单地这样预测:

let predicate = NSPredicate(format: "%K >= %@ && %K <= %@", "DateAttribute", startDateOfMonth as NSDate, "DateAttribute", endDateOfMonth as NSDate) 

编辑:如果你不知道如何为startDateOfMonthendDateOfMonth创建日期,那么你可以使用DateComponents创建它。

let selectedMonth = 11 
let selectedYear = 2015 
var components = DateComponents() 
components.month = selectedMonth 
components.year = selectedYear 
let startDateOfMonth = Calendar.current.date(from: components) 

//Now create endDateOfMonth using startDateOfMonth 
components.year = 0 
components.month = 1 
components.day = -1 
let endDateOfMonth = Calendar.current.date(byAdding: components, to: startDate!) 
+0

感谢您的帮助。我只是在输入时自己创建了它:P但我喜欢components.day = -1。不知道。 – sidetrax

+0

@ user7259583现在工作吗,你会得到想要的结果吗? –

+0

@ user7259583检查编辑后的答案,并使用谓词类型将“Date”转换为“NSDate”。像'startDateOfMonth as NSDate'' –

相关问题